ES Modules要求导入路径必须为字面量字符串,禁止动态拼接;导出须显式声明(export或export default),不可在条件/函数内执行;路径须带扩展名且以./或../开头;禁用require与import混用。

明确模块导入导出的基本规则
ES Modules 要求使用 字面量字符串路径 作为导入目标,不支持动态拼接或变量占位。例如 import { foo } from './utils.js' 合法,而 import { foo } from './' + 'utils.js' 或 import { foo } from modulePath 会报语法错误。
导出需显式声明:用 export(命名导出)或 export default(默认导出),禁止在条件语句、函数内或循环中动态导出。一个文件最多一个 export default,可有多个命名导出。
统一路径写法与文件后缀处理
所有相对路径以 ./ 或 ../ 开头,禁止省略(如 import x from 'utils' 在纯 ESM 环境下无效,除非配置了打包器别名)。
Node.js 从 v14.13+ 起要求 ESM 中的本地文件导入必须带扩展名(.js、.mjs 或 .cjs)。建议统一使用 .js 并在 package.json 中声明 "type": "module",避免混用 .mjs 带来的工具链兼容问题。
避免混合模块系统与副作用管理
不在同一项目中混用 require() 和 import(尤其不要在 ESM 文件里用 require)。若需兼容 CJS 模块,通过顶层 await import() 动态导入,或借助构建工具做适配。
导出对象应尽量无副作用。初始化逻辑(如全局注册、DOM 操作)放在模块顶层时需谨慎;更推荐封装为函数导出,由调用方显式触发,提升可测试性与按需加载能力。
命名与结构建议
默认导出优先用于「单例对象」或「主功能函数」,如组件、工具类、配置实例;命名导出更适合工具函数集合、常量、类型定义等。
一个模块聚焦单一职责。过大的文件可拆分为:index.js 聚合导出(export { A, B } from './a.js'; export { C } from './c.js';),内部模块保持私有,不直接暴露实现细节。


















