Compartments S1
中文标题:隔离区(Compartments)
- 阶段: Stage 1
- 状态: 进行中
- ECMAScript 版本: —
- 同步时间: 2026年8月26日
- English original · 官方仓库
隔离区提案旨在在共享领域内隔离程序并限制其能力,解决全局作用域和主机行为中的过度权限泄漏到第三方代码的问题。它引入了一个五层架构,包括一等公民的 Module 和 ModuleSource 构造函数、模块源的静态分析、虚拟模块源、求值器以及高级的 Compartment 类,核心解决方案围绕虚拟化 ECMAScript 模块加载器。
以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。
隔离区(Compartments)
阶段:1
提案发起人:
- Mark S. Miller, Agoric
- Caridy Patiño, Salesforce
- Patrick Soquet, Moddable
- Kris Kowal, Agoric
- Jack Works, Sujitech
- Guy Bedford, OpenJS Foundation
荣誉退休:
- Bradley Farias, GoDaddy
- Jean-Francois Paradis, Salesforce
摘要
隔离区是一种在共享领域(realm)内隔离程序并为其提供受限能力的机制。
每个隔离区共享领域的内部特性(intrinsics),但具有不同的求值器集合(eval、Function,以及一个新的求值器 Module)和一个全局对象。
拥有独立的全局对象允许每个隔离区仅被授予其所需的能力对象、独立的求值器、无能力(powerless)的构造函数以及共享的原型。
隔离区提案已获准进入第 1 阶段(问题探索),其章程是“隔离主机行为”。 我们要解决的问题是,在大型应用中,过度的权限从全局作用域和主机行为流入第三方依赖和插件。 通过探索这个问题,我们发现解决方案的主体部分是虚拟化 ECMAScript 模块加载器。 有了 ECMAScript 模块加载器,我们就可以构建一个同时隔离脚本和模块代码的解决方案。
在两年多的时间里,我们完善了 Compartment 类,以满足制作和导入捆绑包、模拟各种主机模块说明符命名空间、在多个隔离区之间链接模块以及支持非 ECMAScript 模块语言的需求。
随后,我们开始与模块块、模块片段、延迟导入和导入反射等提案的发起人合作,以确保这些提案相互协调一致。 通过这些讨论,我们发现了一组较低级别的接口,可以在用户代码中构建隔离区,且这些接口与上述提案更加一致。
因此,隔离区提案包含五个层次:
-
Module 和 ModuleSource:提供一等公民的
Module和ModuleSource构造函数,并扩展动态导入以操作Module实例。(规范变更) -
表面模块源静态分析:扩展
ModuleSource实例,使其反映某些静态分析结果,如import和export绑定,以便工具检查模块图。 -
虚拟模块源:扩展
Module构造函数,使其接受虚拟模块源:实现某种协议的对象,该协议足以虚拟化 ECMA-262 或主机实现未预见的语言中的模块求值。 -
求值器:提供
Evaluators构造函数,生成新的eval函数、Function构造函数和Module构造函数,使得由这些求值器生成的执行上下文引用回这一组求值器,并带有给定的全局对象以及脚本上下文中动态导入的虚拟化主机行为。 -
隔离区:隔离区是在共享领域内隔离程序并为其提供受限能力的高级机制。 隔离区可以在用户代码中使用
Evaluators、Module和ModuleSource实现。
模块提案特性的激励用例 展示了隔离区提案各层次及关联模块提案中每个特性的动机。