在 Nodejs 后端项目中使用 ES 模块相对于 CommonJS 模块是否有性能优势或劣势?我问这个问题是因为我看到很多人仍在使用 CJS,即使较新版本的 NodeJS 完全支持 ES 模块。
import 语句可以引用 ES 模块或 CommonJS 模块。 import 语句仅允许在 ES 模块中使用,但 CommonJS 中支持动态 import() 表达式来加载 ES 模块。
导入 CommonJS 模块时,提供
module.exports
对象作为默认导出。命名导出可能可用,由静态分析提供,以方便实现更好的生态系统兼容性。
CommonJS 和 ES 模块的主要区别在于同步和异步性质,这可能会影响性能:
我确实有一个具有嵌套导入/导出的模块。其中约 100 个来自约 15 个文件。该包是用 ESM 编写的,Commonjs 支持是用 Babel 完成的。我做了一个非常简单的测试,仅从包中导入基本类并对其进行控制台。
使用 commonjs 导入基本类比使用 ESM 更快。 差异虽小但可见。
?> time node index.cjs
> 0.15
?> time node index.mjs
> 0.25
这可能只是我的 npm 包,但在这种情况下它非常一致。在节点 20 上运行。