CommonJS 是 Node 的原生模块规范:require() 同步加载模块,module.exports 导出。它是「运行时」的:require 可以写在 if 里、导出值可以是动态计算结果,模块输出的是「值的拷贝」。
ESM 是语言标准(import/export),静态结构可在编译期做 Tree Shaking,导出是「值的绑定」。Node 双规范并存:靠 package.json 的 "type": "module" 或文件后缀(.mjs 强制 ESM、.cjs 强制 CJS)区分。两套系统互操作有讲究:CJS require ESM 要用动态 import();ESM import CJS 只能 default 导入或具名导出兼容的包。新项目统一 ESM。
// ---- CommonJS(math.cjs)---- const PI = 3.14; function add(a, b) { return a + b; } module.exports = { PI, add }; // 导出 // 使用:const { add } = require('./math'); // ---- ESM(math.mjs)---- export const PI = 3.14; // 具名导出 export function add(a, b) { return a + b; } export default function multiply() {} // 默认导出 // 使用:import add, { PI } from './math.mjs'; // ---- 互操作:CJS 里异步加载 ESM ---- // (require 不支持 ESM,只能动态 import) async function load() { const { add } = await import('./math.mjs'); return add(1, 2); }