如何使用Napi-RS 开发nodejs插件

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 构建工具)

相关推荐
mCell30 分钟前
GSAP ScrollTrigger 详解
前端·javascript·动效
gnip30 分钟前
Node.js 子进程:child_process
前端·javascript
excel4 小时前
为什么在 Three.js 中平面能产生“起伏效果”?
前端
excel5 小时前
Node.js 断言与测试框架示例对比
前端
天蓝色的鱼鱼6 小时前
前端开发者的组件设计之痛:为什么我的组件总是难以维护?
前端·react.js
codingandsleeping6 小时前
使用orval自动拉取swagger文档并生成ts接口
前端·javascript
石金龙7 小时前
[译] Composition in CSS
前端·css
白水清风7 小时前
微前端学习记录(qiankun、wujie、micro-app)
前端·javascript·前端工程化
Ticnix7 小时前
函数封装实现Echarts多表渲染/叠加渲染
前端·echarts
用户22152044278007 小时前
new、原型和原型链浅析
前端·javascript