Modo corretto di importare lodash


185

Di seguito ho ricevuto un feedback sulla richiesta pull, chiedendomi in che modo è il modo corretto di importare lodash?

Faresti meglio a importare da 'lodash / has' .. Per la versione precedente di lodash (v3) che di per sé è piuttosto pesante, dovremmo importare solo un modulo / una funzione specifica invece di importare l'intera libreria lodash. Non sono sicuro della versione più recente (v4).

import has from 'lodash/has';

vs

import { has } from 'lodash';

Grazie


4
Vedi questa risposta per una discussione più approfondita sul perché quest'ultimo possa ancora incorrere in un'ottimizzazione delle prestazioni in alcuni ambienti come Webpack. È dovuto all'uso dell'analisi statica e del tremore degli alberi.
Patrick Roberts,

Risposte:


244

import has from 'lodash/has';è meglio perché lodash contiene tutte le sue funzioni in un singolo file, quindi piuttosto che importare l'intera libreria 'lodash' a 100k, è meglio importare solo la hasfunzione di lodash che è forse 2k.


1
@GeorgeKatsanos hai appena importato la funzione che vuoi usare, non hai bisogno di '_'
Bill

5
@GeorgeKatsanos 'lodash/has'non è un pacchetto separato. C'è un file chiamato has.jsnella radice del 'lodash'pacchetto normale e import has from 'lodash/has'(o const has = require ('lodash/has) caricherà quel file. Ci sono pacchetti di metodo separato su NPM, ma usano la "sintassi del punto": 'lodash.has'. Questo sarebbe anche un modo valido per farlo se non ti dispiace installare un pacchetto separato per ogni metodo che usi (e potenzialmente rendere il tuo package.jsonmassiccio di conseguenza).
daemonexmachina,

80
Devo aggiungere qui che, se usi il webpack 2 o il rollup (un bundler che supporta lo scuotimento degli alberi), import { has } from 'lodash'funzionerebbe allo stesso modo, dato che il resto verrà rimosso
Alex JM,

1
L'agitazione dell'albero @PDN webpack 2 dovrebbe farlo automaticamente per te
Bill

23
a differenza di altri, il mio scuotimento dell'albero non funzionava con la sintassi più ovvia, solo dopo che passai a lodash-es e usai la import has from 'lodash-es/has'sintassi, fui scuotendo completamente l'albero. è passato da 526KB a 184KB, vedere stackoverflow.com/questions/41991178/...
Brandon Søren Culley

86

Se si sta utilizzando webpack 4, il seguente codice è shakable dell'albero.

import { has } from 'lodash-es';

I punti da notare;

  1. I moduli CommonJS non sono agitabili ad albero, quindi dovresti assolutamente usare lodash-es, che è la libreria Lodash esportata come moduli ES, piuttosto che lodash(CommonJS).

  2. lodash-es'package.json contiene "sideEffects": false, che notifica al webpack 4 che tutti i file all'interno del pacchetto sono privi di effetti collaterali (vedi https://webpack.js.org/guides/tree-shaking/#mark-the-file-as-side senza effetti ).

  3. Queste informazioni sono cruciali per lo scuotimento degli alberi poiché i bundler di moduli non contengono file di scuotimento degli alberi che probabilmente contengono effetti collaterali anche se i loro membri esportati non vengono utilizzati in alcun luogo.

modificare

A partire dalla versione 1.9.0, Parcel supporta anche"sideEffects": false , quindi import { has } from 'lodash-es';è anche agitabile con Parcel. Supporta anche i moduli CommonJS di agitazione degli alberi, sebbene sia probabile che l'agitazione degli alberi dei moduli ES sia più efficiente di CommonJS secondo il mio esperimento .


Ho convertito tutte le mie importazioni di lodash in Il import { ... } from 'lodash-es'; mio pacchetto include ancora l'intera libreria.
Isaac Pak,

@IsaacPak Assicurati di non trasporre i moduli ES su CommonJS. Se si utilizza TypeScript, è necessario impostare l' --moduleopzione del compilatore come es6, es2015o esnext.
Kimamula,

Non sto usando TypeScript e la mia preimpostazione env .babelrc è impostata in modules: falsemodo che non vengano convertiti in CommonJS. Sto usando la soluzione di Bruce ora che sembra funzionare. Grazie per il tuo contributo, sono sicuro che funzioni, ma non ho la configurazione per questo.
Isaac Pak,

sfortunatamente, non posso usare lodash-es con jest a questo punto: github.com/facebook/jest/issues/4842#issuecomment-491434065
apollo

1
import has from 'lodash-es/has'ed import {has} from 'lodash-es'entrambe le varianti fanno alberi d'albero quando si usawebpack-4
Legends

9

Importa metodi specifici all'interno di parentesi graffe

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

Professionisti:

  • Solo una riga di importazione (per un discreto numero di funzioni)
  • Utilizzo più leggibile: map () anziché _.map () più avanti nel codice javascript.

Contro:

  • Ogni volta che vogliamo usare una nuova funzione o smettere di usarne un'altra, deve essere mantenuta e gestita

Grazie per la risposta utile Tuttavia, mi piace che la _.map()sintassi sia chiara sull'utilizzo di una libreria esterna. È import _ from 'lodash'ugualmente efficace come il tuo suggerimento o esiste un altro modo di usare questa sintassi?
Toivo Säwén,

1
@ ToivoSäwén Sono completamente d'accordo e preferisco anche la _.map()sintassi esplicita . Sei stato in grado di trovare un modo per mantenerlo mentre facevi le importazioni es6 e scuotevi gli alberi?
Raj

4

Se stai usando babel, dovresti dare un'occhiata a babel-plugin-lodash , sceglierà le parti di lodash che stai usando per te, meno problemi e un pacchetto più piccolo.

Ha alcune limitazioni :

  • È necessario utilizzare le importazioni ES2015 per caricare Lodash
  • Babel <6 & Node.js <4 non sono supportati
  • Le sequenze di catene non sono supportate. Vedi questo post sul blog per alternative.
  • I pacchetti di metodi modulari non sono supportati

4

Puoi importarli come

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

o come

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

il secondo è molto ottimizzato rispetto al primo perché carica solo i moduli necessari

quindi utilizzare in questo modo

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

1

Importa Lodash nella versione 4.17.15

import * as _ from 'lodash';
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.