Module sync assert S1
中文标题:模块同步断言
提案概览
- 阶段: Stage 1
- 状态: 进行中
- ECMAScript 版本: —
- 同步时间: 2026年8月26日
- English original · 官方仓库
提案速览
该提案解决了模块意外变为异步的问题,这可能会在 Service Worker、polyfill 和 API 稳定性等场景中破坏依赖同步的代码。解决方案引入了一条新指令 "assert sync",指示引擎在模块或其子图为异步时提前抛出语法错误。该提案处于早期阶段,仅有 README,没有正式规范或实现细节。
Note
以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。
模块同步断言
需要解决的问题
某些代码必须是同步的。 如果模块意外地变为异步(由于子图中存在顶层 await 或 WebAssembly ESM 集成的旧语义),代码可能会以难以调试的方式出错。
示例:Service Worker
NOTE
如果你尝试在 Service Worker 中使用 ES Module 的原生实现, 它会抛出 TypeError "在 Service Worker 中不允许使用顶层 await。"。
让我们假设 Service Worker 通过打包器打包,并转换为非 ES 模块格式。
如果 some-module.js 变为异步,
那么 addEventListener 将不再工作:
WARNING
'fetch' 事件的事件处理程序必须在 Worker 脚本的初始求值阶段添加。
示例:Polyfill
Polyfill 代码必须同步运行,否则, 在旧浏览器中应用程序可能会出现问题。
示例:API 稳定性
添加 TLA 是一个破坏性变更, 库作者可能希望添加一个测试,以确保他们的库不会因依赖变更而意外变成异步。
解决方案
向引擎添加一个提示, 如果模块求值是异步的或包含异步子图, 引擎应提前失败(语法错误), 以便开发者尽早修复。
指令
添加一条新指令来提示引擎。
其他解决方案:Linter/打包器级禁令
可能的实现方式,但每种工具都需要发明自己的约定来实现这一点。 而且这不适用于不使用打包器/linter 的开发者。