Як імпортувати єдину функцію Лодаша?


128

Використовуючи 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'


1
ні, я хотів би імпортувати й інші функції
adang3

2
На моє розуміння, тепер ви можете імпортувати один за одним чи всі вони, без середнього місця. Я рекомендую одну за одною, навіть якщо це додасть багато залежностей у package.json, тестувати і модернізувати метод по черзі буде легше, ніж усі за один крок
Борис Шарпентьє

Відповіді:


205

Ви можете встановити lodash.isequalяк один модуль, не встановлюючи весь пакет lodash так:

npm install --save lodash.isequal

Використовуючи модулі ECMAScript 5 та CommonJS, ви імпортуєте його так:

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

Використовуючи модулі ES6, це буде:

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

Джерело: документація Лодаша

Після імпорту ви можете використовувати isEqualфункцію у своєму коді. Зауважте, що він не є частиною об'єкта з ім'ям, _якщо ви імпортуєте його таким чином, тому ви не посилаєтесь на нього _.isEqual, а безпосередньо на isEqual.

Альтернатива: Використання lodash-es

Як вказував @kimamula :

Цей веб- пакет 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 ; простір для зберігання дешевий, а процесори - швидкі, тому ви можете не перейматися цим
  • Отриманий пакет при використанні таких інструментів, як webpack, буде трохи більшим; Я дізнався, що розміри пакетів із прикладом мінімального коду isEqualв середньому на 28% більше (спробували webpack 2 та webpack 3, з Babel або без, з Uglify або без)

З мене чомусь не працює, я отримую _ is not defined під час використання_.isEquals
adang3

9
@cvDv, Але це не слід використовувати як _.isEqual, ви повинні використовувати безпосередньоisEqual
Арен Овсепян

1
Ви фактично встановили модуль? npm i - збереження lodash.isequal
Патрік Гунд

1
@thund Оскільки ця відповідь набирає багато голосів, я взяв час, щоб порівняти розміри пакету при використанні крапок (як рекомендують документи Dokash) та косої риси, дивіться мою відредаговану відповідь
Патрік Ханд

1
@PatrickHund: Це дуже цікаво. Я погоджуюся з тим, що накладні витрати на всю квартиру на вашій розроблювальній машині є досить тривіальною, тим більше, що це виключає необхідність запускати npm --save lodash.whateverкожну функцію окремо, але більший розмір пакета, безумовно, може зробити вартим використання методу періоду. Я здивований, що є різниця, тому я радий, що ви зателефонували нам.
гром

64

Якщо ви просто хочете включити, isEqualа не інші lodashфункції (корисні для того, щоб розмір пакета був невеликим), ви можете це зробити в ES6;

import isEqual from 'lodash/isEqual'

Це в значній мірі так само , як то , що описано в в lodashREADME , за винятком того, що вони використовують require()синтаксис.

var at = require('lodash/at');

29

Цей веб-пакет 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.


1
Чудово, я доповнив цю інформацію своєю відповіддю, сподіваюся, що з вами все гаразд 😀
Патрік Хунд

Дивовижно. Це може зменшити розмір мого пакета з 78 кб до 18 кб за допомогою webpack.
fsevenm

6

Не стосується webpack, але я додам його сюди, оскільки зараз багато людей переходять на машинопис.

Ви також можете імпортувати одну функцію з lodash, використовуючи import isEqual from 'lodash/isEqual';машинопис із esModuleInteropпрапором у параметрах компілятора (tsconfig.json)

приклад

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

1

Лодаш перелічує кілька варіантів у своєму ПРОЧИТАННІ :

  • 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-плагін

    • Встановіть плагін 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-es, використовуючи cliash cliash

    • $ lodash modularize exports=es -o ./

0

це насправді працювало на мене

import { isEqual } from 'lodash';

24
Ви все одно отримуєте повну бібліотеку лодашів, використовуючи цей синтаксис. ОП хоче лише отримати функцію isEqual, зменшивши розмір своєї пачки.
Nyegaard

Це імпортує всі lib, а потім витягне одну функцію в поточну область.
Лукас Лейсіс

0

import { isEqual } from 'lodash-es';імпортує всю бібліотеку. Я використовую Rollup, який повинен робити струшування дерева за замовчуванням.

Кожного разу, коли я писав власні модулі, цей ім’яний синтаксис імпорту працює, і згорнутий файл успішно тремтить, тому я трохи заплутався, чому він не працюватиме з Lodash.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.