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


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.


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 .


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

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

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),

1

Importar Lodash na versão 4.17.15

import * as _ from 'lodash';
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.