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 相关的编译器肯定是要整好的,rustccargo 等工具就不多说了,自己上官网一次整好吧

传送门: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 原生模块相关推荐

  1. JavaScript之后端Web服务器开发Node.JS基本模块学习篇

    JavaScript之后端Web服务器开发Node.JS基本模块学习篇 基本模块 fs文件系统模块 stream支持流模块 http crypto加密模块 基本模块 因为Node.js是运行在服务区端 ...

  2. 如何开发 Node.js Native Add-on?

    简介: 来一起为 Node.js 的 add-on 生态做贡献吧~ 作者 | 吴成忠(昭朗) 这篇文章是由 Chengzhong Wu (@legendecas),Gabriel Schulhof ( ...

  3. 零基础开发 Node.js Addons 插件:参数与返回值处理

    上一篇回顾 零基础开发 Node.js Addons 插件:Hello Node-API.本篇介绍使用 Node-API 为 Node.js 开发基于 C 的 Addons 时,如何接收与处理 Nod ...

  4. 基于阿里云的 Node.js 稳定性实践

    前言 如果你看过 2018 Node.js 的用户报告,你会发现 Node.js 的使用有了进一步的增长,同时也出现了一些新的趋势. Node.js 的开发者更多的开始使用容器并积极的拥抱 Serve ...

  5. 模块加载及第三方包:Node.js模块化开发、系统模块、第三方模块、package.json文件、Node.js中模块的加载机制、开发环境与生产环境、cookie与session

    1.Node.js模块化开发 1.1 JavaScript开发弊端 JavaScript 在使用时存在两大问题,文件依赖和命名冲突. 1.2 软件中的模块化开发 一个功能就是一个模块,多个模块可以组成 ...

  6. 在Visual Studio上开发Node.js程序

    在Visual Studio上开发Node.js程序 原文:在Visual Studio上开发Node.js程序 [题外话] 最近准备用Node.js做些东西,于是找找看能否有Visual Studi ...

  7. api怎么写_使用Node.js原生API写一个web服务器

    Node.js是JavaScript基础上发展起来的语言,所以前端开发者应该天生就会一点.一般我们会用它来做CLI工具或者Web服务器,做Web服务器也有很多成熟的框架,比如Express和Koa.但 ...

  8. 在Visual Studio上开发Node.js程序(2)——远程调试及发布到Azure

    [题外话] 上次介绍了VS上开发Node.js的插件Node.js Tools for Visual Studio(NTVS),其提供了非常方便的开发和调试功能,当然很多情况下由于平台限制等原因需要在 ...

  9. 基于 Go 语言开发 Serverless 云原生应用

    Golang 无疑是云原生领域开发的首选开发语言,继 Docker.Kubernetes 等大作之后 Knative 又是一个基于 Go 语言的云原生范式.Knative 提供了一整套云原生应用的 S ...

最新文章

  1. 将jar文件做成exe可运行文件
  2. UVA - 1388 Graveyard 【数学】
  3. 树莓派 无法安装mysql_树莓派安装mysql
  4. 关于c语言编写 单项链表 的创建、插入、修改、删除、显示、退出 的程序案例
  5. 李楠:《流浪地球》抄的经典套路 但这不是贬低
  6. ZooKeeper集群部署方式
  7. 怎么看待苹果公司要求分成微信、知乎打赏32%?
  8. Apache下域名虚拟主机在个人主页目录上实现过程
  9. HTML5 新属性的讲解
  10. 黑马程序员pink老师前端入门教程,零基础必看的JavaScript基础语法视频教程(jQuery2)
  11. pthread 立即停止线程_pthread_create线程终止问题
  12. uni-app--微信小程序自定义tabbar
  13. 义隆单片机学习笔记之(三) 应用例程
  14. java+上传文件夹
  15. 按键精灵电脑版对接百度ai,告别字库(文字识别篇)
  16. mybatisplus sql 改写2
  17. 秒 毫秒 微秒 纳秒 皮秒
  18. 【FFmpeg】做一个抖音/快手视频模板常用哪些功能
  19. 全球首个华纳兄弟酒店正式营业,《老友记》喷泉、全新蝙蝠侠战车亮相
  20. RocketMQ的name server启动源码总结

热门文章

  1. 三星s2 硬刷Android 8,六年老机吃上奥利奥:第三方三星S2安卓8.0刷机包发布
  2. stm32使用AD转换读取光敏电阻的值(光敏电阻5516)
  3. 第一章 初步认识数据透视表
  4. 基于最小二乘法的——线性回归拟合(一)
  5. js中转json数组常用方法
  6. Windows系统安装虚拟机以及Linux系统
  7. Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context
  8. [数学建模(四)]MATLAB神经网络工具箱的简单应用
  9. 关于Synaptics.exe感染型病毒
  10. 事业单位人力资源开发中的职业发展分析