使用 Node.js require 与 ES6 import/export

2022-08-29 22:04:16

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

  1. 使用 导入模块,并使用 和 导出。requiremodule.exportsexports.foo
  2. 使用 ES6 导入模块,使用 ES6 导出模块importexport

使用一个比另一个有什么性能优势吗?如果我们要使用ES6模块而不是Node模块,我们还需要知道什么吗?


答案 1
更新

自 Node v12(2019 年 4 月)起,默认情况下启用对 ES 模块的支持,并且自 Node v15(2020 年 10 月)以来,它是稳定的(请参阅此处)。包含节点模块的文件必须以 结尾,或者最近的文件必须包含 。Node文档提供了大量更多信息,也涉及CommonJS和ES模块之间的互操作。.mjspackage.json"type": "module"

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

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


上一个答案

使用一个比另一个有什么性能优势吗?

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

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

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


答案 2

您可能需要考虑几种用法/功能:

需要:

  • 在加载的模块名称不是预定义的/static,或者只有在“真正需要”时才有条件地加载模块(取决于某些代码流),则可以进行动态加载。
  • 加载是同步的。这意味着如果您有多个s,它们将被逐个加载和处理。require

ES6 进口:

  • 您可以使用命名导入来有选择地仅加载所需的部分。这可以节省内存。
  • 导入可以是异步的(在当前的ES6模块加载器中,它实际上是异步的),并且可以更好地执行。

此外,“需要”模块系统不是基于标准的。现在ES6模块的存在,它极不可能成为标准。将来,在各种实现中将对ES6模块的本机支持,这在性能方面将是有利的。