Правильний спосіб імпорту лодашу


185

Нижче у мене був зворотній зв'язок із запитом на запит, просто цікаво, який спосіб - імпортувати квартир?

Вам краще зробити імпорт з "lodash / has". Для попередньої версії lodash (v3), яка сама по собі є досить важкою, ми повинні імпортувати лише специфічний модуль / функцію, а не імпорт всієї бібліотеки lodash. Не впевнений у новій версії (v4).

import has from 'lodash/has';

проти

import { has } from 'lodash';

Дякую


4
Дивіться цю відповідь для більш поглибленої дискусії щодо того, чому останні можуть все-таки здійснити оптимізацію продуктивності в деяких середовищах, таких як Webpack. Це пов'язано з використанням статичного аналізу та струшування дерев.
Патрік Робертс

Відповіді:


244

import has from 'lodash/has';краще, тому що lodash зберігає всі свої функції в одному файлі, тому замість того, щоб імпортувати всю бібліотеку 'lodash' на 100k, краще просто імпортувати функцію lodash, hasяка може бути 2k.


1
@GeorgeKatsanos ви просто імпортуєте функцію, яку ви хочете використовувати, вам не потрібно "_"
Білл

5
@GeorgeKatsanos 'lodash/has'- це не окремий пакет. У has.jsкорені звичайного 'lodash'пакету є файл, який називається , і import has from 'lodash/has'(або const has = require ('lodash/has) буде завантажувати цей файл. Там є окремими пакети методу на НОМ, але вони використовують «точковий синтаксис»: 'lodash.has'. Це також було б дійсним способом вирішити це, якщо ви не заперечуєте встановити окремий пакет для кожного методу, який ви використовуєте (і, можливо, зробите ваш package.jsonмасивний в результаті).
daemonexmachina

80
Я маю додати тут, що якщо ви використовуєте webpack 2 або накопичувач (постачальник, який підтримує струшування дерев), то він import { has } from 'lodash'би працював так само, оскільки решту буде викреслено
Alex JM

1
@PDN webpack 2 струшування дерева повинно зробити це за вас автоматично
Білл

23
На відміну від деяких інших, моє тремтіння дерева не працюватиме з більш очевидним синтаксисом, тільки після переходу на лодаш-ес та використання import has from 'lodash-es/has'синтаксису я отримав повне струшування дерева. пішов від 526KB до 184KB см stackoverflow.com/questions/41991178 / ...
Brandon Сорен Каллі

86

Якщо ви користуєтесь webpack 4, наступний код є хитким для дерева.

import { has } from 'lodash-es';

Бали, які слід зазначити;

  1. Модулі CommonJS не зруйнуються з дерева, тому ви обов'язково повинні використовувати lodash-es, що є бібліотекою Lodash, експортованою як ES-модулі, а не lodash(CommonJS).

  2. lodash-es's 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 { ... } from 'lodash-es'; Мою групу, все ще включає всю бібліотеку.
Ісаак Пак

@IsaacPak Переконайтеся, що ви не перетворюєте модулі ES у CommonJS. Якщо ви використовуєте TypeScript, вам слід встановити --moduleпараметр компілятора як es6, es2015або esnext.
kimamula

Я не використовую TypeScript, і моя наладка .babelrc env встановлена modules: falseтаким чином, щоб вони не перекладалися на CommonJS. Зараз я використовую рішення Брюса, яке, здається, працює. Дякую за ваш внесок, я впевнений, що він працює, але я просто не маю налаштування для цього.
Ісаак Пак

на жаль, на даний момент не можна використовувати lodash-es з vic
apollo

1
import has from 'lodash-es/has'і import {has} from 'lodash-es'обидва варіанти роблять обрізання дерев під час використанняwebpack-4
Легенди

9

Імпортуйте конкретні методи всередину фігурних дужок

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

Плюси:

  • Лише одна імпортна лінія (для пристойної кількості функцій)
  • Більш зрозуміле використання: map () замість _.map () пізніше в коді javascript.

Мінуси:

  • Кожен раз, коли ми хочемо використовувати нову функцію або припиняти використання іншої - її потрібно підтримувати та керувати

Дякую за корисну відповідь. Однак мені подобається, щоб у _.map()синтаксисі було зрозуміло, що використовується зовнішня бібліотека. Є чи import _ from 'lodash'настільки ж ефективним , як вашу пропозицію або є інший спосіб бути в змозі використати цей синтаксис?
Toivo Säwén

1
@ ToivoSäwén Я повністю погоджуюся і віддаю перевагу явному _.map()синтаксису. Чи вдалося вам розібратися із способом зберегти це, роблячи імпорт es6 та струшування дерев?
Радж

4

Якщо ви використовуєте babel, вам слід перевірити babel-plugin-lodash , він вишневий вибір частин лодашу, який ви використовуєте для вас, менше клопоту і менший пакет.

Він має кілька обмежень :

  • Для завантаження Lodash ви повинні використовувати імпорт ES2015
  • 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),

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