Prawidłowy sposób importowania lodash


185

Miałem poniżej informację zwrotną dotyczącą żądania ściągnięcia, zastanawiam się tylko, który sposób jest prawidłowy sposób importowania lodash?

Lepiej wykonaj import z 'lodash / has'. W przypadku wcześniejszej wersji lodash (v3), która sama w sobie jest dość ciężka, powinniśmy importować tylko określony moduł / funkcję, a nie importować całą bibliotekę lodash. Nie jestem pewien co do nowszej wersji (v4).

import has from 'lodash/has';

vs

import { has } from 'lodash';

Dzięki


4
Zobacz tę odpowiedź, aby uzyskać bardziej szczegółową dyskusję na temat tego, dlaczego ta ostatnia może nadal optymalizować wydajność w niektórych środowiskach, takich jak Webpack. Wynika to z zastosowania analizy statycznej i wstrząsania drzewem.
Patrick Roberts,

Odpowiedzi:


244

import has from 'lodash/has';jest lepsze, ponieważ lodash przechowuje wszystkie swoje funkcje w jednym pliku, więc zamiast importować całą bibliotekę „lodash” na 100k, lepiej po prostu zaimportować hasfunkcję lodash, która może być 2k.


1
@GeorgeKatsanos po prostu zaimportujesz funkcję, której chcesz użyć, nie potrzebujesz „_”
Bill

5
@GeorgeKatsanos 'lodash/has'nie jest osobnym pakietem. W has.jskatalogu głównym zwykłego 'lodash'pakietu znajduje się plik i import has from 'lodash/has'(lub const has = require ('lodash/has) załaduje ten plik. Tam oddzielne pakiety metody w KMP, ale użyć składni „kropka”: 'lodash.has'. Byłby to również dobry sposób na obejście tego, jeśli nie masz nic przeciwko instalowaniu osobnego pakietu dla każdej metody, której używasz (i potencjalnie sprawia, że ​​jesteś package.jsonogromny).
daemonexmachina

80
Muszę tu dodać, że jeśli użyjesz webpacka 2 lub pakietu zbiorczego (pakiet, który obsługuje wstrząsanie drzewem), to import { has } from 'lodash'działałoby to tak samo, ponieważ reszta zostanie usunięta
Alex JM

1
Wstrząsanie drzewem @PDN webpack 2 powinno zrobić to automatycznie
Bill

23
w przeciwieństwie do niektórych innych, moje wstrząsanie drzewem nie działałoby z bardziej oczywistą składnią, dopiero po przejściu na lodash-es i użyciu tej import has from 'lodash-es/has'składni wstrząsnęłam pełnym drzewem. ze 526 KB na 184 KB, patrz stackoverflow.com/questions/41991178/...
Brandon Søren Culley

86

Jeśli używasz webpack 4, poniższy kod można wytrząsać z drzewa.

import { has } from 'lodash-es';

Punkty do odnotowania;

  1. Moduły CommonJS nie są wstrząsane drzewem, więc zdecydowanie powinieneś użyć lodash-es, czyli biblioteki Lodash eksportowanej jako ES Modules, a nie lodash(CommonJS).

  2. lodash-es„Package.json zawiera” "sideEffects": false, który informuje webpack 4, że wszystkie pliki w pakiecie są wolne od efektów ubocznych (patrz https://webpack.js.org/guides/tree-shaking/#mark-the-file-as-side -efektywne ).

  3. Informacje te są kluczowe dla wstrząsania drzewem, ponieważ programy pakujące moduły nie wstrząsają plikami, które prawdopodobnie zawierają skutki uboczne, nawet jeśli ich eksportowane elementy nie są nigdzie używane.

Edytować

Począwszy od wersji 1.9.0, Parcel obsługuje również"sideEffects": false , dlatego import { has } from 'lodash-es';też można wstrząsać drzewem za pomocą Parcel. Obsługuje także wstrząsanie drzewami modułów CommonJS, chociaż według mojego eksperymentu wstrząsanie drzewem modułów ES jest bardziej wydajne niż CommonJS .


Przekształciłem wszystkie moje importy Lodash na import { ... } from 'lodash-es'; Mój pakiet nadal zawiera całą bibliotekę.
Isaac Pak

@IsaacPak Upewnij się, że nie przenosisz modułów ES do CommonJS. Jeśli używasz TypeScript, musisz ustawić --moduleopcję kompilatora jako es6, es2015lub esnext.
kimamula

Nie używam TypeScript, a moje ustawienie wstępne .babelrc env jest ustawione na, modules: falsewięc nie są one transpilowane do CommonJS. Korzystam teraz z rozwiązania Bruce'a, które wydaje się działać. Dzięki za Twój wkład, jestem pewien, że to działa, ale po prostu nie mam konfiguracji.
Isaac Pak

niestety nie mogę w tym momencie używać lodash-es z: github.com/facebook/jest/issues/4842#issuecomment-491434065
apollo

1
import has from 'lodash-es/has'a import {has} from 'lodash-es'oba warianty drżą podczas korzystania z drzewwebpack-4
Legends

9

Zaimportuj określone metody w nawiasach klamrowych

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

Plusy:

  • Tylko jeden wiersz importu (dla przyzwoitej liczby funkcji)
  • Bardziej czytelne użycie: map () zamiast _.map () później w kodzie javascript.

Cons:

  • Za każdym razem, gdy chcemy skorzystać z nowej funkcji lub przestać korzystać z innej - należy ją utrzymywać i zarządzać

Dzięki za przydatną odpowiedź. Jednak podoba mi się, _.map()aby składnia była jasna, że ​​używana jest biblioteka zewnętrzna. Czy import _ from 'lodash'równie skuteczna jest twoja sugestia, czy też istnieje inny sposób na użycie tej składni?
Toivo Säwén

1
@ ToivoSäwén Całkowicie się zgadzam i wolę również jawną _.map()składnię. Czy udało Ci się wymyślić sposób na utrzymanie tego podczas importowania es6 i drżenia drzew?
Raj

4

Jeśli używasz babel, powinieneś sprawdzić babel-plugin-lodash , to wybierze części lodash, których używasz dla ciebie, mniej kłopotów i mniejszy pakiet.

Ma kilka ograniczeń :

  • Aby załadować Lodash, musisz użyć importu ES2015
  • Babel <6 i Node.js <4 nie są obsługiwane
  • Sekwencje łańcuchowe nie są obsługiwane. Zobacz ten post na blogu, aby znaleźć alternatywy.
  • Modularne pakiety metod nie są obsługiwane

4

Możesz je zaimportować jako

import {concat, filter, orderBy} from 'lodash';

lub jako

import concat from 'lodash/concat';
import orderBy from 'lodash/orderBy';
import filter from 'lodash/filter';

drugi jest znacznie zoptymalizowany niż pierwszy, ponieważ ładuje tylko potrzebne moduły

użyj tego w ten sposób

pendingArray: concat(
                    orderBy(
                        filter(payload, obj => obj.flag),
                        ['flag'],
                        ['desc'],
                    ),
                    filter(payload, obj => !obj.flag),

1

Importuj Lodash w wersji 4.17.15

import * as _ from 'lodash';
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.