跳到主内容

使用 Node.js require 与 ES6 导入/导出有什么区别?

· 3分钟阅读

在我正在合作的一个项目中,我们有两种选择可以使用哪个模块系统:

  1. 导入使用的模块require,并使用导出module.exportsexports.foo
  2. 使用 ES6 导入模块,使用 ES6import导出export

使用其中一种是否有任何性能优势?如果我们要使用 ES6 模块而不是 Node 模块,还有什么我们应该知道的吗?

解决方法

自 Node v12(2019 年 4 月)以来,默认启用对 ES 模块的支持,自 Node v15(2020 年 10 月)以来它是稳定的(请参阅此处)。包含节点模块.mjspackage.json文件必须以"type": "module". 该节点的文件有一吨的详细信息,还约 CommonJS 的和 ES 模块之间的互操作。

在性能方面,新功能总是有可能不如现有功能优化得那么好。然而,由于模块文件只评估一次,性能方面可能会被忽略。最后,无论如何,您都必须运行基准测试才能获得明确的答案。

ES 模块可以通过该import()函数动态加载。与 不同require,这会返回一个承诺。

tags: [faq]

以前的答案

使用其中一种是否有任何性能优势?

请记住,目前还没有原生支持 ES6 模块的 Javascript 引擎。你自己说你正在使用 Babel。无论如何,Babel 都会默认转换importexport声明为 CommonJS ( require/ module.exports)。因此,即使您使用 ES6 模块语法,如果您在 Node.js 中运行代码,您也会在幕后使用 CommonJS。

CommonJS 和 ES6 模块之间存在技术差异,例如 CommonJS 允许您动态加载模块。ES6 不允许这样做,但是有一个正在开发的 API

由于 ES6 模块是标准的一部分,我会使用它们。