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 网页编程
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)
63KB
1.5K SLoC
JavaScriptCore API for Rust
该库提供了对 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++ 低级绑定是如何生成的?
我首先使用 bindgen
对 JavaScript/JavaScript.h
头文件进行初步转换,然后手动清理。计划手动维护低级绑定。
依赖项
~1.5MB
~36K SLoC