我想知道2导入之间的内存和性能是否有任何差异。
如果我在节点模块中有lodash,无论导入是什么,它都会编译所有文件吗?
答案 0 :(得分:5)
理论上,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星号可以在这些捆绑器中进行更简单,更优化的静态分析,并最终使用任何本机将在未来发布的实施。
理论上,是的,存在差异,但在实践中,在import
/ export
的本机实现可用之前没有差别,或者除非您使用执行静态分析的捆绑器和树木一样,独立于实际的语法和规范。
在任何情况下,建议使用命名导入,以便在您使用的任何环境中进行任何可能的优化。