CommonJS 和 ES modules (ESM) 是两种不同的模块系统,它们用于组织 JavaScript 代码,并允许不同文件之间共享代码。
CommonJS (CJS)
CommonJS 是最早的 JavaScript 模块化规范之一,主要用于 Node.js 环境中。CommonJS 规定每个文件都是一个模块,拥有独立的作用域。模块导出成员的方式是通过 exports
对象,通常会看到如下的模式:
// 导出模块成员
module.exports = {someFunction: function() {// 函数实现}
}// 或者简写形式
exports.someFunction = function() {// 函数实现
}
然后在其他模块中导入这些成员:
const myModule = require('./path/to/module');
myModule.someFunction();
require
是一个同步操作,意味着在 require
调用时,整个模块会被加载完毕并准备好使用。
ES modules (ESM)
ES modules 是 ECMAScript 标准的一部分,自 ECMAScript 2015 (ES6) 开始引入。它们提供了一种更现代的方法来导入和导出模块成员。ESM 使用 import
和 export
关键字来定义模块接口:
// 导出模块成员
export const someFunction = () => {// 函数实现
};// 在另一个文件中导入
import { someFunction } from './path/to/module';
someFunction();
ES modules 支持静态分析,因此导入可以在编译时进行优化。它们也支持动态导入 (import()
表达式),这是一种异步操作,可以延迟加载模块直到需要它们的时候。
CJS vs ESM
- 互操作性:Node.js 支持两种模块系统的互操作性,意味着您可以在同一个项目中混合使用 CJS 和 ESM。
- 语法差异:CJS 使用
require
,而 ESM 使用import/export
。 - 异步加载:虽然 CJS 的
require
是同步的,但 ESM 可以使用import()
动态导入模块,这是异步的。 - 模块加载:ESM 在加载时会先解析所有依赖项,然后再执行模块中的代码;而 CJS 是按顺序执行,并立即可用。
为了在 Node.js 中使用 ESM,您需要在文件名后缀使用 .mjs
或者在 package.json
文件中指定 "type": "module"
。
希望这能帮助您理解 CommonJS 和 ES modules 之间的区别。如果您有更多关于这两种模块系统的问题,欢迎继续提问!