Lodash'ı içe aktarmanın doğru yolu


185

Aşağıda çekme isteği geribildirimi vardı, sadece lodash'ı içe aktarmanın doğru yolunun ne olduğunu merak ediyorum?

Ithalat 'lodash / has' vardır daha iyi yapardı .. kendi başına oldukça ağır olan lodash (v3) önceki sürümü için, tüm lodash kütüphanesini almak yerine sadece specidic bir modül / işlev almak gerekir. Daha yeni sürümden (v4) emin değilim.

import has from 'lodash/has';

vs

import { has } from 'lodash';

Teşekkürler


4
Webpack gibi bazı ortamlarda neden performans optimizasyonuna neden olabileceğiyle ilgili daha ayrıntılı bir tartışma için bu cevaba bakın . Statik analiz ve ağaç sallama kullanımından kaynaklanmaktadır.
Patrick Roberts

Yanıtlar:


244

import has from 'lodash/has';daha iyi çünkü lodash tüm işlevlerini tek bir dosyada tutuyor, bu yüzden tüm 'lodash' kütüphanesini 100k'de içe aktarmak yerine has, belki de 2k olan lodash'ın işlevini içe aktarmak daha iyidir .


1
@GeorgeKatsanos sadece kullanmak istediğiniz işlevi içe aktarırsınız, '_' gerekmez
Bill

5
@GeorgeKatsanos 'lodash/has'ayrı bir paket değil. has.jsNormal 'lodash'paketin kökünde çağrılan bir dosya var ve import has from 'lodash/has'(veya const has = require ('lodash/has) bu dosyayı yükleyecek. Orada olan NPM ayrı yöntem paketleri, ancak "nokta sözdizimi" kullanın: 'lodash.has'. Bu, kullandığınız her yöntem için ayrı bir paket kurmayı (ve package.jsonsonuç olarak büyük olasılıkla kitlesel hale getirmeyi) sakıncası yoksa bu konuda geçerli bir yol olacaktır .
daemonexmachina

80
Burada, webpack 2 veya toplaması (ağaç sallamayı destekleyen bir paketleyici) kullanırsanız, import { has } from 'lodash'geri kalanı çıkacağından aynı şekilde çalışacağını eklemeliyim
Alex JM

1
@PDN webpack 2 ağaç titremesi sizin için otomatik olarak yapmalıdır
Bill

23
diğerlerinden farklı olarak, ağaç titremem daha belirgin sözdizimi ile çalışmaz, sadece lodash-es'e geçtikten ve import has from 'lodash-es/has'sözdizimini kullandıktan sonra tam ağaç titriyor muydum . 526KB'den 184KB'ye gitti, bkz. stackoverflow.com/questions/41991178/…
Brandon Søren Culley

86

Kullanıyorsanız webpack 4, aşağıdaki kod ağaç sallanabilir.

import { has } from 'lodash-es';

Dikkat edilmesi gereken hususlar;

  1. CommonJS modülleri ağaç sarsıntılı değildir lodash-es, bu nedenle lodash(CommonJS) yerine ES Modülleri olarak dışa aktarılan Lodash kütüphanesi olan kesinlikle kullanmalısınız .

  2. lodash-es's package.json "sideEffects": false, paketin içindeki tüm dosyaların yan etkisiz olduğunu bildiren web paketini 4 bildirir (bkz. https://webpack.js.org/guides/tree-shaking/#mark-the-file-as-side - etkisiz ).

  3. Modül paketleyicileri, dışa aktarılan üyeleri hiçbir yerde kullanılmasa bile muhtemelen yan etkiler içeren ağaç sallama dosyalarını kullanmadıklarından, bu bilgiler ağaç sallamak için çok önemlidir.

Düzenle

1.9.0 sürümünden itibaren, Parsel de destekler"sideEffects": false , bu nedenle import { has } from 'lodash-es';Parsel ile ağaç sallanabilir. O ES Modülleri sallayarak muhtemel bir ağaçtır göre CommonJS daha etkilidir olsa Ayrıca, ağaç sallama CommonJS modüllerini destekler Denemem .


Tüm ithalatlarımı Paketime dönüştürdüm, import { ... } from 'lodash-es'; hala tüm kütüphaneyi içeriyor.
Isaac Pak

@IsaacPak ES modüllerini CommonJS'ye aktarmadığınızdan emin olun. Eğer typescript kullanıyorsanız, ayarlanan zorunda --moduleolduğu derleyici seçeneği es6, es2015ya esnext.
kimamula

TypeScript kullanmıyorum ve benim .babelrc env ön ayarı, modules: falseCommonJS'ye aktarılmaması için ayarlanır. Bruce'un çözümünü şimdi işe yarıyor gibi görüyorum. Katkınız için teşekkürler, işe yaradığından eminim ama bunun için bir ayarım yok.
Isaac Pak

ne yazık ki, bu noktada jest ile lodash-es kullanamazsınız: github.com/facebook/jest/issues/4842#issuecomment-491434065
apollo

1
import has from 'lodash-es/has've import {has} from 'lodash-es'her iki değişken de kullanırken ağaç sarsıntısı yapıyorwebpack-4
Efsaneler

9

Kıvırcık parantez içindeki belirli yöntemleri içe aktarma

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

Artıları:

  • Yalnızca bir içe aktarma satırı (makul miktarda işlev için)
  • Daha okunabilir kullanım: daha sonra javascript kodunda _.map () yerine map () kullanın.

Eksileri:

  • Her yeni bir işlev kullanmak istediğimizde veya başka bir işlev kullanmayı bıraktığımızda - bakımının yapılması ve yönetilmesi gerekir

Yararlı cevap için teşekkürler. Ancak, _.map()sözdiziminin harici bir kitaplığın kullanıldığını netleştirmesini seviyorum . import _ from 'lodash'Öneri kadar eşit derecede verimli mi yoksa bu sözdizimini kullanabilmenin başka bir yolu var mı?
Toivo Säwén

1
@ ToivoSäwén Açık _.map()sözdizimini de tamamen kabul ediyorum ve tercih ediyorum . Es6 ithalatı ve ağaç sallama yaparken bunu korumanın bir yolunu bulabildiniz mi?
Raj


4

Bunları şu şekilde içe aktarabilirsiniz:

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

veya gibi

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

ikincisi ilkinden çok daha optimize edilmiştir çünkü sadece gerekli modülleri yükler

o zaman böyle kullan

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

1

Lodash'ı sürümde içe aktar 4.17.15

import * as _ from 'lodash';
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.