ShadowRealm API: محیط جاوااسکریپتی ایزوله در مرورگر
خلاصهٔ کاملتر
ShadowRealm یه مفهوم جدید در جاوااسکریپته که میخواد مشکل قدیمی «ایزولهسازی کد» رو حل کنه. وقتی چند قطعه کد جاوااسکریپت توی یه صفحه کنار هم اجرا میشن، همه به یه global object (همون window یا globalThis) دسترسی دارن و میتونن همدیگه رو تغییر بدن. ShadowRealm یه محیط اجرایی کاملاً مجزا میسازه که global object، intrinsics (مثل Object.prototype) و built-in های مخصوص به خودش رو داره و از بقیه ایزولهست.
این پروپوزال الان در مرحله ۲.۷ فرآیند استانداردسازی TC39 قرار داره و درخواست رسمی برای رسیدن به Stage 3 در دسامبر ۲۰۲۴ مطرح شده. TC39 همون کمیتهایه که استاندارد ECMAScript (زیربنای جاوااسکریپت) رو تعریف میکنه و هر پیشنهاد باید مراحل ۰ تا ۴ رو طی کنه تا وارد استاندارد رسمی بشه.
API این ویژگی خیلی سادهست و فقط دو متد اصلی داره:
declare class ShadowRealm {
constructor();
importValue(specifier: string, bindingName: string): Promise<PrimitiveValueOrCallable>;
evaluate(sourceText: string): PrimitiveValueOrCallable;
}متد evaluate یه رشته کد رو مستقیماً توی محیط ایزوله اجرا میکنه و نتیجهاش رو برمیگردونه. متد importValue هم بهت اجازه میده یه ماژول رو توی اون محیط ایمپورت کنی و یه export مشخص ازش بگیری؛ چون ماژول لود کردن غیرهمزمانه، این متد یه Promise برمیگردونه.
نکته مهم اینه که مقادیری که بین Realm اصلی و ShadowRealm رد و بدل میشن باید primitive (مثل عدد، رشته، بولین) یا callable (تابع) باشن. آبجکتهای معمولی مستقیماً قابل انتقال نیستن تا ایزولهبودن محیط حفظ بشه.
این API میتونه برای سناریوهایی مثل ساخت sandbox برای اجرای کد ناامن، محیط تست مستقل، پلاگینسیستمها، یا ابزارهایی که نباید به global scope دسترسی داشته باشن خیلی مفید باشه.
نکات کلیدی:
- ShadowRealm یه محیط اجرایی مجزا با global object مستقل میسازه
- الان در مرحله ۲.۷ استاندارد TC39 قرار داره و به Stage 3 نزدیکه
- دو متد اصلی: evaluate برای اجرای مستقیم کد و importValue برای ایمپورت ماژول
- فقط مقادیر primitive یا callable بین Realmها قابل تبادلاند
- کاربردهای اصلی: sandbox، پلاگینسیستم، محیط تست ایزوله




