使用Node.js需要与ES6导入/导出
在我正在合作的一个项目中,我们有两个select我们可以使用的模块系统:
- 使用
require
导入模块,并使用module.exports
和module.exports
导出。 - 使用ES6
import
导入模块,并使用ES6export
使用其中一个有什么性能好处? 如果我们要在节点上使用ES6模块,还有什么我们应该知道的吗?
使用其中一个有什么性能好处?
请记住,目前还没有支持ES6模块的JavaScript引擎。 你说你自己在使用巴别塔。 无论如何, module.exports
默认将import
和export
声明转换为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
时候基本上依靠这个。 require
在uv_fs_open
(取决于最终系统,Linux,Mac,Windows)的某些系统调用中加载JavaScript文件/模块。
要检查这是否为真,请尝试使用Babel.js,您将看到import
关键字将转换为require
。