javascript 使用ES6导入来加载特定名称是否比导入名称空间更快?

ie3xauqp  于 2023-02-02  发布在  Java
关注(0)|答案(3)|浏览(118)

我发现至少有两种方法可以从Ramda这样的模块导入函数,可能还有更多的方法可以完成类似的任务,比如const R = require('ramda');
选项1是导入某些函数:

import { cond, T, always, curry, compose } from 'ramda';

选项2是导入整个模块,如下所示:

import * as R from "ramda";

我更喜欢引用调用函数的模块,如下所示:

R.T();

但是如果使用第二个选项,它是否引入了每个Ramda函数,而不仅仅是我正在使用的模块中使用的函数?如果使用选项2,是否会对实际内存使用或带宽使用有任何影响,比如发送到浏览器的内容?是否有可能以某种方式做到这一点:

// invalid syntax below:
import R { cond, T, always, curry, compose } from 'ramda';
R.T();

我的问题与此问题有点关系,但import R (ramda) into typescript .ts file稍有不同

2ic8powd

2ic8powd1#

TL;DR:无所谓。

import * as … from 'ramda';
import { … } from 'ramda';

默认情况下,will both 总是引入完整的Ramda模块及其所有依赖项。模块内的所有代码都将运行,使用哪种语法来引用导出的绑定并不重要。使用命名导入还是命名空间导入完全取决于首选项。
静态分析可以减少下载文件的大小和内存的使用。在评估模块之后,引擎可以垃圾收集那些没有引用的绑定。模块命名空间对象可能会使这稍微困难一些。因为任何可以访问该对象的人都可以访问所有的导出。但是这些对象仍然是以某种方式指定的(不可变),以允许对其使用进行静态分析,并且如果您对它们所做的唯一事情是使用常量名称进行属性访问,则引擎应该利用这一事实。
任何大小优化都涉及猜测模块的哪些部分需要评估,哪些部分不需要评估,并且在模块捆绑器中进行(如Rollup或WebPack)。这被称为 Tree Shaking,删除不需要的部分代码和整个依赖项(被导入的任何东西使用)。它应该能够检测到您正在使用的导入,而不管导入样式如何,尽管当你对命名空间对象做一些不寻常的事情时(比如循环它或者使用动态属性访问),它可能不得不退出。
要了解您的Bundler可以做出的准确猜测,请联系其文档。

nr7wwzry

nr7wwzry2#

@Bergi的评论是对的,我认为这应该是答案,我还想指出你可以随时在Babel中尝试一些东西,看看它编译成了什么:单击此处查看示例解构的实际作用
所以基本上即使你只从模块中解构一个函数,整个模块都是必需的。在我给出的Babel例子中,我只是从'react'模块中提取了Component,但编译后的代码实际上只需要整个模块。:)

fnvucqvd

fnvucqvd3#

添加到@Bergi,也只是为了将来的参考,如果你想摆脱未使用的函数,只导入所需的函数,使用如下选择性导入

import isEmpty from 'ramda/src/isEmpty';

这样你就可以用Webpack来补充它,得到一个更好的树摇动。希望它有帮助

相关问题