如何导入单个Lodash功能?

ada*_*ng3 103 javascript lodash

使用webpack,我试图导入isEqual,因为lodash似乎导入了所有内容.我尝试过以下操作但没有成功:

import { isEqual } from 'lodash'

import isEqual from 'lodash/lang'

import isEqual from 'lodash/lang/isEqual'

import { isEqual } from 'lodash/lang'

import { isEqual } from 'lodash/lang'
Run Code Online (Sandbox Code Playgroud)

Pat*_*und 164

您可以安装lodash.isequal为单个模块而无需安装整个lodash软件包,如下所示:

npm install --save lodash.isequal
Run Code Online (Sandbox Code Playgroud)

使用ECMAScript 5和CommonJS模块时,您可以像这样导入它:

var isEqual = require('lodash.isequal');
Run Code Online (Sandbox Code Playgroud)

使用ES6模块,这将是:

import isEqual from 'lodash.isequal';
Run Code Online (Sandbox Code Playgroud)

您可以在代码中使用它:

const obj1 = {username: 'peter'};
const obj2 = {username: 'peter'};
const obj3 = {username: 'gregory'};

isEqual(obj1, obj2) // returns true
isEqual(obj1, obj3) // returns false
Run Code Online (Sandbox Code Playgroud)

资料来源:Lodash文件

导入后,您可以isEqual在代码中使用该功能.请注意,_如果以这种方式导入它,它不是命名对象的一部分,因此 不要使用_.isEqual,而是直接使用它来引用它isEqual.

替代方案:使用 lodash-es

正如@kimamula所指出的:

使用webpack 4和lodash-es 4.17.7及更高版本,此代码可以正常工作.

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

这是因为webpack 4支持sideEffects标志,lodash-es4.17.7及更高版本包含标志(设置为false).

为什么不使用带斜线的版本? 这个问题的其他答案表明你也可以使用破折号而不是点,如下所示:

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

这也有效,但有两个小缺点:

  • 你必须安装整个lodash包(npm install --save lodash),而不仅仅是小的单独的lodash.isequal包; 存储空间便宜且CPU速度很快,所以你可能不关心这个
  • 使用像webpack这样的工具时产生的捆绑会稍微大一点; 我发现带有最小代码示例的捆绑包大小isEqual平均大28%(尝试过webpack 2和webpack 3,有或没有Babel,有或没有Uglify)

  • @cvDv,但它不应该使用像`_.isEqual`,你应该直接使用`isEqual` (9认同)
  • 应该注意的是,使用每个方法包不再是推荐的方式,并将在 lodash 5 中删除 - https://lodash.com/per-method-packages (5认同)
  • @PatrickHund:这非常有趣。我同意在你的开发机器上拥有整个 lodash 的开销是相当微不足道的,特别是因为它消除了为每个函数单独运行“npm --save lodash.whatever”的需要,但更大的包大小肯定会值得使用周期法。我很惊讶两者之间存在差异,所以我很高兴您为我们计算了这些数字。 (2认同)
  • 为单个安装的功能打字怎么样? (2认同)

Jo *_*gue 54

如果您只想包含isEqual而不是其他lodash功能(对于保持小包大小很有用),您可以在ES6中执行此操作;

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

这几乎lodashREADME中描述的相同,只是它们使用require()语法.

var at = require('lodash/at');
Run Code Online (Sandbox Code Playgroud)


kim*_*ula 22

使用webpack 4和lodash-es 4.17.7及更高版本,此代码可以正常工作.

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

这是因为webpack 4支持sideEffectsflag和lodash-es 4.17.7及更高版本包括标志(设置为false).

编辑

从版本1.9.0开始,Parcel也支持"sideEffects": false,因此import { isEqual } from 'lodash-es';也可以使用Parcel进行树形抖动.


ste*_*int 8

我认为值得注意的是每个方法包的 lodash 文档至少截至 2020 年 6 月才能回答这个问题:

\n
\n

Lodash 方法可在独立的每个方法包中使用,例如 lodash.mapvalues、lodash.pickby 等。这些包仅包含该方法所依赖的代码。

\n

但是,不鼓励使用这些包,它们将在 v5 中删除

\n

尽管它们看起来更轻量级,但它们通常会增加项目中 node_modules 和 webpack/rollup 包的大小,而项目传递地依赖于多个每个方法包和/或主 lodash 包。虽然主 lodash 包中的许多方法共享代码,但每个方法包在内部捆绑了它们所依赖的任何代码的副本。

\n
\n

该文档实际上建议:

\n
\n

如果您直接导入或需要方法,请不要担心\xe2\x80\x94,例如const throttle = require(\'lodash/throttle\'),只有您的包使用的lodash代码子集才会捆绑在使用您的包的项目中。

\n
\n

此外,此页面对不同的导入选项和生成的构建大小进行了一些非常有趣的研究:https://www.blazemeter.com/blog/the- Correct-way-to-import-lodash-libraries-a-benchmark

\n


Ale*_*min 6

与 webpack 无关,但我会在这里添加它,因为很多人目前正在转向打字稿。

您还可以import isEqual from 'lodash/isEqual';在打字稿中使用带有esModuleInterop编译器选项 (tsconfig.json) 中的标志的lodash 导入单个函数

例子

{
  "compilerOptions": {
    "module": "commonjs",
    "target": "es5",
    "lib": ["es6", "dom"],
    "moduleResolution": "node",
    "esModuleInterop": true,
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)