| 特性 | CommonJS | ES Modules (ESM) |
|---|---|---|
| 模块加载机制 | 同步动态加载(运行时解析) 任意位置(如 if 语句内) | 静态分析(import必须在模块顶层) 异步加载(import(),编译时绑定) |
| 语法 - 导出 | module.exports = {}或 exports.x | export {}或 export default |
| 语法 - 导入 | const x = require('module') | 静态:import x from 'module' 动态: import('module') |
| 动态/静态 | 完全动态(运行时解析依赖) | 静态为主(编译时分析),动态补充 |
| 循环依赖处理 | 值的拷贝(可能不完整),可能拿到未完成的 module.exports(空对象) | 实时绑定(静态引用),拿到未初始化的引用(但不会报错) |
| 运行环境 | Node.js 传统默认 | 浏览器原生 + Node.js 12+ |
| 互操作限制 | 需用 import() 动态加载ESM | 需用 default 导入CJS |
| Tree Shaking | 不支持 | 支持 |
| 典型使用场景 | 传统 Node.js 项目 | 新项目/浏览器环境 |