CommonJS 与 ESModule 模块化的区别
CommonJS和ESModule(ESM)是两种在JavaScript中定义模块化的规范。它们有一些显著的区别:
1. 定义与使用
CommonJS
- 定义模块:使用 require 导入模块,module.exports 导出模块。
- 导入模块:
javascript
复制代码
const module = require('module');
- 导出模块:
javascript
复制代码
module.exports = value;
ESModule
- 定义模块:使用 import 导入模块,export 导出模块。
- 导入模块:
javascript
复制代码
import module from 'module';
import { specificExport } from 'module';
- 导出模块:
javascript
复制代码
export const value = 'value';
export default value;
2. 加载时机
CommonJS
- 同步加载:模块在运行时同步加载,require 调用时立即加载并执行模块内容。
- 加载机制:服务器端(如Node.js)常用,适用于同步的环境。
ESModule
- 异步加载:模块在编译时静态解析,import 导入是异步的,可以在浏览器中使用。
- 加载机制:浏览器和现代JavaScript环境中使用,支持静态分析和更优化的打包。
3. 语法与特性
CommonJS
- 动态加载:可以在代码运行时条件性地加载模块。
javascript
复制代码
if (condition) {
const module = require('module');
}
- 导出值:可以导出单个值、对象、函数等。
ESModule
- 静态加载:导入语句必须位于模块的顶层作用域,不支持条件性导入。
javascript
复制代码
import module from 'module'; // 必须在顶层作用域
- 严格模式:默认在严格模式下运行,避免了一些常见的错误。
4. 兼容性与转换
CommonJS
- 兼容性:主要用于Node.js环境,浏览器中使用时需要工具(如Browserify)进行打包。
- 转ESM:可以通过工具如Babel或Webpack将CommonJS模块转换为ESModule。
ESModule
- 兼容性:现代浏览器和JavaScript环境(如Node.js 12+)中原生支持。
- 转CommonJS:通过工具如Babel可以将ESModule转换为CommonJS模块。