ES Modules 禁止同一模块内重复导出同名标识符,属编译期语法限制;默认导出与命名导出互不冲突;导入时可用 as 重命名解决外部命名冲突;动态导出非法,所有导出必须静态可分析。

ES Modules 不允许同一模块内重复导出同名标识符,编译阶段就会报错,不是运行时冲突,而是语法级限制。
导出名必须唯一
一个模块中不能多次用 export 声明同一个名字,无论是否为命名导出或默认导出。例如:
❌ 错误写法(直接报 SyntaxError):
export const foo = 1;<br>export const foo = 2; // 报错:Identifier 'foo' has already been declared
立即学习“Java免费学习笔记(深入)”;
export function bar() {}<br>export const bar = () => {}; // 同样报错
这种检查发生在 JS 引擎解析模块时,属于静态语法分析,不依赖执行顺序,也不受作用域嵌套影响。
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
默认导出与命名导出互不干扰
默认导出(export default)和命名导出(export const / function / ...)使用的是不同导出槽位,因此不会冲突:
-
export default function() {}占用default槽 -
export const default = 42是非法的(default是保留字,不能作为命名导出名) - 但
export const somethingElse = 42完全合法,和 default 并存
重命名可解决外部导入时的命名冲突
当多个模块导出同名变量(如都导出 utils),冲突发生在导入方,而非导出方。这时用 as 重命名即可隔离:
import { helper as helperA } from './module-a.js';<br>import { helper as helperB } from './module-b.js';
导入别名只作用于当前模块作用域,不影响原模块导出结构,也不改变其他模块的导入方式。
动态导出无法绕过静态检查
ESM 不支持运行时动态构造导出列表(比如循环生成 export),所有导出必须是静态可分析的。以下写法非法:
// ❌ 语法错误,ESM 不允许<br>for (const key of ['a', 'b']) {<br> export { [key]: key };<br>}
这意味着重复导出问题在开发阶段就被拦截,不会漏到构建或上线环节。

















