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 规范要求 importexport 在***范围内,以便静态分析将允许 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 都使用原生 ES6 importexport 来执行 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

python新手关于from..import..as的用法?

python 模块导入详解

Python--基础总结

导入模块

Python中import, from...import,import...as的区别