Maneira correta de importar lodash

185

Eu tive um feedback de solicitação de recebimento abaixo, apenas imaginando qual é a maneira correta de importar o lodash?

É melhor importar o has do 'lodash / has'. Para a versão anterior do lodash (v3), que por si só é bastante pesada, devemos importar apenas um módulo / função especídica em vez de importar toda a biblioteca do lodash. Não tenho certeza sobre a versão mais recente (v4).

import has from 'lodash/has';

vs

import { has } from 'lodash';

obrigado

Conta
fonte
4
Veja esta resposta para uma discussão mais aprofundada sobre por que o último ainda pode sofrer uma otimização de desempenho em alguns ambientes, como o Webpack. É devido ao uso de análise estática e tremor de árvore.
Patrick Roberts

Respostas:

244

import has from 'lodash/has';é melhor porque o lodash mantém todas as suas funções em um único arquivo; portanto, em vez de importar toda a biblioteca 'lodash' a 100k, é melhor importar apenas a hasfunção do lodash, que talvez seja 2k.

Conta
fonte
1
@GeorgeKatsanos você acabou de importar a função que deseja usar, não precisa de '_' #
Bill Bill
5
@GeorgeKatsanos 'lodash/has'não é um pacote separado. Há um arquivo chamado has.jsna raiz do 'lodash'pacote regular e import has from 'lodash/has'(ou const has = require ('lodash/has) carregará esse arquivo. Não são pacotes método separado sobre npm, mas eles usam a "sintaxe de ponto": 'lodash.has'. Isso também seria uma maneira válida de fazer isso, se você não se importar em instalar um pacote separado para cada método que você usa (e potencialmente aumentar sua package.jsonmassa como resultado).
Daemonexmachina
80
Tenho de acrescentar aqui que, se você usar Webpack 2 ou cumulativo (a bundler que suportes árvore agitação), em seguida, import { has } from 'lodash'iria trabalhar da mesma forma, já que o resto vai ser retirados
Alex JM
1
A agitação em árvore do @PDN webpack 2 deve fazê-lo automaticamente para você #
Bill
23
ao contrário de alguns outros, minha trepidação de árvores não funcionaria com a sintaxe mais óbvia; foi somente depois que mudei para o lodash-es e usei a import has from 'lodash-es/has'sintaxe que eu peguei a trepidação total da árvore. passou de 526 KB para 184 KB, consulte stackoverflow.com/questions/41991178/…
Brandon Søren Culley
86

Se você estiver usando webpack 4, o código a seguir é trêmulo.

import { has } from 'lodash-es';

Os pontos a serem observados;

  1. Os módulos CommonJS não podem ser alterados em árvore, portanto você deve usar definitivamente lodash-es, que é a biblioteca Lodash exportada como Módulos ES, em vez de lodash(CommonJS).

  2. lodash-escontém package.json "sideEffects": false, que notifica o webpack 4 de que todos os arquivos dentro do pacote são livres de efeitos colaterais (consulte https://webpack.js.org/guides/tree-shaking/#mark-the-file-as-side sem efeitos ).

  3. Essas informações são cruciais para agitar a árvore, pois os agrupadores de módulos não armazenam arquivos de agitação na árvore que possivelmente contêm efeitos colaterais, mesmo que seus membros exportados não sejam usados ​​em nenhum lugar.

Editar

A partir da versão 1.9.0, o Parcel também suporta"sideEffects": false , portanto, import { has } from 'lodash-es';também é instável em árvore com o Parcel. Ele também suporta módulos CommonJS de agitação de árvore, embora seja provável que a agitação de árvore dos Módulos ES seja mais eficiente que o CommonJS, de acordo com meu experimento .

kimamula
fonte
Eu converti todas as minhas importações de lodash para import { ... } from 'lodash-es'; Meu pacote ainda inclui toda a biblioteca.
Isaac Pak
@IsaacPak Certifique-se de não transpender os módulos ES para o CommonJS. Se você estiver usando o TypeScript, precisará definir a --moduleopção do compilador como es6, es2015ou esnext.
kimamula 28/01
Não estou usando o TypeScript e minha predefinição .babelrc env está definida como modules: falsepara que eles não sejam transpilados para o CommonJS. Agora estou usando a solução de Bruce, que parece funcionar. Obrigado pela sua contribuição, tenho certeza que funciona, mas simplesmente não tenho a configuração para isso.
Isaac Pak
infelizmente, não é possível usar lodash-es com jest neste momento: github.com/facebook/jest/issues/4842#issuecomment-491434065
apollo
1
import has from 'lodash-es/has'e as import {has} from 'lodash-es'duas variantes agitam árvores ao usarwebpack-4
Legends
9

Importar métodos específicos dentro de colchetes

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

Prós:

  • Apenas uma linha de importação (para uma quantidade decente de funções)
  • Uso mais legível: map () em vez de _.map () posteriormente no código javascript.

Contras:

  • Toda vez que queremos usar uma nova função ou parar de usar outra - ela precisa ser mantida e gerenciada
Nikhil
fonte
Obrigado pela resposta útil. No entanto, eu gosto da _.map()sintaxe para deixar claro que uma biblioteca externa está sendo usada. É import _ from 'lodash'igualmente eficiente como sua sugestão ou existe outra maneira de poder usar essa sintaxe?
Toivo Säwén 21/01
1
@ ToivoSäwén Concordo plenamente e também prefiro a _.map()sintaxe explícita . Você foi capaz de descobrir uma maneira de manter isso enquanto importa es6 e agita as árvores?
Raj
4

Se você estiver usando o babel, verifique o babel-plugin-lodash , ele selecionará as partes do lodash que você está usando para você, menos problemas e um pacote menor.

Tem algumas limitações :

  • Você deve usar as importações do ES2015 para carregar o Lodash
  • Babel <6 & Node.js <4 não são suportados
  • Sequências em cadeia não são suportadas. Veja esta postagem no blog para alternativas.
  • Pacotes de métodos modularizados não são suportados
Orlando
fonte
4

Você pode importá-los como

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

ou como

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

o segundo é muito otimizado que o primeiro porque carrega apenas os módulos necessários

então use assim

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

Importar Lodash na versão 4.17.15

import * as _ from 'lodash';
Vinay
fonte