Napi-RS是什么?
napi-rs是一个使用Rust构建预编译Nodejs插件的框架 ,通过这个框架我们可以使用Rust来编写我们自己的原生Nodejs 插件。
在开始之前,需要我们提前在本机安装好rust的开发环境,rust官网 即可安装 安装完成之后使用
js
rustc --version
检测是否安装成功。
初始化一个新项目
实测需要node版本>= 18.12.0
sql
pnpm add -g @napi-rs/cli 全局安装 @napi-rs/cli 模块 使用napi new 初始化一个项目。
输入项目名称和生成的文件夹目录以及选择你的插件想要支持的平台(包含Linux 和macos 以及windows平台)
输入 a 可以选择所有平台
看你的需求是否需要选择ci发布。
最后成功生成项目
项目开发
进入项目 yarn 安装依赖
安装完成之后可以使用yarn build 来构建第一个本地的包。
yarn build 之后会项目中生成一个index.js文件,
该文件主要用于适配我们在不同平台上加载使用Rust编写的node插件的二进制文件。
这样我们在本地环境或者第三方环境就可以访问到我们编写的插件了。
使用yarn build 时会自动调用项目目录下的build.rs 文件,然后再使用Cargo build,来编译我们写在src/lib.rs里面的rust代码 ,我们后续的rust代码核心逻辑也是主要写在这个地方。
Rust侧代码
src/lib.rs -> 目前我们生成的项目中默认帮我们生成了一个很简单的rust代码。
rust
#![deny(clippy::all)]
#[macro_use]
extern crate napi_derive;
#[napi]
pub fn sum(a: i32, b: i32) -> i32 {
a + b
}
当我们使用 yarn build 之后会默认帮我们编译导出成兼容cjs和esm规范的二进制代码文件包。 本地调用时会加载我们项目根目录下生成的二进制文件。
eg: 新建一个test.mjs文件
内容如下
js
import { sum } from './index.js'
console.log(sum(30,100))
node test.mjs -> 则可以正确的看到我们最终输出的结果。
同时我们也可以再lib.rs文件中添加其他的rust代码。
rust
#[napi]
pub fn concatenate_strings(s1: String, s2: String) -> String {
let result = format!("{}{}", s1, s2);
result
}
重新yarn build 编译,可以看到我们重新生成了index.js文件,并且更新了代码。
js
const { sum, concatenateStrings } = nativeBinding
我们的类型文件也重新更新了。
js
export function sum(a: number, b: number): number
export function concatenateStrings(s1: string, s2: string): string
之后我们可以本地调试看是否可以成功调用我们新增的rust代码, 发现也是没有问题的。
js
import { sum , concatenateStrings } from './index.js'
console.log(sum(30,100))
console.log(concatenateStrings('Hello','World'))
130
HelloWorld
更多的关于编写更高级的rust代码的功能可以参考rust官网和napi-rs官网。
如何发布
首先创建自己的npm公共作用域 napi rename 重命名刚刚创建的项目 如果发布napi-rs 包需要添加远程git url 仓库地址 重命名项目名称为公共作用域下自己定义的名称 eg: @tangtaue/xxx 之后
初始化 git 仓库 添加远程地址 提交代码 修改版本号 继续push 变动。
js
npm init --scope=@xxx
napi rename
git init
git remote add origin 你的远程仓库地址
git add .
git commit -m "你的描述"
git push
最终发布
js
npm version patch
git push --follow-tags
最后
主要阐述了如何使用napi-rs 这个框架 来使用rust 创建和开发我们自己的基于rust 的前端开发工具库。 一些更高级的操作需要有一定的rust 基础才能够开发出自己满意的node插件。
一些可能会用到的相关链接如下:
www.rust-lang.org/ rust官网
napi.rs/docs/introd... napi-rs官网
www.rspack.dev/ rspack 官网 (基于 Rust 的高性能 Web 构建工具)