CommonJS vs ES Modules

40 阅读1分钟
特性CommonJSES Modules (ESM)
模块加载机制同步动态加载(运行时解析)
任意位置(如 if 语句内)
静态分析(import必须在模块顶层)
异步加载(import(),编译时绑定)
语法 - 导出module.exports = {}exports.xexport {}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 项目新项目/浏览器环境