✅ 支持 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. 异步执行 JS
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| { 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 等新兴标准