Ion؛ رانتایم جاوااسکریپت برای برنامههای Rust
خلاصهٔ کاملتر
Ion یه رانتایم جاوااسکریپته که هدفش جاسازی یه موتور جاوااسکریپت داخل یه برنامهٔ Rust ـه. تو توضیحات پروژه اومده که این کار مخصوصاً بهدرد ساختن سیستم پلاگین جاوااسکریپتی میخوره، ولی میشه ازش تو یه فایل اجرایی مستقل هم استفاده کرد. یه API سطحبالا و راحت داره که از napi-rs الهام گرفته، حلقهٔ رویدادش روی Tokio ـه و ذاتاً چندنخیه.
از نظر فنی، Ion با زبان Rust نوشته شده، موتور جاوااسکریپتش v8 ـه و برای حلقهٔ رویداد از Tokio استفاده میکنه. سه مفهوم اصلی داره: JsRuntime که یه دسته به موتور مقداردهیشدهست، JsWorker که یه محیط جاوااسکریپت روی نخ اختصاصی خودشه، و JsContext که یه globalThis ایزوله با حلقهٔ رویداد مخصوص خودشه. هر JsRuntime میتونه چند Worker و هر Worker چند Context داشته باشه.
کار باهاش هم سادهست؛ یه رانتایم میسازی، یه ورکر و کانتکست ازش میگیری و بعد داخل کانتکست کد جاوااسکریپت اجرا میکنی:
let runtime = JsRuntime::initialize_once()?;
let worker = runtime.spawn_worker(JsWorkerOptions::default())?;
let ctx = worker.create_context()?;
ctx.exec_blocking(|env| {
let value = env.eval_script::<JsNumber>("1 + 1")?;
println!("Returned: {}", value.get_u32()?);
Ok(())
})?;این رانتایم علاوه بر اجرای ساده، اجازه میده جاوااسکریپت رو از Rust صدا بزنی و برعکس، Rust رو از جاوااسکریپت. برای گسترش هم سهتا رابط ساده داره: Resolverها که موقع import مسیر ماژولها رو پیدا میکنن (مثلاً میشه resolver مربوط به OXC یا Atlaspack رو وصل کرد)، Extensionها که ماژولها و globalهای بومی مثل setTimeout یا fetch رو اضافه میکنن، و Preprocessorها که مثلاً میتونن TypeScript رو قبل از اجرا به جاوااسکریپت تبدیل کنن.
نویسنده توضیح میده چرا سراغ Node، Deno یا Bun نرفته: جاسازی Node سخته، نمیشه بهشکل کتابخانهٔ استاتیک کامپایلش کرد و باید بهصورت لایبرری داینامیک مصرف بشه. Deno هرچند با Rust نوشته شده و کریت deno_core رو میده، ولی API سمت کاربرش سخت و به CLI گره خورده. Bun هم به گفتهٔ نویسنده اصلاً قابل جاسازی نیست. فعلاً سازگاری با استانداردهای وب در اولویته و پشتیبانی از fetch و خیلی APIهای دیگه هنوز اضافه نشده.
نکات کلیدی:
- Ion یه رانتایم جاوااسکریپت برای جاسازی داخل برنامههای Rust ـه، روی v8 و Tokio.
- مدل JsRuntime/JsWorker/JsContext اجازه میده اپ چندنخی از هر نخی به جاوااسکریپت زنگ بزنه.
- با Resolver، Extension و Preprocessor گسترشپذیره؛ مثلاً برای resolution نودی یا TypeScript.
- برای کاربردهایی مثل سیستم پلاگین، SSR و توابع بدونسرور (FaaS) طراحی شده.




