Rust: 基于 napi-rs 开发 Node.js 原生模块

2023-05-16

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 语言这一步就能看得出来真实投入使用时候的潜力。

参考链接

TitleLink
从暴力到 NAN 再到 NAPI——Node.js 原生模块开发方式变迁https://cnodejs.org/topic/5957626dacfce9295ba072e0
napi-rshttps://napi.rs/
Install Rust - Rusthttps://www.rust-lang.org/tools/install
napi-rs - Githubhttps://github.com/napi-rs/napi-rs
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rust: 基于 napi-rs 开发 Node.js 原生模块 的相关文章

  • 软件工程——六种模型

    瀑布模型 思想 xff1a 1 从制作时间上按工序把问题化简 2 将功能实现与制作分开便于分工协作 特点 xff1a 1 时间顺序性和依赖性 2 推迟实现的观点 3 质量保证的观点 优点 xff1a 1 奠定了软件工程方法的基础 xff1b
  • AVT工业相机Windows、Opencv开发——驱动相机(超详细)

    一 概述 1 1使用Vimba控制相机需要经历以下几个步骤 1 打开Vimba 2 查找相机列表 3 打开特定相机 4 配置参数 xff08 可选 xff09 5 采集 xff1a 采集过程共分为5步 xff0c 具体见1 2 6 关闭相机
  • python-opencv尺寸测量

    首先 xff0c 利用机器视觉来测定零件尺寸 xff0c 我们能够直接得到的是图片的像素 xff0c 要想获得尺寸大小 xff0c 我们必须找到像素和实际尺寸间的关系 我们在这里定义一个比例概念 xff1a 每度量比的像素 xff08 pi
  • Bounding box(bbox) 预测

    在出现Bounding box预测之前 xff0c 一般都是通过滑动窗口进行目标检测 本文前两部分介绍滑动窗口算法 xff0c 这样是为了更好介绍 bounding box如何引出 为了解决什么问题而引出的 也可直接跳跃到第三部分看有关bo
  • YOLOv3网络结构分析以及工作流程

    注意 xff1a 本文章有很多图 xff0c 但是都是YOLOv3的结构图 xff0c 只是每张图表达出的信息都各有特色 xff0c 可将这些结构图结合起来 xff0c 能更好的理解 1 Darknet 53 模型结构 在论文中虽然有给网络
  • 飞浆七天深度学习

    文章目录 前言图像处理原理与深度学习入门百度的飞浆实战可视化数据准备可视化效果图片 深度学习原理与使用方法实战手势识别 卷积神经网络原理与使用实战车牌识别分割字符的代码定义MyLeNet网络 经典卷积网络解读数据增强计算VGG的参数小姐姐手
  • Ubuntu18.04安装教程——超详细的图文教程

    电脑配置 xff1a 名称 xff1a Lenovo 拯救者Y7000P 处理器 xff1a i7 10750H 内存 xff1a 32G 固态 xff1a 1TB 显卡 xff1a RTX2060 6G 一 准备工作 本文以 Ubuntu
  • VINS-Course代码解析——run_euroc前端数据处理

    vins mono总框架如下 xff1a 主要分为三大块 xff1a 我们先从主函数 main 入手 xff1a 主函数中有三个线程 xff0c 读取完数据集和配置文件的路径后就会进入这三个线程 xff0c 如下图 xff1a thd Ba
  • C++求解N个数的最大公约数、最小公倍数

    一 2个数的最大公约数 span class token comment 辗转相除法 span span class token keyword int span span class token function gcd span spa
  • 子序列个数——动态规划

    题目 xff1a 统计一个字符串中全部不同的子序列的个数 思路 xff1a 动态规划求解 令 f i 61 前 i 个元素中包含的全部子序列的个数 那么状态转移方程分为下面两种情况 xff1a 当第 i 个元素在前面 i 1 个字符中没有出
  • 字符串中特定子序列出现的次数(动态规划)

    题目 xff1a 给定一个字符串 xff0c 求子序列 cwbc 出现的次数 思路 xff1a 动态规划 令 dp i j 表示前 i 个字符中匹配了字符串 cwbc 中前 j 位 xff08 j 61 1 2 3 4 xff09 的个数
  • 认识node

    一 认识node node是一个基于Chrome V8引擎的JavaScript代码运行环境 浏览器 xff08 软件 xff09 能够运行JavaScript代码 xff0c 浏览器就是JavaScript代码的运行环境 xff08 js
  • python爬虫-使用request,lxml库爬取游戏排名

    爬取目标URL xff1a http wy hao123 com top 开发环境 xff1a PyCharm 2019 2 3Python3 6火狐浏览器 使用的三方库 xff1a requestslxml 执行结果 开始 抓取网页 打开
  • 知识追踪模型——教育大数据挖掘(持续更新......)

    知识追踪 xff08 2015 NIPS xff09 Deep Knowledge Tracing xff08 2017 WWW xff09 Dynamic Key Value Memory Networks for Knowledge T
  • Wireshark从安装到使用详细指南

    前言 wireshark是一款非常优秀的网络封包分析软件 xff0c 具有极为强大的功能 可以截取各种类型的网络封包 xff0c 并且显示网络封包的详细信息 值得一提的是 xff0c 为了安全性考虑 xff0c wireshark无法实现改
  • echarts随dom大小自适应变化,并做防抖处理

    目录 监听窗口resize事件监听dom的resize事件完整代码示例 监听窗口resize事件 监听浏览器窗口resize事件很简单 xff0c 如下一行代码即可搞定 xff1a window span class token punct
  • 极简版qt打包成exe

    文章目录 极简版qt打包成exe附加工具过程 极简版qt打包成exe 附加工具 Engima Virtual Box xff0c 将qt的多个文件打包成一个exe xff0c 下载地址 过程 新建xxx文件夹将初步编译过的xxx exe x
  • Windows10清理C盘的恶意软件

    Windows10清理C盘的恶意软件 写在前面情况1 xff1a 在桌面留有 快捷链接 的情况2 xff1a 在 控制面板 的 卸载软件 中能找到名字情况3 xff1a 在 控制面板 的 卸载软件 中找不到名字1 ludashi birdw
  • 前端的学习之路:初级CSS---关系选择器

    关系选择器 span class token doctype lt DOCTYPE html gt span span class token tag span class token tag span class token punctu
  • 子类继承父类的加载顺序——记录篇

    两种情况的加载顺序 xff1a 初始化阶段的初始化步骤 xff1a 静态代码块 先父类后子类 gt 非静态代码块 gt 父类 先父类后子类 一 单独类的加载顺序 静态变量 静态代码块 xff1a 从上到下的顺序加载 类的非静态变量 xff0

随机推荐