ZetCode

JavaScript export 关键字

最后修改于 2025 年 4 月 16 日

在本文中,我们将展示如何使用 export 关键字在 JavaScript 模块之间共享代码。 export 语句用于创建 JavaScript 模块。

export 关键字

export 关键字用于从模块导出函数、对象或原始值。 这允许其他模块通过 import 语句使用它们。 导出对于模块化 JavaScript 至关重要。

有两种类型的导出:命名导出和默认导出。 命名导出允许导出多个值,而默认导出每个模块只允许一个。 两者都可以在同一个模块中使用。

无论是否声明,导出都受严格模式的约束。 export 语句不能在嵌入式脚本中使用。 它必须位于具有 .mjs 扩展名或在 script 标签中使用 type="module" 的模块中。

基本命名导出

最简单的形式是使用 export 关键字导出单个声明。

math.mjs
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;
    }
}

此模块导出一个常量、一个函数和一个类。 每个导出都有一个名称,可以单独导入。 导出项可以使用其原始名称供其他模块使用。

要使用这些导出项,另一个模块将使用匹配的名称导入它们。 命名导出必须使用完全相同的名称或使用别名导入。

导出列表

您可以使用导出列表在模块的底部对导出进行分组。

utils.mjs
function greet(name) {
    return `Hello, ${name}!`;
}

const MAX_USERS = 100;

class User {
    constructor(name) {
        this.name = name;
    }
}

export { greet, MAX_USERS, User };

这种方法将声明与导出分开,使模块导出的内容更加清晰。 导出列表可以包含函数、变量和类。 您也可以在此处使用 as 重命名导出。

导出列表通常是较大模块的首选方法,因为它提供了一个查看所有导出的地方。 它也使重命名导出更简单。

默认导出

一个模块可以有一个默认导出,通常用于主要功能。

logger.mjs
export default class Logger {
    static log(message) {
        console.log(`[LOG] ${message}`);
    }
    
    static error(message) {
        console.error(`[ERROR] ${message}`);
    }
}

导入时,默认导出不需要名称。 每个模块只能有一个默认导出。 默认导出通常用于表示模块主要用途的类或函数。

导入时,您可以为默认导出选择任何名称。 默认导出更容易导入,但与命名导出相比,提供的命名不够明确。

组合命名导出和默认导出

一个模块可以同时具有命名导出和默认导出。

config.mjs
const API_KEY = 'abc123';
const MAX_RETRIES = 3;

export default {
    baseUrl: 'https://api.example.com',
    timeout: 5000
};

export { API_KEY, MAX_RETRIES };

在这里,我们导出一个默认配置对象以及一些命名常量。 当一个模块有一个主要导出加上支持导出时,这种模式很常见。

导入时,您将同时使用默认导入和命名导入语法。 默认导出可以是任何有效的 JavaScript 值,包括对象、函数等。

重命名导出

您可以使用 as 关键字重命名导出。

auth.mjs
function validateCredentials(username, password) {
    // validation logic
}

function createToken(user) {
    // token creation logic
}

export {
    validateCredentials as validate,
    createToken as generateToken
};

这会使用与原始声明不同的名称导出函数。 重命名可以帮助避免命名冲突或提供更具描述性的名称。

导入模块将使用导出的名称,而不是原始名称。 当处理第三方模块时,此功能特别有用。

重新导出

您可以从另一个模块重新导出项目,而无需先导入它们。

math-utils.mjs
export { PI, square } from './math.mjs';

export function cube(x) {
    return x * x * x;
}

此模块从 math.mjs 重新导出 PI 和 square,并添加了自己的 cube 函数。 重新导出对于创建组合功能的聚合模块很有用。

原始模块的项在当前模块的范围内不可用。 这纯粹是一个转发导出。 它有助于创建更简洁的公共 API。

使用 export * 的动态导出

您可以一次从另一个模块导出所有命名导出。

all-utils.mjs
export * from './math.mjs';
export * from './logger.mjs';
export * from './auth.mjs';

这会将所有命名导出从多个模块导出到一个模块中。 默认导出不包含在此模式中。 它对于创建公开来自几个子模块的功能的 facade 模块很有用。

在使用 export * 时,请注意命名冲突。 如果多个模块导出具有相同名称的项,则最后导出的模块将获胜。

来源

export - 语言参考

在本文中,我们演示了如何使用 export 关键字在 JavaScript 模块之间共享代码。 我们介绍了命名导出、默认导出和各种导出模式。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

查看 所有 JavaScript 教程。