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/stage/1/proposal-export-default-from.md.
  • 简体中文
  • export v from "mod"; statements S1

    中文标题:export v from "mod"; 语句

    提案概览
    提案速览

    该提案解决了默认导出缺乏对称的 export from 语句的问题,目前需要两步导入再导出或冗长的 export { default } from。该提案保持了与导入语句的语法和语义对称性,并包含对相关提案的讨论。

    Note

    以下 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 对象作为命名导出导出。

    示例:

    export someIdentifier from "someModule";
    export someIdentifier, { namedIdentifier } from "someModule";

    当前 ECMAScript 2015 模块:

    导入语句形式[[ModuleRequest]][[ImportName]][[LocalName]]
    import v from "mod";"mod""default""v"
    import * as ns from "mod";"mod""*""ns"
    import {x} from "mod";"mod""x""x"
    import {x as v} from "mod";"mod""x""v"
    import "mod";
    导出语句形式[[ModuleRequest]][[ImportName]][[LocalName]][[ExportName]]
    export var v;nullnull"v""v"
    export default function f(){};nullnull"f""default"
    export default function(){};nullnull"*default*""default"
    export default 42;nullnull"*default*""default"
    export {x};nullnull"x""x"
    export {x as v};nullnull"x""v"
    export * as ns from "mod";"mod""*"null"ns"
    export {x} from "mod";"mod""x"null"x"
    export {x as v} from "mod";"mod""x"null"v"
    export * from "mod";"mod""*"nullnull

    拟议的增加:

    导出语句形式[[ModuleRequest]][[ImportName]][[LocalName]][[ExportName]]
    export v from "mod";"mod""default"null"v"

    导入和导出之间的对称性

    export-from 语句与它们所对应的 import 语句之间存在句法对称性。也存在语义对称性;导入在本地创建命名绑定,而 export-from 则创建导出条目。

    作为现有示例:

    import {v} from "mod";

    如果 v 随后需要被导出,可以接着使用 export。但是,如果 v 在本地作用域中未被使用,那么它不必要地向本地作用域引入了一个名称。

    import {v} from "mod";
    export {v};

    一条单独的“export from”行直接创建导出条目,并且不会改变本地作用域。它与类似的“import from”语句是对称的

    export {v} from "mod";

    这提供了一种开发体验,即期望将 import 替换为 export 将总是提供这种对称行为。

    然而,当这种对称性存在缺口时,可能导致令人困惑的行为:

    “我想补充一些用例证据。当我开始使用 ES6(通过 Babel)并发现导入可以被重新导出时,我假设功能集是对称的,结果却惊讶地发现并非如此。我希望看到这个规范完善我认为在 ES6 中略显不完整的功能集。”

    • @jasonkuhrt

    “我也遇到了这个问题,甚至以为这是 Babel 的一个 bug。”

    • @gaearon

    拟议的增加:

    提出的增加遵循同样的对称模式:

    导入“default”名称(现有):

    import v from "mod";

    导出该名称(现有):

    import v from "mod";
    export {v};

    对称的“export from”(拟议):

    export v from "mod";

    复合“export from”语句:

    该提案还包括复合导入的对称 export-from:

    导入“default”名称以及命名导出(现有):

    import v, { x, y as w } from "mod";

    导出那些名称(现有):

    import v, { x, y as w } from "mod";
    export { v, x, w };

    对称的“export from”(拟议):

    export v, {x, y as w} from "mod";

    注意:复合形式必须也支持 export-ns-from,如果两个提案都被接受:

    export v, * as ns from "mod";

    将默认导出作为默认导出:

    一个用例是将内部模块的默认导出作为外部模块的默认导出导出。这可以写成:

    export default from "mod";

    这与(现有的)导入形式对称:

    import default from "mod";
    export { default };

    不是在已经提出的语法之外的额外语法。实际上,这只是 export v from "mod" 语法,其中导出名称恰好是 default。这很好地镜像了其他 export default ____ 形式,在语法和语义上都不需要额外的规范。为了支持这种情况,需要对现有的前瞻限制进行修改。

    常见问题:

    即使你已经可以通过 export { default } from "mod" 做到这一点,我们还需要这个吗?

    是的!确实,你已经可以从模块的默认导出中“导出”而不改变本地作用域:

    export { default } from "mod";

    你甚至可以重命名默认导出:

    export { default as someIdentifier } from "mod"

    这有一个好处,它很明确且与“import”形式对称:

    import { default as someIdentifier } from "mod"

    然而,该提案的目的不是为了启用新的用例,而是为了提供一种现有的、期望的语法形式,这种形式支持“default”导出。

    那个“import”示例不经常被输入,因为有更优选的简短语法:

    import someIdentifier from "mod"

    该提案认为,类似的简短语法也应该存在于对称的“export from”形式中:

    export someIdentifier from "mod"

    显示对称性的表格

    使用 ECMAScript 2015 中 Table 40Table 42 的术语,export-from 形式可以通过将 export-from 的 [[ExportName]] 设置为导入的 [[LocalName]],并将 export-from 的 [[LocalName]] 设置为 null,从对称的导入形式创建。

    语句形式[[ModuleRequest]][[ImportName]][[LocalName]][[ExportName]]
    import v from "mod";"mod""default""v"
    export v from "mod";"mod""default"null"v"
    import {x} from "mod";"mod""x""x"
    export {x} from "mod";"mod""x"null"x"
    import {x as v} from "mod";"mod""x""v"
    export {x as v} from "mod";"mod""x"null"v"
    import * as ns from "mod";"mod""*""ns"
    export * as ns from "mod";"mod""*"null"ns"
    export * from "mod";"mod""*"nullnull (many)