4 个版本

0.1.0 2023年4月28日
0.0.3 2023年1月14日
0.0.2 2022年9月2日
0.0.1 2022年8月27日

#1683 in 网页编程

Download history 633/week @ 2024-03-24 1055/week @ 2024-03-31 829/week @ 2024-04-07 1177/week @ 2024-04-14 1874/week @ 2024-04-21 1045/week @ 2024-04-28 2243/week @ 2024-05-05 5241/week @ 2024-05-12 6902/week @ 2024-05-19 7975/week @ 2024-05-26 4119/week @ 2024-06-02 1915/week @ 2024-06-09 1619/week @ 2024-06-16 1080/week @ 2024-06-23 877/week @ 2024-06-30 841/week @ 2024-07-07

4,519 每月下载量
4 个 Crates 中使用 (2 直接) (例如:wai-bindgen-wasmer-impl, wai-bindgen-rust-impl, wasmer-engine-jit, wasmer-engine-dylib, wasmer-runtime-near, wai-bindgen-wasmer, wai-bindgen-gen-wasmer, wai-bindgen-gen-rust, shared-buffer, wasmer-vm, wasmer-wasix, wasmer-artifact, rusty_jsc_macros, rusty_jsc_sys)

MIT 许可证

63KB
1.5K SLoC

JavaScriptCore API for Rust

crates docs

该库提供了对 JavaScriptCore 引擎的 Rust API,具有以下目标

  • 类似于 JavaScriptCore API 的 Swift 高级 API
  • 封装低级 C++ API 而不是 jsc 以避免对 GTK 的依赖。

入门指南

实现 JavaScript 运行时

请查看 PunJS 以了解如何使用 rusty_jsc 实现JavaScript运行时的示例。

评估 JavaScript 脚本

use rusty_jsc::JSContext;

let mut context = JSContext::default();
let value = context.evaluate_script("'hello, world'", 1);
if let Some(value) = value {
    println!("{}", value.to_string(&context));
    // Prints:
    // hello, world
}

从 JavaScript 到 Rust 的回调

use rusty_jsc::{JSContext, JSValue};
use rusty_jsc_macros::callback;

// The JavaScript code calls this Rust function.
#[callback]
fn foo(_context: JSContext) {
    println!("hello from Rust land!");
}

fn main() {
    let mut context = JSContext::default();
    let callback = JSValue::callback(&context, Some(foo));
    let mut global = context.get_global_object();
    global.set_property(&context, "foo".to_string(), callback);
    context.evaluate_script("foo()", 1);
    // Prints:
    // hello from Rust land!
}

常见问题解答

关于其他 Rust 的 JavaScriptCore 绑定怎么办?

rusty_jsc 中的包装器是针对 <JavaScriptCore/JavaScript.h> 头文件构建的,而不是需要 GTK 的 jsc 变体。

为什么选择 JavaScriptCore,而不是已经存在的 rusty_v8

Bun 已经表明 JavaScriptCore 是服务器端 V8 的有力竞争者,所以让我们也将其带到 Rust 生态系统。

C++ 低级绑定是如何生成的?

我首先使用 bindgenJavaScript/JavaScript.h 头文件进行初步转换,然后手动清理。计划手动维护低级绑定。

依赖项

~1.5MB
~36K SLoC