在我正在合作的一个项目中,我们有两种选择可以使用哪个模块系统:
- 导入使用的模块
require
,并使用导出module.exports
和exports.foo
。 - 使用 ES6 导入模块,使用 ES6
import
导出export
使用其中一种是否有任何性能优势?如果我们要使用 ES6 模块而不是 Node 模块,还有什么我们应该知道的吗?
解决方法
自 Node v12(2019 年 4 月)以来,默认启用对 ES 模块的支持,自 Node v15(2020 年 10 月)以来它是稳定的(请参阅此处)。包含节点模块.mjs
的package.json
文件必须以"type": "module"
. 该节点的文件有一吨的详细信息,还约 CommonJS 的和 ES 模块之间的互操作。
在性能方面,新功能总是有可能不如现有功能优化得那么好。然而,由于模块文件只评估一次,性能方面可能会被忽略。最后,无论如何,您都必须运行基准测试才能获得明确的答案。
ES 模块可以通过该import()
函数动态加载。与 不同require
,这会返回一个承诺。
tags: [faq]
以前的答案
使用其中一种是否有任何性能优势?
请记住,目前还没有原生支持 ES6 模块的 Javascript 引擎。你自己说你正在使用 Babel。无论如何,Babel 都会默认转换import
并export
声明为 CommonJS ( require
/ module.exports
)。因此,即使您使用 ES6 模块语法,如果您在 Node.js 中运行代码,您也会在幕后使用 CommonJS。
CommonJS 和 ES6 模块之间存在技术差异,例如 CommonJS 允许您动态加载模块。ES6 不允许这样做,但是有一个正在开发的 API。
由于 ES6 模块是标准的一部分,我会使用它们。