如何导入单个 Lodash 函数?

IT技术 javascript lodash
2021-01-14 15:42:23

使用 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'
6个回答

您可以lodash.isequal作为单个module安装,而无需安装整个lodash包,如下所示:

npm install --save lodash.isequal

当使用 ECMAScript 5 和 CommonJS module时,你可以像这样导入它:

var isEqual = require('lodash.isequal');

使用 ES6 module,这将是:

import isEqual from 'lodash.isequal';

您可以在代码中使用它:

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

isEqual(obj1, obj2) // returns true
isEqual(obj1, obj3) // returns false

来源:Lodash 文档

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

替代方案:使用 lodash-es

正如@kimamula所指出的

使用 webpack 4 和lodash-es 4.17.7 及更高版本,此代码有效。

import { isEqual } from 'lodash-es';

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

为什么不使用带斜杠的版本? 这个问题的其他答案建议您也可以使用破折号代替点,如下所示:

import isEqual from 'lodash/isequal';

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

  • 您必须安装整个lodash包 ( npm install --save lodash),而不仅仅是单独的lodash.isequal包;存储空间便宜,CPU 速度快,所以你可能不关心这个
  • 使用 webpack 等工具生成的 bundle 会稍微大一些;我发现使用最小代码示例的包大小isEqual平均大 28%(尝试了 webpack 2 和 webpack 3,有或没有 Babel,有或没有 Uglify)
@PatrickHund:这很有趣。我同意在你的开发机器上拥有整个 lodash 的开销是非常微不足道的,特别是因为它消除了npm --save lodash.whatever为每个函数单独运行的需要,但是更大的包大小肯定会让使用 period 方法变得值得。我很惊讶有区别,所以我很高兴你为我们计算了数字。
2021-03-18 15:42:23
@cvDv,但不应该使用 like _.isEqual,你应该直接使用isEqual
2021-03-20 15:42:23
为单个安装的功能打字怎么样?
2021-03-20 15:42:23
@thund 由于这个答案获得了很多投票,我花时间在使用点(如 lodash docs 推荐)和斜线时比较包的大小,请参阅我编辑的答案
2021-03-29 15:42:23
你真的安装了module吗?npm i --save lodash.isequal
2021-03-30 15:42:23

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

import isEqual from 'lodash/isEqual'

lodashREADME 中描述的几乎相同,除了它们使用require()语法。

var at = require('lodash/at');
这个答案应该有效,但如果您遇到错误:isEqual.isEqual is not a function由于您的 ESM 配置,请尝试使用:import * as isEqual from 'lodash/isEqual';
2021-03-28 15:42:23

使用 webpack 4 和 lodash-es 4.17.7 及更高版本,此代码有效。

import { isEqual } from 'lodash-es';

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

编辑

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

惊人的。这可以使用 webpack 将我的包大小从 78 kb 减少到 18 kb。
2021-04-07 15:42:23
太好了,我将此信息添加到了我的答案中,希望您满意 😀
2021-04-10 15:42:23

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

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

例子

{
  "compilerOptions": {
    "module": "commonjs",
    "target": "es5",
    "lib": ["es6", "dom"],
    "moduleResolution": "node",
    "esModuleInterop": true,
    ...
  }
}

Lodash 在他们的README 中列出了几个选项

  • babel-plugin-lodash

    • 安装 lodash 和 babel 插件:
    $ npm i --save lodash
    $ npm i --save-dev babel-plugin-lodash @babel/cli @babel/preset-env
    
    • 将此添加到您的 .babelrc
    {
      "plugins": ["lodash"],
      "presets": [["@babel/env", { "targets": { "node": 6 } }]]
    }
    
    • 改变这个
    import _ from 'lodash'
    import { add } from 'lodash/fp'
    
    const addOne = add(1)
    _.map([1, 2, 3], addOne)
    

    大致是这样的:

    import _add from 'lodash/fp/add'
    import _map from 'lodash/map'
    
    const addOne = _add(1)
    _map([1, 2, 3], addOne)
    
  • lodash-webpack-plugin

    • 安装 lodash 和 webpack 插件:
    $ npm i --save lodash
    $ npm i --save-dev lodash-webpack-plugin babel-core babel-loader babel-plugin-lodash babel-preset-env webpack
    
    • 配置您的webpack.config.js
    var LodashModuleReplacementPlugin = require('lodash-webpack-plugin');
    var webpack = require('webpack');
    
    module.exports = {
      'module': {
        'rules': [{
          'use': 'babel-loader',
          'test': /\.js$/,
          'exclude': /node_modules/,
          'options': {
            'plugins': ['lodash'],
            'presets': [['env', { 'modules': false, 'targets': { 'node': 4 } }]]
          }
        }]
      },
      'plugins': [
        new LodashModuleReplacementPlugin,
        new webpack.optimize.UglifyJsPlugin
      ]
    };
    
  • 使用 lodash cli 的lodash-es

    • $ lodash modularize exports=es -o ./