Neon是一个可以使用Rust开发原生Node模块的库和工具链,类似于使用C和C++所实现的功能,它还利用了Rust安全方面的好处。
Neon致力于让Node.js模块的创建变得简单明了。在安装了Neon和Rust工具链后,你就可以使用neon new 来创建一个Node模块骨架,其中包含了一个Cargo.toml文件和一个Rust文件(一个示例hello函数):
<project-name>/
├── .git ignore
├── README.md
├── lib/
│ └── index.js
├── native/
│ ├── Cargo.toml
│ └── src/
│ └── lib.rs
└── package.json
你可以在Cargo.toml中添加所需的Rust依赖项,并按照你喜欢的方式布局代码。你可以通过两个步骤导出Rust函数,然后在Node程序中使用它。首先是注册函数:
register_module!(mut m, {
m.export_function("myFunction", thread_count)
});
然后,在lib/index.js中导出:
const addon = require('../native');
module.exports = addon.myFunction;
准备好代码后,你就可以构建Node模块:
neon build --release
虽然这看起来很简单,但你无论如何都应该特别注意在Node环境中表现得像个好公民。特别是你导出的任何一个Rust函数都应该是特定类型的:
fn add1(mut cx: FunctionContext) -> JsResult<JsNumber> {
...
}
这里,可以通过FunctionContext访问Node调用者环境,包括它的arguments列表。类似地,导出的函数应该返回一个JsResult,这是一个指定了函数返回给定类型或抛出JavaScript异常的可选类型。例如,你可以使用以下语法访问特定参数:
let x = cx.argument::<JsNumber>(0)?.value();
要从导出的函数返回值,应该将其转换为预期值。例如,如果你的函数返回一个数字,在返回时你需要使用Rust的as f64转换操作符对其进行转换:
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依赖项。
原文链接:
领取专属 10元无门槛券
私享最新 技术干货