CommonJS 与 ESM
2025年7月3日 09:47
CommonJS 与 ESM
Node.js 自诞生以来发展出了两套模块系统:CommonJS (CJS) 和 ECMAScript Modules (ESM)。这两套系统在设计理念、语法和使用方式上都有显著差异,理解它们的特性和适用场景对现代 Node.js 开发至关重要。
一、CommonJS:Node.js 的传统模块系统
-
基本特性
CommonJS是2009年随 Node.js 一起出现,其设计目的是问了满足服务端
JavaScript
的模块化需求 -
语法示例
使用require() 导入模块,使用 module.exports 或 exports 导出
// 导入模块 const fs = require('fs'); const { funcA } = require('./moduleA'); // 导出模块 module.exports = { foo: 'bar', doSomething: function() {} }; // 或者 exports.doSomething = function() {};
-
特性
-
同步加载:模块在
require()
调用时立即加载并执行 - 动态依赖:可根据条件动态引入不同模块
-
缓存机制:模块首次加载后会被缓存,后续
require()
调用返回缓存实例,可以通过require.cache
可访问缓存
-
同步加载:模块在
二、ECMAScript Modules (ESM):JavaScript 标准模块系统
-
基本特性
ECMAScript Modules (ESM)
,ES6 (2015) 语言标准的一部分,其目的是为了统一浏览器和服务端的模块系统 -
语法示例
使用 import / export 语法 导入导出
// 导入模块 import fs from 'fs'; import { funcA } from './moduleA.js'; import * as utils from './utils.js'; // 导出模块 export const foo = 'bar'; export function doSomething() {} // 默认导出 export default function() {}
-
特性
-
静态结构:导入导出必须在顶层,不能动态导入(除
import()
) - 异步加载:模块加载过程异步
- 严格模式:默认启用严格模式
-
文件扩展名:必须明确指定(如
.js
或.mjs
)
-
静态结构:导入导出必须在顶层,不能动态导入(除