0.3.1 2020年5月15日
0.3.0 2020年5月9日
0.2.3 2020年5月1日
0.2.1 2020年4月26日
0.1.1 2018年6月29日

10 in #node-js

MIT 许可证

55KB
1.5K SLoC

napi-rs

此项目是从 xray 初始化的

平台支持

操作系统

Linux macOS Windows x64 MSVC

NodeJS

Node10 Node 12 Node13 Node14

一个用于在 Rust 中构建编译型 Node 插件的精简库。

此库依赖于 N-API,并要求 Node 8.9 或更高版本。它仍然相当原始,尚未在生产环境中测试。

一个不错的特性是,这个 crate 允许你仅使用 Rust 工具链构建插件,而不涉及 node-gyp

品味

#[js_function(1)] // ------> arguments length, omit for zero
fn fibonacci(ctx: CallContext) -> Result<Value<Number>> {
  let n = ctx.get::<Number>(0)?.try_into()?;
  ctx.env.create_int64(fibonacci_native(n))
}

#[inline]
fn fibonacci_native(n: i64) -> i64 {
  match n {
    1 | 2 => 1,
    _ => fibonacci_native(n - 1) + fibonacci_native(n - 2),
  }
}

构建

此存储库是一个 Cargo crate。任何基于 napi 的插件都应该包含 Cargo.toml 以使其成为 Cargo crate。

在你的 Cargo.toml 中,你需要将 crate-type 设置为 "cdylib",这样 cargo 就会构建一个可以被 Node 可执行文件动态加载的 C 风格共享库。你还需要将此 crate 添加为依赖项。

[lib]
crate-type = ["cdylib"]

[dependencies]
napi-rs = "0.1"

[build-dependencies]
napi-build = "0.1"

并在你的项目中创建 build.rs

// build.rs
extern crate napi_build;

fn main() {
  napi_build::setup();
}

到目前为止,napi 构建脚本仅在 macOS LinuxWindows x64 MSVC 上进行了测试。

请参阅包含的 test_module 以获取示例插件。

运行 cargo build 生成 动态库 文件。然后安装 napi-rs 以帮助您将 动态库 文件复制到 .node 文件中,以便您可以在程序中调用它。

{
  "package": "your pkg",
  "dependencies": {
    "napi-rs": "^0.1"
  },
  "scripts": {
    "build": "cargo build && napi",
    "build-release": "cargo build --release && napi --release"
  }
}

然后您可以引入您的本地绑定

require('./target/debug|release/[module_name].node')

module_name 将是您在 Cargo.toml 中的 package 名称。

xxx=> ./目标/调试|发布/xxx.node

xxx-yyy=> ./目标/调试|发布/xxx_yyy.node

您也可以将 动态库 文件复制到指定的位置

napi [--release] .
napi [--release] ./mylib
napi [--release] ./mylib.node

测试

由于依赖于此 crate 的库必须在 Node 可执行文件中加载以解析符号,因此所有测试都在 test_module 子目录中用 JavaScript 编写。

要运行测试

cd test_module
npm run build
npm test

功能表

创建 JavaScript 值

NAPI NAPI 版本 最小 Node 版本 状态
枚举类型 6 v13.7.0 ⛔️
napi_create_array 1 v8.0.0
napi_create_array_with_length 1 v8.0.0
napi_create_arraybuffer 1 v8.0.0
napi_create_buffer 1 v8.0.0
napi_create_buffer_copy 1 v8.0.0 ⛔️
napi_create_date 5 版本 v11.11.0 ⛔️
napi_create_external 1 v8.0.0 ⛔️
napi_create_external_arraybuffer 1 v8.0.0
napi_create_external_buffer 1 v8.0.0
napi_create_object 1 v8.0.0
napi_create_symbol 1 v8.0.0 ⛔️
napi_create_typedarray 1 v8.0.0 ⛔️
napi_create_dataview 1 版本 v8.3.0 ⛔️
napi_create_int32 1 版本 v8.4.0
napi_create_uint32 1 版本 v8.4.0
napi_create_int64 1 版本 v8.4.0
napi_create_double 1 版本 v8.4.0
napi_create_bigint_int64 6 版本 v10.7.0 ⛔️
napi_create_bigint_uint64 6 版本 v10.7.0 ⛔️
napi_create_bigint_words 6 版本 v10.7.0 ⛔️
napi_create_string_latin1 1 v8.0.0 ⛔️
napi_create_string_utf16 1 v8.0.0
napi_create_string_utf8 1 v8.0.0

N-API 转换为 C 类型的函数

NAPI NAPI 版本 最低 Node 版本 状态
napi_get_array_length 1 v8.0.0
napi_get_arraybuffer_info 1 v8.0.0
napi_get_buffer_info 1 v8.0.0
napi_get_prototype 1 v8.0.0 ⛔️
napi_get_typedarray_info 1 v8.0.0 ⛔️
napi_get_dataview_info 1 版本 v8.3.0 ⛔️
napi_get_date_value 5 版本 v11.11.0 ⛔️
napi_get_value_bool 1 v8.0.0
napi_get_value_double 1 v8.0.0
napi_get_value_bigint_int64 6 版本 v10.7.0 ⛔️
napi_get_value_bigint_uint64 6 版本 v10.7.0 ⛔️
napi_get_value_bigint_words 6 版本 v10.7.0 ⛔️
napi_get_value_external 1 v8.0.0 ⛔️
napi_get_value_int32 1 v8.0.0
napi_get_value_int64 1 v8.0.0
napi_get_value_string_latin1 1 v8.0.0 ⛔️
napi_get_value_string_utf8 1 v8.0.0
napi_get_value_string_utf16 1 v8.0.0
napi_get_value_uint32 1 v8.0.0
napi_get_boolean 1 v8.0.0
napi_get_global 1 v8.0.0 ⛔️
napi_get_null 1 v8.0.0
napi_get_undefined 1 v8.0.0

处理 JavaScript 值和抽象操作

NAPI NAPI 版本 最低 Node 版本 状态
napi_coerce_to_bool 1 v8.0.0
napi_coerce_to_number 1 v8.0.0
napi_coerce_to_object 1 v8.0.0
napi_coerce_to_string 1 v8.0.0
napi_typeof 1 v8.0.0
napi_instanceof 1 v8.0.0 ⛔️
napi_is_array 1 v8.0.0
napi_is_arraybuffer 1 v8.0.0
napi_is_buffer 1 v8.0.0
napi_is_date 1 v8.0.0 ⛔️
napi_is_error 1 v8.0.0 ⛔️
napi_is_typedarray 1 v8.0.0 ⛔️
napi_is_dataview 1 版本 v8.3.0 ⛔️
napi_strict_equals 1 v8.0.0 ⛔️
napi_detach_arraybuffer 实验性 版本 v13.3.0 ⛔️
napi_is_detached_arraybuffer 实验性 版本 v13.3.0 ⛔️

依赖

~0.7–4MB
~68K SLoC