导入lodash的正确方法


182

我在下面有一个请求请求反馈,只是想知道哪种方法是导入lodash的正确方法?

您最好从'lodash / has'中导入。.对于本身很重的lodash(v3)的早期版本,我们应该仅导入特定的模块/函数,而不是导入整个lodash库。不确定较新的版本(v4)。

import has from 'lodash/has';

import { has } from 'lodash';

谢谢


4
请参阅此答案以进行更深入的讨论,以了解为什么后者在某些环境(例如Webpack)中仍然会导致性能优化。这是由于使用了静态分析和摇树。
Patrick Roberts

Answers:


242

import has from 'lodash/has';更好,因为lodash将所有功能都保存在一个文件中,因此,与其以100k的价格导入整个“ lodash”库,不如仅以has2k的价格导入lodash的功能更好。


1
@GeorgeKatsanos你只是输入你想使用的功能,你不需要“_”
比尔

5
@GeorgeKatsanos 'lodash/has'不是独立的软件包。has.js常规'lodash'软件包的根目录中有一个称为的文件,import has from 'lodash/has'(或const has = require ('lodash/has)将加载该文件。还有在NPM单独的方法包,但他们使用的“点语法”: 'lodash.has'。如果您不介意为使用的每种方法安装单独的程序包,那么这也是一种行之有效的方法(因此有可能使您的package.json工作量很大)。
daemonexmachina

80
我必须在这里补充一点,如果您使用webpack 2或汇总(支持树摇动的捆绑器),则将import { has } from 'lodash'以相同的方式工作,因为其余部分将被删除
Alex JM

1
@PDN webpack 2摇树应该自动为您做到
比尔

23
与其他某些语言不同,我的树震动无法使用更明显的语法,只有当我切换到lodash-es并使用该import has from 'lodash-es/has'语法后,我才能获得完整的树震动。从526KB跑到184KB,看到stackoverflow.com/questions/41991178/...
布兰登瑟伦Culley

83

如果使用webpack 4,则以下代码可摇树。

import { has } from 'lodash-es';

注意事项;

  1. CommonJS模块不可摇树,因此,您一定要使用lodash-es,这是作为ES模块导出的Lodash库,而不是lodash(CommonJS)。

  2. lodash-es的package.json contains "sideEffects": false,它通知webpack 4软件包中的所有文件都是无副作用的(请参阅https://webpack.js.org/guides/tree-shaking/#mark-the-file-as-side -无效果)。

  3. 此信息对于摇晃树至关重要,因为模块捆绑程序不会对摇晃文件进行树状摇晃,即使它们的导出成员未在任何地方使用,这些文件也可能包含副作用。

编辑

从1.9.0版开始,Parcel还支持"sideEffects": false,因此import { has } from 'lodash-es';也可以与Parcel一起摇树。它也支持摇晃CommonJS模块,尽管根据我的实验,ES模块的摇晃可能比CommonJS更有效。


我将所有lodash导入都转换为import { ... } from 'lodash-es'; 我的捆绑包,其中仍然包括整个库。
艾萨克·朴

@IsaacPak确保您没有将ES模块转换为CommonJS。如果您使用的打字稿,你必须设置--module编译器选项为es6es2015esnext
kimamula19年

我没有使用TypeScript,并且我的.babelrc env预设设置为,modules: false因此它们不会被转换为CommonJS。我现在正在使用Bruce的解决方案,它似乎有效。感谢您的贡献,我确定它可以使用,但是我没有设置。
艾萨克·朴

不幸的是,目前不能在开玩笑的情况下使用lodash-es:github.com/facebook/jest/issues/4842#issuecomment-491434065
阿波罗

1
import has from 'lodash-es/has'import {has} from 'lodash-es'两种变体在使用时都进行树状握手webpack-4
Legends

9

将特定方法导入大括号内

import { map, tail, times, uniq } from 'lodash';

优点:

  • 仅一条进口线(用于相当数量的功能)
  • 更具可读性的用法:javascript代码后面的map()而不是_.map()。

缺点:

  • 每当我们想使用一个新功能或停止使用另一个功能时,都需要对其进行维护和管理

感谢您提供有用的答案。但是,我希望_.map()语法可以清楚地表明正在使用外部库。是否import _ from 'lodash'像您的建议一样有效,还是有其他方法可以使用此语法?
ToivoSäwén

1
@ToivoSäwén我完全同意,也喜欢显式_.map()语法。在进行es6导入和摇树时,您是否能够找到一种方法来保持这种状态?
拉吉

4

如果您正在使用babel,则应查看babel-plugin-lodash,它会樱桃挑选您正在使用的lodash的各个部分,从而减少麻烦和捆绑。

它有一些限制

  • 您必须使用ES2015导入来加载Lodash
  • 不支持Babel <6和Node.js <4
  • 不支持链序列。有关替代方法,请参见此博客文章
  • 不支持模块化方法包

4

您可以将它们导入为

import {concat, filter, orderBy} from 'lodash';

或作为

import concat from 'lodash/concat';
import orderBy from 'lodash/orderBy';
import filter from 'lodash/filter';

第二个比第一个进行了优化,因为它仅加载所需的模块

然后像这样使用

pendingArray: concat(
                    orderBy(
                        filter(payload, obj => obj.flag),
                        ['flag'],
                        ['desc'],
                    ),
                    filter(payload, obj => !obj.flag),
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.