首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Neon支持在Node App中嵌入Rust代码

Neon是一个可以使用Rust开发原生Node模块的库和工具链,类似于使用C和C++所实现的功能,它还利用了Rust安全方面的好处。

Neon致力于让Node.js模块的创建变得简单明了。在安装了Neon和Rust工具链后,你就可以使用neon new 来创建一个Node模块骨架,其中包含了一个Cargo.toml文件和一个Rust文件(一个示例hello函数):

代码语言:javascript
复制
<project-name>/
├── .git ignore
├── README.md
├── lib/
│   └── index.js
├── native/
│   ├── Cargo.toml
│   └── src/
│       └── lib.rs
└── package.json

你可以在Cargo.toml中添加所需的Rust依赖项,并按照你喜欢的方式布局代码。你可以通过两个步骤导出Rust函数,然后在Node程序中使用它。首先是注册函数:

代码语言:javascript
复制
register_module!(mut m, {
    m.export_function("myFunction", thread_count)
});

然后,在lib/index.js中导出:

代码语言:javascript
复制
const addon = require('../native');
module.exports = addon.myFunction;

准备好代码后,你就可以构建Node模块:

代码语言:javascript
复制
neon build --release

虽然这看起来很简单,但你无论如何都应该特别注意在Node环境中表现得像个好公民。特别是你导出的任何一个Rust函数都应该是特定类型的:

代码语言:javascript
复制
fn add1(mut cx: FunctionContext) -> JsResult<JsNumber> {
...
}

这里,可以通过FunctionContext访问Node调用者环境,包括它的arguments列表。类似地,导出的函数应该返回一个JsResult,这是一个指定了函数返回给定类型或抛出JavaScript异常的可选类型。例如,你可以使用以下语法访问特定参数:

代码语言:javascript
复制
let x = cx.argument::<JsNumber>(0)?.value();

要从导出的函数返回值,应该将其转换为预期值。例如,如果你的函数返回一个数字,在返回时你需要使用Rust的as f64转换操作符对其进行转换:

代码语言:javascript
复制
Ok(cx.number(num_cpus::get() as f64))

构建原生Node模块的一个好处是可以执行异步后台任务。Neon使用N-API的微任务API来实现这个目标,并依赖JavaScript端的回调和Promise来控制异步任务的执行。

Neon也可以用于Electron App。目前这需要使用一个中间工具electron-build-env,用于构建Electron App所需的Neon依赖项。Neon团队正在开发electron-rebuild,这个工具将简化这一过程,可以像使用其他依赖项那样使用Neon依赖项。

原文链接

Neon Enables Embedding Rust Code in Node.js Apps

  • 发表于:
  • 本文为 InfoQ 中文站特供稿件
  • 首发地址https://www.infoq.cn/article/B0oT5hH2kNvBX4rg8PZe
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券