Node.js 中 CommonJS 和 es6 Modules 的区别

2025年3月5日 | 阅读 4 分钟

模块是组织代码成可重用部分的方式。这是 Node.js 中的一个基本概念。CommonJSes6 模块(也称为 ES 模块或 ECMAScript 模块)是两种流行的模块系统。尽管它们的目的相同,但在行为、语法等方面存在一些差异。

什么是 CommonJS?

模块使用 module.exports 或 exports 导出,并使用 require() 函数导入模块。它是一个 JavaScript 模块系统,主要用于帮助大型项目的代码。它是默认的模块格式,用于服务器端 JavaScript 开发。

语法

它具有以下语法:

什么是 es6 模块?

ES6 中的模块使用 import 和 export 关键字进行导入和导出。

语法

它具有以下语法:

CommonJS 和 es6 模块之间的主要区别

Difference between CommonJS and es6 Modules in Node.js

Node.js 中的 CommonJses6 模块 之间存在几个主要区别。一些主要区别如下:

特点CommonJSEs6 模块
功能CommonJS 模块必须先从模块仓库(如 npm)加载。CommonJS 模块仅在 Node.js 应用程序中可用。CommonJS 模块没有 exports 或 prototypes,而 ES 模块有。最后但同样重要的是,ES 模块中的 import() 函数和 CommonJS 中的 require() 函数不兼容。
编译CommonJS 基于 Microsoft 的 AMD API。AMD 和 CommonJS 中不同的模块,可以以 AMD 方式编写的模块,也可以使用 JS 上下文来编写。Google 引入了一个新的模块系统 ES Modules,旨在为编程世界带来更多的模块化和跨语言可重用性。与 CommonJS 模块相比,使用 ES Modules 的好处是它们可以编译成原生代码,这使得它们更快、更高效。
依赖关系浏览器和 Node.js 支持 AMD 兼容的 CommonJS 模块。虽然 AMD 不支持 ES 模块,但可以通过 webpack 模块加载器在浏览器中支持它们。
-g 安装带有 npm 的 node.js 要使用 Yeoman,请使用 -g 选项安装 npm。
除了模块加载器,ES 模块不需要任何额外的组件。一些开发工具可能需要 Babel 和其他附加库。
yarn add babel babel-cli babel-preset-env
出口一种常见且有效的代码模块化方式是使用 CommonJS 模块。它们使用 export 关键字使变量和函数能够从其他模块获得访问权限。CommonJS 中使用的模块结构已通过 ES 模块进行了更新。它们也使用 export 关键字以及 require() 函数,这使得可以轻松地以自动化方式将更多 ES 模块添加到您的项目中。
进口CommonJS 模块在 Node.js 应用程序中非常受欢迎,因为它们允许集中式代码管理,并且开发者无需额外配置。在基于浏览器的应用程序中,开发人员更喜欢使用 ES 模块,因为它们可以异步加载,并且不依赖于任何底层运行时环境(如 Node.js)。
加载和评估这意味着模块是同步加载的;因此,当需要模块时,其代码会立即执行。
CommonJS 模块通常在 Node.js 环境中使用,因为它们通常在运行时加载。
模块的异步加载发生。
由于 import 是在顶层而不是有条件地执行的,因此 ES6 模块可以进行静态分析,从而使工具能够优化和“摇树”(tree-shake)不必要的代码。
互操作性Node.js 原生支持 CommonJS,并且长期以来一直是该框架中的默认模块系统。然而,与 ES6 模块的互操作性可能存在问题。可能需要额外的设置或工具才能将 ES6 模块和 CommonJS 无缝集成到同一个项目中。这意味着模块是同步加载的;因此,当需要模块时,其代码会立即执行。从 12 版开始,我们可以通过一些设置(package.json 中的 type: "module" 或使用 .mjs 文件扩展名)在 Node.js 中使用 ES6 模块的原生支持。

结论

总之,ES6 和 CommonJS 模块代表了 Node.js 中两种不同的模块化方法,各有其特殊的优点和特性。名为 CommonJS 的经典 Node.js 模块系统由于其历史悠久和实用性,仍然被广泛使用。然而,新的异步 ES6 模块(随 ECMAScript 2015 发布)提供了一种增强的方法,通过 import 和 export 语句,可以实现更好的优化、静态分析,并与现代 JavaScript 方法兼容。随着 Node.js 采用和支持 ES6 模块,开发人员将可以自由选择最适合他们需求的模块系统;然而,由于与更大的 JavaScript 生态系统具有更高的兼容性,新的开发将逐渐采用 ES6 模块。