导入*之间的性能差异是否来自' lodash'并从' lodash'导入{indexOf}

时间:2017-07-25 13:46:54

标签: javascript ecmascript-6 lodash

我想知道2导入之间的内存和性能是否有任何差异。

如果我在节点模块中有lodash,无论导入是什么,它都会编译所有文件吗?

1 个答案:

答案 0 :(得分:5)

理论上,based on the specification for import,是的,应该存在差异。

如果将lodash模块编写为ES2015模块,则规范允许合规优化使用命名导入的静态分析,以便仅加载提供indexOf()所需的内容。

它将创建一个ImportEntry record,在ES2015模块上运行静态分析时保留对如何解析import的引用,以便仅评估相关的export

实际上,这并不是那么简单,而且由于目前还没有本机实现,像Babel这样的转换器会将ES2015 import语法转换为CommonJS功能等价物。

不幸的是,这个功能相同的方法仍然必须评估整个模块,因为它的导出在完全评估之前是未知的。

这就是ES2015规范要求importexport位于顶级范围内的原因,因此静态分析将允许JavaScript引擎通过确定文件的哪些部分可以进行优化在评估export的代码时安全地省略了。

另一方面,像Rollup和Webpack这样的非本地捆绑器执行静态分析,以便进行树木抖动并删除import未引用到模块的死代码部分在捆绑中。此优化与import / export的使用无关,但使用命名imports而不是glob星号可以在这些捆绑器中进行更简单,更优化的静态分析,并最终使用任何本机将在未来发布的实施。

TL; DR

理论上,是的,存在差异,但在实践中,在import / export的本机实现可用之前没有差别,或者除非您使用执行静态分析的捆绑器和树木一样,独立于实际的语法和规范。

在任何情况下,建议使用命名导入,以便在您使用的任何环境中进行任何可能的优化。

ECMAScript第15.2节模块规范