正确的方式导入lodash

Bru*_*uce 154 javascript lodash babeljs

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

你最好从'lodash/has'进行导入..对于早期版本的lodash(v3),它本身非常重,我们应该只导入一个specidic模块/函数而不是导入整个lodash库.不确定较新的版本(v4).

import has from 'lodash/has';
Run Code Online (Sandbox Code Playgroud)

VS

import { has } from 'lodash';
Run Code Online (Sandbox Code Playgroud)

谢谢

Bru*_*uce 214

import has from 'lodash/has';更好,因为lodash将所有函数保存在一个文件中,所以不要导入整个'lodash'库100k,最好只导入lodash的has函数,可能是2k.

  • 我必须在此添加,如果您使用webpack 2或汇总(支持树摇动的捆绑器),那么来自'lodash'的`import {has}将以相同的方式工作,因为其余的将被剥离 (75认同)
  • 与其他一些不同的是,我的树摇动不会使用更明显的语法,只有在我切换到lodash-es并使用`import has from'lodash-es/has'`语法后,我才能完全摇晃树.从526KB到184KB,请参阅/sf/ask/2939382491/ (19认同)
  • @GeorgeKatsanos`'lodash/has'`不是一个单独的包.在常规`'lodash'`包的根目录中有一个名为`has.js`的文件,`import from'lodash/has'`(或`const has = require('lodash/has`)将加载npm上有*单独的方法包,但它们使用"点语法":`'lodash.has'.如果你不介意安装一个单独的包,这也是一个有效的方法. for*every*您使用的方法(并且可能使您的`package.json`结果很大). (4认同)
  • @GeorgeKatsanos 你只需要导入你想使用的函数,你不需要'_' (2认同)
  • @PDN webpack 2 摇树应该自动为你做 (2认同)

kim*_*ula 63

如果您使用的是webpack 4,则以下代码是树可动摇的.

import { has } from 'lodash-es';
Run Code Online (Sandbox Code Playgroud)

需要注意的要点;

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

  2. lodash-es的package.json包含"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更有效.

  • `import has from 'lodash-es/has'` 和 `import {has} from 'lodash-es'` 这两个变体在使用 `webpack-4` 时都会进行 treeshaking (3认同)
  • @IsaacPak 确保您没有将 ES 模块转换为 CommonJS。如果你使用 TypeScript,你必须将 `--module` 编译器选项设置为 `es6`、`es2015` 或 `esnext`。 (2认同)

小智 14

在大括号内导入特定方法

import { map, tail, times, uniq } from 'lodash';
Run Code Online (Sandbox Code Playgroud)

优点:

  • 只有一个导入行(对于相当数量的功能)
  • 更易读的用法:稍后在 javascript 代码中使用 map() 而不是 _.map() 。

缺点:

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

复制自:The Correct Way to Import Lodash Libraries - Alexander Chertkov 撰写的一篇基准文章。

  • 感谢您提供有用的答案。然而,我喜欢“_.map()”语法来清楚地表明正在使用外部库。`import _ from 'lodash'` 是否与您的建议同样有效,或者是否有其他方法可以使用此语法? (2认同)
  • @ToivoSäwén 我完全同意并且更喜欢显式的 `_.map()` 语法。在进行 es6 导入和 tree-shaking 时,你能找到一种方法来维护它吗? (2认同)

Cha*_*nka 10

您可以将它们导入为

import {concat, filter, orderBy} from 'lodash';
Run Code Online (Sandbox Code Playgroud)

或作为

import concat from 'lodash/concat';
import orderBy from 'lodash/orderBy';
import filter from 'lodash/filter';
Run Code Online (Sandbox Code Playgroud)

第二个比第一个优化得多,因为它只加载所需的模块

然后像这样使用

pendingArray: concat(
                    orderBy(
                        filter(payload, obj => obj.flag),
                        ['flag'],
                        ['desc'],
                    ),
                    filter(payload, obj => !obj.flag),
Run Code Online (Sandbox Code Playgroud)