我想知道2导入之间的内存和性能是否有任何差异.
如果我在我的节点模块中有lodash,那么无论如何导入它都会编译所有文件吗?
解决方法:
从理论上讲,based on the specification for import
,是的,应该会有所不同.
如果将lodash模块写为ES2015模块,则规范允许合规优化使用命名导入的静态分析,以便仅加载提供indexOf()所需的内容.
它将创建一个ImportEntry
record,在ES2015模块上运行静态分析时保留对如何解析导入的引用,以便仅评估相关的导出.
实际上,这并不是那么简单,而且由于目前还没有本机实现,像Babel这样的转换器会将ES2015导入语法转换为CommonJS功能等价物.
遗憾的是,这种功能相当的方法仍然必须评估整个模块,因为在完全评估之前,它的导出是未知的.
这就是ES2015规范要求导入和导出位于*范围内的原因,因此静态分析将允许JavaScript引擎通过确定在评估导出代码时可以安全地省略文件的哪些部分来进行优化.
另一方面,有像Rollup和Webpack这样的非本地捆绑器执行静态分析,以便进行树抖动并删除未被import引用到bundle中模块的死代码部分.此优化与导入/导出的使用无关,但使用命名导入而不是glob星号可以在这些捆绑器中进行更简单,更优化的静态分析,并最终实现将在未来发布的任何本机实现.
TL; DR
从理论上讲,是的,存在差异,但实际上,在本机实现可用于导入/导出之前没有区别,或者除非您使用捆绑器执行静态分析和树形抖动,而与实际语法和规范无关.
在任何情况下,建议使用命名导入,以便在您使用的任何环境中进行任何可能的优化.
ECMAScript第15.2节模块规范
> ECMAScript 2015
> ECMAScript 2016
> ECMAScript 2017
> ECMAScript 2018