来自'lodash'的import*as _和来自'lodash'的import {indexOf}之间是否存在性能差异?

Pro*_*oku 4 javascript ecmascript-6 lodash

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

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

Pat*_*rts 6

从理论上讲,基于规范import,是的,应该存在差异.

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

它将创建一条ImportEntry记录,以保留import对在ES2015模块上运行静态分析时如何解决的参考,以便仅export评估相关的.

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

遗憾的是,这种功能相当的方法仍然必须评估整个模块,因为在完全评估之前,它的输出是未知的.

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

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

TL; DR

从理论上讲,是的,存在差异,但在实践中,在本机实现可用于import/ 之前没有区别export,或者除非您使用捆绑器执行静态分析和树形抖动,而与实际语法和规范无关.

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

ECMAScript第15.2节模块规范