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

相关推荐
M_emory_12 分钟前
解决 git clone 出现:Failed to connect to 127.0.0.1 port 1080: Connection refused 错误
前端·vue.js·git
Ciito15 分钟前
vue项目使用eslint+prettier管理项目格式化
前端·javascript·vue.js
成都被卷死的程序员1 小时前
响应式网页设计--html
前端·html
mon_star°1 小时前
将答题成绩排行榜数据通过前端生成excel的方式实现导出下载功能
前端·excel
Zrf21913184551 小时前
前端笔试中oj算法题的解法模版
前端·readline·oj算法
文军的烹饪实验室2 小时前
ValueError: Circular reference detected
开发语言·前端·javascript
Martin -Tang3 小时前
vite和webpack的区别
前端·webpack·node.js·vite
迷途小码农零零发3 小时前
解锁微前端的优秀库
前端
王解4 小时前
webpack loader全解析,从入门到精通(10)
前端·webpack·node.js
我不当帕鲁谁当帕鲁4 小时前
arcgis for js实现FeatureLayer图层弹窗展示所有field字段
前端·javascript·arcgis