#deno #bindings #macro #bindgen

deno_bindgen

使用 Rust 编写高级 Deno FFI 库

15 个版本 (8 个重大更新)

0.9.0-alpha2023 年 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 日

#53FFI

Download history 186/week @ 2024-03-13 54/week @ 2024-03-20 41/week @ 2024-03-27 57/week @ 2024-04-03 81/week @ 2024-04-10 51/week @ 2024-04-17 53/week @ 2024-04-24 50/week @ 2024-05-01 72/week @ 2024-05-08 51/week @ 2024-05-15 28/week @ 2024-05-22 34/week @ 2024-05-29 32/week @ 2024-06-05 26/week @ 2024-06-12 24/week @ 2024-06-19 12/week @ 2024-06-26

每月 99 次下载
用于 3 crate

MIT 许可证

30KB
672

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://docs.deno.org.cn/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);

依赖项

~0.8–1.6MB
~35K SLoC