使用Node.js需要与ES6导入/导出

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

  1. 使用require导入模块,并使用module.exportsmodule.exports导出。
  2. 使用ES6 import导入模块,并使用ES6 export

使用其中一个有什么性能好处? 如果我们要在节点上使用ES6模块,还有什么我们应该知道的吗?

使用其中一个有什么性能好处?

请记住,目前还没有支持ES6模块的JavaScript引擎。 你说你自己在使用巴别塔。 无论如何, module.exports默认将importexport声明转换为CommonJS( require / module.exports )。 所以即使你使用ES6模块语法,如果你在Node中运行代码,你也会在后台使用CommonJS。

CommonJS和ES6模块有技术上的区别,例如CommonJS允许你dynamic加载模块。 ES6不允许这样做, 但是有一个API正在开发中 。

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

有几种用法/function可能需要考虑:

要求:

  • 您可以在加载的模块名称不是预定义/静态的情况下进行dynamic加载,或者只有在“真正需要”(取决于特定代码stream)的情况下才有条件地加载模块。
  • 加载是同步的。 这意味着如果你有多个require ,他们将被逐个加载和处理。

ES6import:

  • 您可以使用命名导入来select性地只加载您需要的部分。 这可以节省内存。
  • 导入可以是asynchronous的(并且在当前的ES6模块加载器中,实际上是),并且可以执行得更好一些。

另外,Require模块系统不是基于标准的。 现在ES6模块存在的可能性很小。 未来将会有各种实现中的ES6模块的本地支持,这在性能方面将是有利的。

主要优点是句法:

  • 更多的声明/紧凑的语法
  • ES6模块基本上将UMD(通用模块定义)淘汰 – 从根本上消除了CommonJS与AMD(服务器与浏览器)之间的分裂。

您不太可能看到ES6模块的任何性能优势。 即使在浏览器中完全支持ES6function,您仍然需要一个额外的库来捆绑模块。

使用ES6模块可以用于“树木摇晃”; 即启用Webpack 2,Rollup(或其他打包程序)来标识未使用/导入的代码path,因此不会将其放入生成的包中。 这可以通过消除你永远不需要的代码来显着减less文件的大小,但是CommonJS默认是捆绑的,因为Webpack等人无法知道是否需要。

这是使用代码path的静态分析完成的。

例如,使用:

 import { somePart } 'of/a/package'; 

…给捆绑器提示package.anotherPart不是必需的(如果它没有被导入,它不能被使用 – 对吧?),所以它不会打扰捆绑它。

要为Webpack 2启用此function,您需要确保您的转换器不在吐出CommonJS模块。 如果您使用带有babel的es2015插件,则可以在.babelrc其禁用, .babelrc所示:

 { "presets": [ ["es2015", { modules: false }], ] } 

汇总和其他工作可能会有所不同 – 如果您有兴趣,请查看文档。

使用其中一个有什么性能好处?

目前的答案是否定的,因为目前的浏览器引擎没有实现从ES6标准的import/export

一些比较图表http://kangax.github.io/compat-table/es6/没有考虑到这一点,所以当你看到几乎所有的绿色铬,只是要小心。 没有考虑从ES6 import关键字。

换句话说,包括V8在内的当前浏览器引擎无法通过任何JavaScript指令从主JavaScript文件导入新的JavaScript文件

(根据ES6规范,我们可能仍然只有几个错误或几年的时间,直到V8实现了这一点。)

这个文件是我们需要的,这个文件是我们必须遵守的。

而ES6标准则表示,在我们读取模块之前,模块依赖关系应该在那里,就像编程语言C中那样,我们有(头文件) .h文件。

这是一个很好的testing结构,我确信创buildES6标准的专家有这个想法。

这使得Webpack或其他包打包器可以在某些特殊情况下优化包,并减less一些不需要的包的依赖关系。 但是,如果我们有完美的依赖关系,这绝不会发生。

import/export原生支持上线之前需要一些时间,并且require关键字不会长时间存在。

什么是require

这是加载模块的node.js方法。 ( https://github.com/nodejs/node

节点使用系统级方法来读取文件。 你在使用require时候基本上依靠这个。 requireuv_fs_open (取决于最终系统,Linux,Mac,Windows)的某些系统调用中加载JavaScript文件/模块。

要检查这是否为真,请尝试使用Babel.js,您将看到import关键字将转换为require

在这里输入图像描述