Get to know MDN better
此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。
export 声明用于从 JavaScript 模块中导出值。导出的值可通过 import 声明或动态导入来将其导入其他程序。导入绑定的值会在导出该绑定的模块中发生变化——当模块更新其导出绑定的值时,更新将在其导入值中可见。
要在源文件中使用 export 声明,运行时必须将该文件解释为模块。在 HTML 中,可通过在 <script> 标记中添加 type="module" 或由其他模块导入来实现。模块会自动以严格模式解释。
要导出的标识符(以便其他脚本通过 import 语句进行导入)。如果使用带有 as 的别名,实际导出的名称可以指定为字符串字面量,但它可能不是有效的标识符。
有两种不同的导出方式,具名导出和默认导出。你能够在每一个模块中定义多个具名导出,但是只允许有一个默认导出。每种方式对应于上述的一种语法:
具名导出:
在 export 关键字之后,你可以使用 let、const 和 var 声明,以及函数或类声明。你还可以使用 export { name1, name2 } 语法导出在其他地方声明的名称列表。请注意,export {} 不会导出一个空对象——它是一个不导出任何东西(一个空的名称列表)的无操作声明。
导出声明不受暂时性死区规则的限制。你可以在声明名称 X 之前声明当前模块导出 X。
默认导出:
备注:导出声明的名称必须相互独立。导出名称重复或使用多个 default 导出将导致 SyntaxError 并阻止模块被执行。
export default 语法允许任何表达式。
作为一种特殊情况,函数和类是作为声明而不是表达式导出的,而且这些声明可以是匿名的。这意味着函数将被提升。
具名导出在需要导出多个值时非常有用。导入此模块时,具名导出必须使用完全相同的名称(可选择用 as 重命名),但默认导出可以使用任何名称导入。例如:
你还可以对具名导出进行重命名,以避免命名冲突:
你可以使用字符串字面量将名称重命名为非有效标识符。例如:
模块还可以“中继”从其他模块导出的值,而无需编写两条单独的导入及导出语句。这在创建一个集中了来自不同模块的各种导出值的单一模块(通常称为“桶模块”)时通常非常有用。
这个可以使用“export from”语法实现:
这类似于 import 和 export 的组合,只是 function1 和 function2 不会在当前模块中可用:
大多数“import from”语法都有对应的“export from”语法。
虽然没有 import * from "mod",但也有 export * from "mod"。这会将 mod 中的所有具名导出重新导出为当前模块的具名导出,但 mod 的默认导出不会被重新导出。如果有两个通配符导出语句隐式地重新导出了相同的名称,则这两个语句都不会被重新导出。
如果试图直接导入重复的名称,则会抛出错。
下面的语法无效,尽管其导入等效:
正确的做法是重新命名这个导出:
“export from”语法允许省略 as 标记,这使得默认导出仍作为默认导出重新导出。
在模块 my-module.js 中,可能包含以下代码:
然后,在你的 HTML 页面的顶级模块中:
着重注意以下几点:
如果我们要导出一个值或得到模块中的返回值,就可以使用默认导出:
然后,在另一个脚本中,可以直接导入默认导出:
举个例子,假如我们有如下层次结构:
你的代码看起来应该像这样:
| ECMAScript® 2027 Language Specification # sec-exports |
启用 JavaScript 以查看此浏览器兼容性表。