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/year/pending/proposal-modules-pragma.md.
  • 简体中文
  • "use module" ?

    提案概览
    提案速览

    该提案引入了一个带内的 pragma "use module";,用于显式声明源文件为模块,解决脚本和模块之间的歧义。它旨在提高跨宿主环境的可移植性和兼容性,而无需依赖带外机制。

    Note

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

    ECMAScript 提案:"use module";

    状态

    本提案处于 TC39 流程 的第 1 阶段。

    动机

    由于 ScriptModule 语法存在一些重叠(特别是,没有 importexport 声明的大多数模块都是有效的脚本),在某些情况下,宿主环境或人类读者可能无法推断一段代码是作为脚本还是模块。

    一些宿主环境可能提供带外机制来指定模式,例如 HTML 属性(<script type=module>)、配置参数("module": "main.js")、命令行开关(node -m)或文件扩展名(.mjs)。然而,一个带内的强制模式 pragma 可能由于多种原因而有用:

    • 可移植性: 希望在多种宿主环境中工作的源文件可以确保选择其模式,而不受其使用环境中的配置参数影响。
    • 兼容性: 如果像 Node 这样的宿主环境选择使用文件扩展名来确定模式,某些内容可能希望在迁移到标准模块时保留现有文件名(例如,对于需要按完整文件名引用模块的客户端)。带内的选择加入使之成为可能。

    最后,这是一个 pragma 的事实意味着,不存在正式或概念上歧义的生态系统——特别是完全使用模块编写的生态系统——不需要污染其源代码。

    替代方案

    今天,程序员可以使用一种编程模式来强制文件是模块:

    export {};

    此语法除了强制宿主环境尝试将其解析为脚本时产生解析错误外,没有其他效果。

    这对于可读性来说不是最优的,因为它不能清晰地传达其预期效果。它也不适用于解决强制源文件意图解析为 script 的互补问题。

    规范