闽公网安备 35020302035485号
✅ 支持 ES Module、TypeScript、Node.js 模块解析等高级功能
官方没有提供 C FFI 接口(虽然 PR 正在进行中)
对于想在 Rust 中构建 JS 运行时的开发者来说,体验并不好
用户层 API(Userland API):提供扩展机制,方便构建完整的运行时
use ion::*;
pubfn main() -> anyhow::Result<()> {
let runtime = JsRuntime::initialize_once()?;
let worker = runtime.spawn_worker()?;
let ctx = worker.create_context()?;
ctx.exec_blocking(|env| {
let value = env.eval_script::<JsNumber>("1 + 1")?;
let result = value.get_u32()?;
println!("Returned: {}", result); // 输出:2
Ok(())
})?;
Ok(())
}
2. 异步执行 JSuse ion::*;
pubfn main() -> anyhow::Result<()> {
let runtime = JsRuntime::initialize_once()?;
let worker = runtime.spawn_worker()?;
let ctx = worker.create_context()?;
ctx.exec_blocking(|env| {
env.spawn_local({
let env = env.clone();
asyncmove {
println!("Async Task Started");
let value = env.eval_script::<JsNumber>("1 + 1")?;
tokio::time::sleep(tokio::time::Duration::from_millis(1000)).await;
println!("Async Task Returned: {}", value.get_u32()?);
Ok(())
}
})?;
Ok(())
})?;
Ok(())
}
3. 多线程调用 JS 函数use ion::*;
pubfn main() -> anyhow::Result<()> {
let runtime = JsRuntime::initialize_once()?;
let worker = runtime.spawn_worker()?;
let ctx = worker.create_context()?;
// 堆代码 duidaima.com
ctx.eval_script("globalThis.add = (a, b) => a + b")?;
ctx.exec_blocking(|env| {
let global_this = env.global_this()?;
let function = global_this.get_named_property_unchecked::<JsFunction>("add")?;
let tsfn = ThreadSafeFunction::new(&function)?;
std::thread::spawn(move || {
let ret: u32 = tsfn
.call_blocking(
|env| Ok((1, 1)),
|env, ret| ret.cast::<JsNumber>()?.get_u32(),
)
.unwrap();
println!("JavaScript function returned: {}", ret); // 输出:2
});
Ok(())
})?;
Ok(())
}
五、ion 的未来展望支持 WASI 等新兴标准