es modules中的“复合语法”指在export { }中灵活组合重命名、选择性导出等操作,支持别名与省略但不支持运行时逻辑;合法形式包括重命名多项、混合原名与别名、解构后导出等,禁止表达式、动态名称及控制语句。

ES Modules 中的“复合语法”在命名导出中,指的是在 export { ... } 语句里同时完成变量声明、重命名、条件筛选或解构式导出等操作。它不是新增语法,而是对已有 export 语句的灵活组合用法,核心是 统一导出语句(export { })支持别名、省略、选择性导出,但不支持运行时逻辑(如 if 或函数调用)。
命名导出中的复合写法常见形式
以下都是合法且常用的复合导出写法:
-
导出时重命名多个项:
export { PI as circlePi, add as sum, subtract as diff }; -
混合原始名称与重命名:
export { name, age, sayHello as greet, Person as User }; -
从同一对象中解构并导出(需先解构赋值):
const config = { apiUrl: 'https://api.dev', timeout: 5000 };<br>const { apiUrl, timeout } = config;<br>export { apiUrl, timeout }; -
导出常量+函数+类的一体化声明:
export { DEFAULT_LIMIT, fetchUser, UserClass, STATUS_CODES }; -
配合默认导出共存(即混合导出):
export const version = '2.1.0';<br>export default function run() { /* ... */ }(注意:这不算“复合语法”,但属于命名导出与默认导出的共存结构)
不能做的“伪复合”操作
这些看似简洁,但在 ES Module 中语法错误或不被允许:
- ❌ 在
export { }内直接写表达式或解构赋值:export { config.apiUrl as api, Math.max(1, 2) as maxVal };(报错:非标识符) - ❌ 动态生成导出名(无字符串模板或计算属性):
const key = 'data'; export { value as key };(key 被当作字面量名,不是变量值) - ❌ 在
export { }中使用 if / for / await 等语句(顶层限制)
实用建议:如何写出清晰的复合命名导出
为提升可维护性,推荐以下实践:
- 把所有要导出的变量/函数/类在模块顶部集中声明,再用一个
export { ... }统一管理; - 导出名尽量语义明确,避免缩写歧义(如
sum比s更安全); - 大型工具模块可按功能分组导出,用注释分隔:
// ? Math utilities<br>export { add, multiply, PI };<br>// ? Network helpers<br>export { fetchJson, timeoutPromise as withTimeout }; - 导出前做类型/存在性检查?需在
export之前完成(如if (typeof window !== 'undefined') { export { domHelper } }❌ 不行;应改用动态导入或构建时条件)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











