如何使用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 构建工具)

相关推荐
小马虎本人几秒前
如果接口返回的数据特别慢?要怎么办?难道就要在当前页面一直等吗
前端·react.js·aigc
蓝胖子的多啦A梦4 分钟前
npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚
前端·npm·node.js
LinCC76 分钟前
在Vite中构建项目出错-Top-level await is not available in the configured target environme
前端
用户882093216677 分钟前
如何优雅拆分一个充斥十几种逻辑的 SDK 回调函数?
前端
Momoly089 分钟前
vue3+el-table 利用插槽自定义数据样式
前端·javascript·vue.js
唯有选择9 分钟前
让你的应用界面好看的基石:Flutter主题Theme使用和扩展自定义字段
前端·flutter
山有木兮木有枝_9 分钟前
告别布局间隙:浮动(float)在网页排版中的高阶应用
前端
满分观察网友z11 分钟前
vue的<router-link>的to里面的query和params的区别
前端
小约翰仓鼠11 分钟前
vue3表格使用Switch 开关
前端·javascript·vue.js
JiangJiang13 分钟前
🔥 面试官:Webpack 为什么能热更新?你真讲得清吗?
前端·面试·webpack