es modules 支持逐个导出、集中导出和混合默认+命名导出三种方式:逐个导出语义清晰利于 tree-shaking;集中导出便于维护与重命名;混合导出兼顾便捷性与灵活性;需注意命名导入需大括号、导出须已声明、名称不重复、且为实时绑定。

在 ES Modules 中,声明时直接导出多个接口,就是对每个变量、函数或类加上 export 关键字。这种方式语义清晰、便于静态分析,也利于 tree-shaking。
逐个加 export 最直观
适用于接口数量不多、希望导出逻辑一目了然的场景:
-
导出常量:
export const API_BASE_URL = 'https://api.example.com'; -
导出函数:
export function requestGet(url) { return fetch(url); } -
导出类:
export class ApiClient { constructor() { this.timeout = 5000; } } -
导出箭头函数:
export const formatId = (id) => `ID-${id}`;
集中导出更利于维护
当模块内接口较多,或需要统一管理导出列表(比如做重命名、筛选、文档标注),推荐先声明再集中导出:
- 先定义所有接口:
const API_VERSION = 'v1'; const MAX_RETRY = 3; function handleError() { /* ... */ } - 再用
export { API_VERSION, MAX_RETRY, handleError };一次性导出 - 支持别名:
export { handleError as handleApiError };
混合默认 + 命名导出很实用
适合封装工具集或 SDK:把最常用、最核心的接口设为默认导出,其余作为命名导出:
export const timeout = 10000;export const headers = { 'Content-Type': 'application/json' };export default function request(url, options) { return fetch(url, { ...options }); }
这样导入时既可 import request from './api.js',也可 import request, { timeout, headers } from './api.js'。
注意几个关键点
- 导入命名导出必须用大括号:
import { timeout, headers } from './api.js' - 导出的变量/函数必须已声明,不能导出未声明的标识符(如
export foo;报错) - 命名导出名不能重复,也不能和默认导出同名冲突
- 导出的是实时绑定(live binding),不是值拷贝——修改源模块中的值,导入处也会反映变化
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











