"use module" ?
提案概览
- 阶段: 未分阶段
- 状态: 不活跃
- ECMAScript 版本: —
- 同步时间: 2026年8月26日
- English original · 官方仓库
提案速览
该提案引入了一个带内的 pragma "use module";,用于显式声明源文件为模块,解决脚本和模块之间的歧义。它旨在提高跨宿主环境的可移植性和兼容性,而无需依赖带外机制。
Note
以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。
ECMAScript 提案:"use module";
状态
本提案处于 TC39 流程 的第 1 阶段。
动机
由于 Script 和 Module 语法存在一些重叠(特别是,没有 import 或 export 声明的大多数模块都是有效的脚本),在某些情况下,宿主环境或人类读者可能无法推断一段代码是作为脚本还是模块。
一些宿主环境可能提供带外机制来指定模式,例如 HTML 属性(<script type=module>)、配置参数("module": "main.js")、命令行开关(node -m)或文件扩展名(.mjs)。然而,一个带内的强制模式 pragma 可能由于多种原因而有用:
- 可移植性: 希望在多种宿主环境中工作的源文件可以确保选择其模式,而不受其使用环境中的配置参数影响。
- 兼容性: 如果像 Node 这样的宿主环境选择使用文件扩展名来确定模式,某些内容可能希望在迁移到标准模块时保留现有文件名(例如,对于需要按完整文件名引用模块的客户端)。带内的选择加入使之成为可能。
最后,这是一个 pragma 的事实意味着,不存在正式或概念上歧义的生态系统——特别是完全使用模块编写的生态系统——不需要污染其源代码。
替代方案
今天,程序员可以使用一种编程模式来强制文件是模块:
此语法除了强制宿主环境尝试将其解析为脚本时产生解析错误外,没有其他效果。
这对于可读性来说不是最优的,因为它不能清晰地传达其预期效果。它也不适用于解决强制源文件意图解析为 script 的互补问题。