import * as _ from 'lodash' 和 import indexOf from 'lodash' 之间是不是存在性能差异
Posted
技术标签:
【中文标题】import * as _ from \'lodash\' 和 import indexOf from \'lodash\' 之间是不是存在性能差异【英文标题】:Is there a performance difference between import * as _ from 'lodash' and import indexOf from 'lodash'import * as _ from 'lodash' 和 import indexOf from 'lodash' 之间是否存在性能差异 【发布时间】:2017-12-31 11:54:55 【问题描述】:我想知道两次导入之间的内存和性能是否有任何差异。
如果我的节点模块中有 lodash,无论导入如何,它都会编译所有文件吗?
【问题讨论】:
您可以测量您机器上的内存使用/速度并查看结果。 这真的取决于您使用的模块捆绑器。如果你说的是原生 javascripts 模块,你应该用 ES8 而不是 ES6 标记它 @UlysseBN ES8 对模块有什么改变吗? 哦,我的错,我写了太多关于 async/await 的内容并感到困惑。这确实是 ES6 的一部分。 请检查一下 - ***.com/questions/35250500/… 【参考方案1】:理论上,based on the specification for import
,是的,应该有区别。
如果 lodash 模块被编写为 ES2015 模块,规范允许合规优化使用命名导入的静态分析,以便仅加载提供 indexOf()
所需的内容。
它将创建一个ImportEntry
record,在对 ES2015 模块运行静态分析时保留有关如何解析 import
的引用,以便仅评估相关的 export
。
实际上,这并不是那么简单,而且由于目前还没有原生实现,所以像 Babel 这样的转译器会将 ES2015 import
语法转换为 CommonJS 功能等价物。
不幸的是,这种功能等效的方法仍必须评估整个模块,因为它的导出在完全评估之前是未知的。
这就是为什么 ES2015 规范要求 import
和 export
在***范围内,以便静态分析将允许 JavaScript 引擎通过确定在评估时可以安全地省略文件的哪些部分来进行优化export
的代码。
另一方面,有像 Rollup 和 Webpack 这样的非本地打包器,它们执行静态分析,以便进行树摇动并删除 import
未引用到模块中的死代码部分。捆。这种优化与 import
/ export
的使用无关,但使用命名的 imports
代替 glob 星号允许在这些捆绑程序中进行更轻松、更优化的静态分析,最终任何将在未来。
TL;DR
理论上,是的,但实际上,在import
/ export
可以使用本机实现之前,或者除非您使用执行静态分析和 tree-shaking 的捆绑程序,否则没有区别独立于实际的语法和规范。
无论如何,建议使用命名导入,这样您就可以在所使用的任何环境中进行任何可能的优化。
ECMAScript 第 15.2 节模块规范
ECMAScript 2015 ECMAScript 2016 ECMAScript 2017 ECMAScript 2018【讨论】:
ES2018还没有发布? 这部分错误。您假设 OP 正在使用 Babel 进行模块转译,但他可能不是。 rollup 和 webpack 都使用原生 ES6import
和 export
来执行 tree-shaking(以及其他),因此仅在代码中包含您需要的内容时性能更高。
@PatrickRoberts 我只是想知道为什么您链接的是 ES2018 草案而不是当前标准,或者第一次指定模块的 ES6。
@PatrickRoberts ecma-international.org/ecma-262 是当前的 - ecma-international.org/ecma-262/8.0 或 ecma-international.org/ecma-262/6.0 也可能有效
the named import will only load what is required to provide indexOf
,这不是真的。 ES 导入/导出仍然需要加载和执行所有导入的文件,因为任何文件都可能有副作用。使用命名导入来消除死代码稍微容易一些,但工具仍然可以看到只有 _.indexOf
是命名空间对象上使用的唯一属性,但这超出了 ECMA 规范的范围。以上是关于import * as _ from 'lodash' 和 import indexOf from 'lodash' 之间是不是存在性能差异的主要内容,如果未能解决你的问题,请参考以下文章
python 运行脚本报错 from keyword import iskeyword as _iskeyword ImportError: cannot import name iskeyword