For AI agents: the complete documentation index is available at /tc39-atlas/llms.txt, the full documentation bundle is available at /tc39-atlas/llms-full.txt, and this page is available as Markdown at /tc39-atlas/proposals/proposal-module-sync-assert.md.
  • 简体中文
  • Module sync assert S1

    中文标题:模块同步断言

    提案概览
    提案速览

    该提案解决了模块意外变为异步的问题,这可能会在 Service Worker、polyfill 和 API 稳定性等场景中破坏依赖同步的代码。解决方案引入了一条新指令 "assert sync",指示引擎在模块或其子图为异步时提前抛出语法错误。该提案处于早期阶段,仅有 README,没有正式规范或实现细节。

    Note

    以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。

    模块同步断言

    需要解决的问题

    某些代码必须是同步的。 如果模块意外地变为异步(由于子图中存在顶层 awaitWebAssembly ESM 集成的旧语义),代码可能会以难以调试的方式出错。

    示例:Service Worker

    import './some-module.js'
    addEventListener('fetch', () => {})
    NOTE

    如果你尝试在 Service Worker 中使用 ES Module 的原生实现, 它会抛出 TypeError "在 Service Worker 中不允许使用顶层 await。"。

    让我们假设 Service Worker 通过打包器打包,并转换为非 ES 模块格式。

    如果 some-module.js 变为异步, 那么 addEventListener 将不再工作:

    WARNING

    'fetch' 事件的事件处理程序必须在 Worker 脚本的初始求值阶段添加。

    示例:Polyfill

    Polyfill 代码必须同步运行,否则, 在旧浏览器中应用程序可能会出现问题。

    示例:API 稳定性

    添加 TLA 是一个破坏性变更, 库作者可能希望添加一个测试,以确保他们的库不会因依赖变更而意外变成异步。

    解决方案

    向引擎添加一个提示, 如果模块求值是异步的或包含异步子图, 引擎应提前失败(语法错误), 以便开发者尽早修复。

    指令

    "assert sync"

    添加一条新指令来提示引擎。

    其他解决方案:Linter/打包器级禁令

    可能的实现方式,但每种工具都需要发明自己的约定来实现这一点。 而且这不适用于不使用打包器/linter 的开发者。