export v from "mod"; statements S1
中文标题:export v from "mod"; 语句
- 阶段: Stage 1
- 状态: 进行中
- ECMAScript 版本: —
- 同步时间: 2026年8月26日
- English original · 官方仓库
该提案解决了默认导出缺乏对称的 export from 语句的问题,目前需要两步导入再导出或冗长的 export { default } from。该提案保持了与导入语句的语法和语义对称性,并包含对相关提案的讨论。
以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。
ECMAScript 提案:export default from
阶段: 1
作者: Lee Byron
审阅者: Caridy Patiño
规范: https://tc39.github.io/proposal-export-default-from/
AST: ESTree.md
转译器: 参见 Babel 的 export-default-from 插件。
注意:与 export-ns-from 提案密切相关。
问题陈述与理由
export ___ from "module" 语句是一种以声明方式构建“包”模块的非常有用的机制。在 ECMAScript 2015 规范中,我们可以:
- 通过
export {x} from "mod"导出单个导出项 - ... 可选择使用
export {x as v} from "mod"重命名。 - 我们也可以使用
export * from "mod"展开所有导出。
如果你理解类似形式的导入语句的语义,这三种 export-from 语句就很容易理解。
然而,有一种导入语句没有对应的 export-from 语句,即将 ModuleNameSpace 对象作为命名导出导出。
示例:
当前 ECMAScript 2015 模块:
拟议的增加:
导入和导出之间的对称性
export-from 语句与它们所对应的 import 语句之间存在句法对称性。也存在语义对称性;导入在本地创建命名绑定,而 export-from 则创建导出条目。
作为现有示例:
如果 v 随后需要被导出,可以接着使用 export。但是,如果 v 在本地作用域中未被使用,那么它不必要地向本地作用域引入了一个名称。
一条单独的“export from”行直接创建导出条目,并且不会改变本地作用域。它与类似的“import from”语句是对称的。
这提供了一种开发体验,即期望将 import 替换为 export 将总是提供这种对称行为。
然而,当这种对称性存在缺口时,可能导致令人困惑的行为:
“我想补充一些用例证据。当我开始使用 ES6(通过 Babel)并发现导入可以被重新导出时,我假设功能集是对称的,结果却惊讶地发现并非如此。我希望看到这个规范完善我认为在 ES6 中略显不完整的功能集。”
- @jasonkuhrt
“我也遇到了这个问题,甚至以为这是 Babel 的一个 bug。”
- @gaearon
拟议的增加:
提出的增加遵循同样的对称模式:
导入“default”名称(现有):
导出该名称(现有):
对称的“export from”(拟议):
复合“export from”语句:
该提案还包括复合导入的对称 export-from:
导入“default”名称以及命名导出(现有):
导出那些名称(现有):
对称的“export from”(拟议):
注意:复合形式必须也支持 export-ns-from,如果两个提案都被接受:
将默认导出作为默认导出:
一个用例是将内部模块的默认导出作为外部模块的默认导出导出。这可以写成:
这与(现有的)导入形式对称:
这不是在已经提出的语法之外的额外语法。实际上,这只是 export v from "mod" 语法,其中导出名称恰好是 default。这很好地镜像了其他 export default ____ 形式,在语法和语义上都不需要额外的规范。为了支持这种情况,需要对现有的前瞻限制进行修改。
常见问题:
即使你已经可以通过
export { default } from "mod"做到这一点,我们还需要这个吗?
是的!确实,你已经可以从模块的默认导出中“导出”而不改变本地作用域:
你甚至可以重命名默认导出:
这有一个好处,它很明确且与“import”形式对称:
然而,该提案的目的不是为了启用新的用例,而是为了提供一种现有的、期望的语法形式,这种形式支持“default”导出。
那个“import”示例不经常被输入,因为有更优选的简短语法:
该提案认为,类似的简短语法也应该存在于对称的“export from”形式中:
显示对称性的表格
使用 ECMAScript 2015 中 Table 40 和 Table 42 的术语,export-from 形式可以通过将 export-from 的 [[ExportName]] 设置为导入的 [[LocalName]],并将 export-from 的 [[LocalName]] 设置为 null,从对称的导入形式创建。