13 个版本 (7 个破坏性更新)
0.9.0-alpha | 2023年11月12日 |
---|---|
0.8.1 | 2023年6月5日 |
0.8.0 | 2023年5月3日 |
0.7.0 | 2022年9月13日 |
0.3.1 | 2021年11月15日 |
#335 in FFI
218 每月下载量
在 4 个 Crates 中使用 (通过 deno_bindgen)
41KB
1K SLoC
deno_bindgen
此工具旨在简化用 Rust 编写的 Deno FFI 库的粘合代码生成。
安装
通过 cargo
命令行安装
cargo install deno_bindgen_cli
用法
use deno_bindgen::deno_bindgen;
// Export `add` function to JavaScript.
#[deno_bindgen]
fn add(a: u32, b: u32) -> u32 {
a + b
}
直接使用导出的函数在 ESM 中与 TypeScript 类型定义一起使用
import { add } from "./bindings/mod.ts";
add(1, 2);
设计
该工具旨在使编写高性能 FFI 绑定变得非常容易。在 0.10 版本中,许多东西都经过了重新设计,以防止性能陷阱。
生成并支持 TypeScript 类型。
所有类句柄都支持通过显式资源管理 API (using
) 处理内存。
#[deno_bindgen]
pub struct Foo;
#[deno_bindgen]
impl Foo {
#[constructor]
pub fn new() -> Self {
Self
}
pub fn bar(&self) {
// ...
}
}
import { Foo } from "@ffi/example";
{
using foo = new Foo();
foo.bar();
// foo is disposed here...
}
高性能。代码生成试图为所有绑定找到最快可能的路径,就像它们是手动编写的一样,以充分利用 Deno FFI JIT 调用的能力。
> make bench
cpu: Apple M1
runtime: deno 1.38.0 (aarch64-apple-darwin)
file:///Users/divy/gh/deno_bindgen/example/bench.js
benchmark time (avg) iter/s (min … max) p75 p99 p995
--------------------------------------------------------------- -----------------------------
add 6.88 ns/iter 145,297,626.6 (6.78 ns … 13.33 ns) 6.81 ns 8.22 ns 9.4 ns
bytelen 8.05 ns/iter 124,278,976.3 (7.81 ns … 18.1 ns) 8.09 ns 10.39 ns 11.64 ns
发布
默认情况下,deno_bindgen 为本地开发生成绑定。要发布跨平台绑定,可以使用 --lazy-init
标志,这让您可以完全控制如何托管预构建的共享库并在运行时拉取它们。
deno_bindgen --release --lazy-init
import { add, load } from "./example/mod.ts";
import { cache } from "https://deno.land/x/cache/mod.ts";
// Download the shared library from a CDN
const file = await cache("https://example.com/example.so");
load(file.path);
add(1, 2);
依赖项
~1–1.8MB
~38K SLoC