# ShadowRealm
ShadowRealm API 是一个新的 JavaScript 提案,它允许一个 JS 运行时创建多个高度隔离的 JS 运行环境(realm),每个 realm 具有独立的全局对象和内建对象
每个 ShadowRealm 实例都有自己独立的运行环境,它提供了两种方法让我们来执行运行环境中的代码:
- .evaluate():同步执行代码字符串,类似 eval()。
- .importValue():返回一个 Promise 对象,异步执行代码字符串。
# 与其他方案对比
- eval()和Function
ShadowRealms 与 eval() 和 Function 很像,但比它们俩都好一点:我们可以创建新的JS运行环境并在其中执行代码,这可以保护外部的JS运行环境不受代码执行的操作的影响。
- Web Workers
Web Worker 是一个比 ShadowRealms 更强大的隔离机制。其中的代码运行在独立的进程中,通信是异步的。
但是,当我们想要做一些更轻量级的操作时,ShadowRealms 是一个很好的选择。它的算法可以同步计算,更便捷,而且全局数据管理更自由。
- iframe
与 ShadowRealms 相比,还是有以下缺点:
- 只能在浏览器中使用 iframe;
- 需要向 DOM 添加一个 iframe 以对其进行初始化;
- 每个 iframe 环境都包含完整的 DOM,这在一些场景下限制了自定义的灵活度;
- 默认情况下,对象是可以跨环境的,这意味着需要额外的工作来确保代码安全。
- Node.js 上的 vm 模块
Node.js 的 vm 模块与 ShadowRealm API 类似,但具有更多功能:缓存 JavaScript 引擎、拦截 import() 等等。但它唯一的缺点就是不能跨平台,只能在 Node.js 环境下使用。
# 推荐阅读
比 eval 和 iframe 更强的新一代 JavaScript 沙箱-ShadowRealm (opens new window)
← 实现mini微前端框架 性能体系大纲 →