安装 @napi-rs/cli
bashnpm install -g @napi-rs/cli
创建项目
bashnapi new my-project
写入以下内容到
my-project/src/lib.rs 文件:
rust#![deny(clippy::all)] use image::codecs::png::{CompressionType, FilterType, PngEncoder}; use image::Luma; use qrcode::{EcLevel, QrCode}; #[macro_use] extern crate napi_derive; #[napi] pub fn sum(a: i32, b: i32) -> i32 { a + b } #[napi] pub fn generate_qr_code(text: String) -> Result<Vec<u8>, napi::Error> { let qr = QrCode::with_error_correction_level(&text, EcLevel::L) .map_err(|e| napi::Error::new(napi::Status::Unknown, e.to_string()))?; let img_buf = qr.render::<Luma<u8>>().min_dimensions(200, 200).build(); let mut encoded_buf = Vec::with_capacity(512); let encoder = PngEncoder::new_with_quality( &mut encoded_buf, CompressionType::Default, FilterType::NoFilter, ); img_buf .write_with_encoder(encoder) .map_err(|e| napi::Error::new(napi::Status::Unknown, e.to_string()))?; Ok(encoded_buf) }
编译项目
bashcd my-project npm run build
使用项目
创建文件test.js
javascriptconst express = require('express'); const utils = require('./index.js'); // 确保 index.js 中有 sum 和 generateQrCode 方法 const app = express(); const PORT = 3000; // 设置一个 API 接口生成 QR 码 app.get('/qrcode', (req, res) => { try { const data = utils.generateQrCode('https://www.google.com'); const buffer = Buffer.from(data); const base64Image = buffer.toString('base64'); const dataUrl = `data:image/png;base64,${base64Image}`; res.json({ qrcode: dataUrl }); } catch (error) { console.error(error); res.status(500).json({ error: '生成 QR 码时出错' }); } }); // 启动服务器 app.listen(PORT, () => { console.log(`服务正在运行,监听端口 ${PORT}`); });
运行项目
bashnode test.js