JavaScript export 关键字
最后修改于 2025 年 4 月 16 日
在本文中,我们将展示如何使用 export 关键字在 JavaScript 模块之间共享代码。 export 语句用于创建 JavaScript 模块。
export 关键字
export 关键字用于从模块导出函数、对象或原始值。 这允许其他模块通过 import 语句使用它们。 导出对于模块化 JavaScript 至关重要。
有两种类型的导出:命名导出和默认导出。 命名导出允许导出多个值,而默认导出每个模块只允许一个。 两者都可以在同一个模块中使用。
无论是否声明,导出都受严格模式的约束。 export 语句不能在嵌入式脚本中使用。 它必须位于具有 .mjs 扩展名或在 script 标签中使用 type="module" 的模块中。
基本命名导出
最简单的形式是使用 export 关键字导出单个声明。
export const PI = 3.14159;
export function square(x) {
return x * x;
}
export class Circle {
constructor(radius) {
this.radius = radius;
}
area() {
return PI * this.radius ** 2;
}
}
此模块导出一个常量、一个函数和一个类。 每个导出都有一个名称,可以单独导入。 导出项可以使用其原始名称供其他模块使用。
要使用这些导出项,另一个模块将使用匹配的名称导入它们。 命名导出必须使用完全相同的名称或使用别名导入。
导出列表
您可以使用导出列表在模块的底部对导出进行分组。
function greet(name) {
return `Hello, ${name}!`;
}
const MAX_USERS = 100;
class User {
constructor(name) {
this.name = name;
}
}
export { greet, MAX_USERS, User };
这种方法将声明与导出分开,使模块导出的内容更加清晰。 导出列表可以包含函数、变量和类。 您也可以在此处使用 as 重命名导出。
导出列表通常是较大模块的首选方法,因为它提供了一个查看所有导出的地方。 它也使重命名导出更简单。
默认导出
一个模块可以有一个默认导出,通常用于主要功能。
export default class Logger {
static log(message) {
console.log(`[LOG] ${message}`);
}
static error(message) {
console.error(`[ERROR] ${message}`);
}
}
导入时,默认导出不需要名称。 每个模块只能有一个默认导出。 默认导出通常用于表示模块主要用途的类或函数。
导入时,您可以为默认导出选择任何名称。 默认导出更容易导入,但与命名导出相比,提供的命名不够明确。
组合命名导出和默认导出
一个模块可以同时具有命名导出和默认导出。
const API_KEY = 'abc123';
const MAX_RETRIES = 3;
export default {
baseUrl: 'https://api.example.com',
timeout: 5000
};
export { API_KEY, MAX_RETRIES };
在这里,我们导出一个默认配置对象以及一些命名常量。 当一个模块有一个主要导出加上支持导出时,这种模式很常见。
导入时,您将同时使用默认导入和命名导入语法。 默认导出可以是任何有效的 JavaScript 值,包括对象、函数等。
重命名导出
您可以使用 as 关键字重命名导出。
function validateCredentials(username, password) {
// validation logic
}
function createToken(user) {
// token creation logic
}
export {
validateCredentials as validate,
createToken as generateToken
};
这会使用与原始声明不同的名称导出函数。 重命名可以帮助避免命名冲突或提供更具描述性的名称。
导入模块将使用导出的名称,而不是原始名称。 当处理第三方模块时,此功能特别有用。
重新导出
您可以从另一个模块重新导出项目,而无需先导入它们。
export { PI, square } from './math.mjs';
export function cube(x) {
return x * x * x;
}
此模块从 math.mjs 重新导出 PI 和 square,并添加了自己的 cube 函数。 重新导出对于创建组合功能的聚合模块很有用。
原始模块的项在当前模块的范围内不可用。 这纯粹是一个转发导出。 它有助于创建更简洁的公共 API。
使用 export * 的动态导出
您可以一次从另一个模块导出所有命名导出。
export * from './math.mjs'; export * from './logger.mjs'; export * from './auth.mjs';
这会将所有命名导出从多个模块导出到一个模块中。 默认导出不包含在此模式中。 它对于创建公开来自几个子模块的功能的 facade 模块很有用。
在使用 export * 时,请注意命名冲突。 如果多个模块导出具有相同名称的项,则最后导出的模块将获胜。
来源
在本文中,我们演示了如何使用 export 关键字在 JavaScript 模块之间共享代码。 我们介绍了命名导出、默认导出和各种导出模式。