CommonJS 和 ES Module 是 JavaScript 中两种主流的模块化规范,它们帮助开发者更好地组织和管理代码。下面这个表格能让你快速抓住它们的核心区别。
| 特性 | CommonJS | ES Module (ESM) |
|---|---|---|
| 设计初衷 | 主要为服务器端(Node.js)设计 | 作为官方的 ECMAScript 标准,用于浏览器和服务器 |
| 语法关键词 | require()和 module.exports/exports | import和 export |
| 加载方式 | 同步加载(运行时) | 异步加载(编译时确定依赖,支持静态分析) |
| 输出特性 | 值的拷贝。一旦导出,模块内部变化不影响已导入的值。 | 值的引用(动态绑定)。导入的值会随导出模块内部的变化而更新。 |
| 适用环境 | 传统上主要用于 Node.js,在浏览器中需借助打包工具 | 现代浏览器和 Node.js 均原生支持 |
| Tree Shaking | 不支持静态分析,难以进行有效的 Tree Shaking | 天然支持,打包工具可消除未使用代码 |
| 循环依赖处理 | 返回已执行部分的值,可能导致不完整的结果 | 通过引用绑定处理,相对更安全 |
顶层 this指向 | 指向当前模块 | 指向 undefined |
| 动态导入 | require()可在代码块中动态调用 | 使用 import()函数实现动态导入 |