# 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 相比,还是有以下缺点:

  1. 只能在浏览器中使用 iframe;
  2. 需要向 DOM 添加一个 iframe 以对其进行初始化;
  3. 每个 iframe 环境都包含完整的 DOM,这在一些场景下限制了自定义的灵活度;
  4. 默认情况下,对象是可以跨环境的,这意味着需要额外的工作来确保代码安全。
  • Node.js 上的 vm 模块

Node.js 的 vm 模块与 ShadowRealm API 类似,但具有更多功能:缓存 JavaScript 引擎、拦截 import() 等等。但它唯一的缺点就是不能跨平台,只能在 Node.js 环境下使用。

# 推荐阅读

比 eval 和 iframe 更强的新一代 JavaScript 沙箱-ShadowRealm (opens new window)