Rust: 基于 napi-rs 开发 Node.js 原生模块
Rust: 基于 napi-rs 开发 Node.js 原生模块
文章目录
- Rust: 基于 napi-rs 开发 Node.js 原生模块
- 完整代码示例
- 背景 & napi
- 环境/工具链准备
- 创建项目
- 打包 & 测试
- 参考链接
完整代码示例
https://github.com/superfreeeee/Blog-code/tree/main/back_end/rust/rust_napi_rs_test
背景 & napi
作为前端人都知道 V8 引擎以及在此之上的 Node.js 的出现,改写了 JavaScript 这门语言的命运。JS 不再只能运行在浏览器上,与此相关的工具链也蓬勃发展。
不过作为 web 开发的工程师或许比较少接触到所谓的 C++ 模块,充其量就是基于 Node.js 对外暴露的 API 来写点工程化相关的胶水代码。
实际上 Node.js 除了在 JS 的层级上提供了众多内置模块之外,还提供了一层称为 n-api 的 C++ 级别的抽象接口层,我们可以通过 napi 编写一个 C++ 模块直接在更底层的位置调用 Node.js 的 API。
但是老实说作者就是一个 C++ 菜鸡,也不是特别喜欢用 C++ 写东西。因此今天要带给大家的是基于 napi-rs 框架,使用 Rust 语言编写来编写并编译成原生模块。
Let‘s go
环境/工具链准备
首先是环境准备,不用说 rust 相关的编译器肯定是要整好的,rustc
、cargo
等工具就不多说了,自己上官网一次整好吧
传送门:Rust 官网
(可选)除此之外,还有就是在全局装一个 @napi-rs/cli
,该框架提供了一个类似脚手架的命令行工具,用于创建基础项目框架
pnpm i -g @napi-rs/cli
这里要用 npm、yarn、pnpm 都随便,就不多说了
创建项目
基础工具链都装好之后,就可以来创建项目啦,使用 napi new
然后选择适合自己的配置选项(其实也没几个)
创建好之后我们可以看到一个预先配置好的模版,有 napi 构建项目的入口
build.rs
extern crate napi_build;fn main() {napi_build::setup();
}
然后是作为三方库时候的主入口 lib.rs
/src/lib.rs
#![deny(clippy::all)]#[macro_use]
extern crate napi_derive;#[napi]
pub fn sum(a: i32, b: i32) -> i32 {a + b
}
甚至连测试用的测试用例也给我们准备好了
/__test__/index.spec.mjs
import test from 'ava'import { sum } from '../index.js'test('sum from native', (t) => {t.is(sum(1, 2), 3)
})
打包 & 测试
接下来我们只要运行 pnpm build
运行 build 指令就会开始构建啦
运行完成之后我们会在根目录下面看到三个新文件
index.d.ts
第一个是我们打包出来之后的库函数的类型定义
index.js
第二个则是用于磨平平台差异的 binding 用的代码
第三个 xxx.node
则是 Rust 代码经过编译,将 napi 调用一同编译过后生成的类似动态运行库,副档名 .node
说明是专属于 Node.js 的原生模块,其实本质上就是 MacOS 下 .dylib
或是 Windows 下 .dll
的动态库文件
最后都编译完成之后,我们就可以运行 pnpm test
测试一下功能是否正常
整体体验上还是非常丝滑。虽然还没有真正用上 napi 暴露出来的 Node.js 的底层 API,但是光是能够接入 Rust 语言这一步就能看得出来真实投入使用时候的潜力。
参考链接
Title | Link |
---|---|
从暴力到 NAN 再到 NAPI——Node.js 原生模块开发方式变迁 | https://cnodejs.org/topic/5957626dacfce9295ba072e0 |
napi-rs | https://napi.rs/ |
Install Rust - Rust | https://www.rust-lang.org/tools/install |
napi-rs - Github | https://github.com/napi-rs/napi-rs |
Rust: 基于 napi-rs 开发 Node.js 原生模块相关推荐
- JavaScript之后端Web服务器开发Node.JS基本模块学习篇
JavaScript之后端Web服务器开发Node.JS基本模块学习篇 基本模块 fs文件系统模块 stream支持流模块 http crypto加密模块 基本模块 因为Node.js是运行在服务区端 ...
- 如何开发 Node.js Native Add-on?
简介: 来一起为 Node.js 的 add-on 生态做贡献吧~ 作者 | 吴成忠(昭朗) 这篇文章是由 Chengzhong Wu (@legendecas),Gabriel Schulhof ( ...
- 零基础开发 Node.js Addons 插件:参数与返回值处理
上一篇回顾 零基础开发 Node.js Addons 插件:Hello Node-API.本篇介绍使用 Node-API 为 Node.js 开发基于 C 的 Addons 时,如何接收与处理 Nod ...
- 基于阿里云的 Node.js 稳定性实践
前言 如果你看过 2018 Node.js 的用户报告,你会发现 Node.js 的使用有了进一步的增长,同时也出现了一些新的趋势. Node.js 的开发者更多的开始使用容器并积极的拥抱 Serve ...
- 模块加载及第三方包:Node.js模块化开发、系统模块、第三方模块、package.json文件、Node.js中模块的加载机制、开发环境与生产环境、cookie与session
1.Node.js模块化开发 1.1 JavaScript开发弊端 JavaScript 在使用时存在两大问题,文件依赖和命名冲突. 1.2 软件中的模块化开发 一个功能就是一个模块,多个模块可以组成 ...
- 在Visual Studio上开发Node.js程序
在Visual Studio上开发Node.js程序 原文:在Visual Studio上开发Node.js程序 [题外话] 最近准备用Node.js做些东西,于是找找看能否有Visual Studi ...
- api怎么写_使用Node.js原生API写一个web服务器
Node.js是JavaScript基础上发展起来的语言,所以前端开发者应该天生就会一点.一般我们会用它来做CLI工具或者Web服务器,做Web服务器也有很多成熟的框架,比如Express和Koa.但 ...
- 在Visual Studio上开发Node.js程序(2)——远程调试及发布到Azure
[题外话] 上次介绍了VS上开发Node.js的插件Node.js Tools for Visual Studio(NTVS),其提供了非常方便的开发和调试功能,当然很多情况下由于平台限制等原因需要在 ...
- 基于 Go 语言开发 Serverless 云原生应用
Golang 无疑是云原生领域开发的首选开发语言,继 Docker.Kubernetes 等大作之后 Knative 又是一个基于 Go 语言的云原生范式.Knative 提供了一整套云原生应用的 S ...
最新文章
- 将jar文件做成exe可运行文件
- UVA - 1388 Graveyard 【数学】
- 树莓派 无法安装mysql_树莓派安装mysql
- 关于c语言编写 单项链表 的创建、插入、修改、删除、显示、退出 的程序案例
- 李楠:《流浪地球》抄的经典套路 但这不是贬低
- ZooKeeper集群部署方式
- 怎么看待苹果公司要求分成微信、知乎打赏32%?
- Apache下域名虚拟主机在个人主页目录上实现过程
- HTML5 新属性的讲解
- 黑马程序员pink老师前端入门教程,零基础必看的JavaScript基础语法视频教程(jQuery2)
- pthread 立即停止线程_pthread_create线程终止问题
- uni-app--微信小程序自定义tabbar
- 义隆单片机学习笔记之(三) 应用例程
- java+上传文件夹
- 按键精灵电脑版对接百度ai,告别字库(文字识别篇)
- mybatisplus sql 改写2
- 秒 毫秒 微秒 纳秒 皮秒
- 【FFmpeg】做一个抖音/快手视频模板常用哪些功能
- 全球首个华纳兄弟酒店正式营业,《老友记》喷泉、全新蝙蝠侠战车亮相
- RocketMQ的name server启动源码总结
热门文章
- 三星s2 硬刷Android 8,六年老机吃上奥利奥:第三方三星S2安卓8.0刷机包发布
- stm32使用AD转换读取光敏电阻的值(光敏电阻5516)
- 第一章 初步认识数据透视表
- 基于最小二乘法的——线性回归拟合(一)
- js中转json数组常用方法
- Windows系统安装虚拟机以及Linux系统
- Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context
- [数学建模(四)]MATLAB神经网络工具箱的简单应用
- 关于Synaptics.exe感染型病毒
- 事业单位人力资源开发中的职业发展分析