Richtiger Weg, um lodash zu importieren

182

Ich hatte unten ein Pull-Request-Feedback und fragte mich nur, wie ich Lodash richtig importieren kann.

Sie sollten has aus 'lodash / has' importieren. Für die frühere Version von lodash (v3), die an sich ziemlich schwer ist, sollten wir nur ein bestimmtes Modul / eine bestimmte Funktion importieren, anstatt die gesamte lodash-Bibliothek zu importieren. Ich bin mir nicht sicher über die neuere Version (v4).

import has from 'lodash/has';

vs.

import { has } from 'lodash';

Vielen Dank

Rechnung
quelle
4
In dieser Antwort finden Sie eine ausführlichere Diskussion darüber, warum letztere in einigen Umgebungen wie Webpack immer noch eine Leistungsoptimierung bewirken können. Es ist auf die Verwendung von statischer Analyse und Baumschütteln zurückzuführen.
Patrick Roberts

Antworten:

242

import has from 'lodash/has';ist besser, weil lodash alle seine Funktionen in einer einzigen Datei enthält. Anstatt die gesamte 'lodash'-Bibliothek mit 100.000 zu importieren, ist es besser, nur die hasFunktion von lodash zu importieren, die vielleicht 2.000 beträgt.

Rechnung
quelle
1
@ GeorgeKatsanos Sie importieren nur die Funktion, die Sie verwenden möchten, Sie brauchen nicht '_'
Bill
5
@ GeorgeKatsanos 'lodash/has'ist kein separates Paket. has.jsIm Stammverzeichnis des regulären 'lodash'Pakets befindet sich eine Datei, die diese Datei import has from 'lodash/has'(oder const has = require ('lodash/has) lädt. Es gibt separate Methodenpakete für npm, die jedoch die "Punktsyntax" verwenden : 'lodash.has'. Dies wäre auch ein gültiger Weg, wenn Sie nichts dagegen haben, für jede Methode, die Sie verwenden , ein separates Paket zu installieren (und dadurch möglicherweise package.jsonmassiv zu werden).
Daemonexmachina
80
Ich muss hier hinzufügen, dass, wenn Sie Webpack 2 oder Rollup (einen Bundler, der das Schütteln von Bäumen unterstützt) verwenden, import { has } from 'lodash'dies genauso funktionieren würde, da der Rest entfernt wird
Alex JM
1
@PDN Webpack 2 Baumschütteln sollte es automatisch für Sie tun
Bill
23
Im Gegensatz zu einigen anderen würde mein Baumschütteln nicht mit der offensichtlicheren Syntax funktionieren. Erst nachdem ich zu lodash-es gewechselt und die import has from 'lodash-es/has'Syntax verwendet hatte, bekam ich ein vollständiges Baumschütteln. ging von 526KB auf 184KB, siehe stackoverflow.com/questions/41991178/…
Brandon Søren Culley
83

Wenn Sie verwenden webpack 4, ist der folgende Code baumschüttelnd.

import { has } from 'lodash-es';

Die zu beachtenden Punkte;

  1. CommonJS-Module sind nicht baumschüttelbar, daher sollten Sie auf jeden Fall lodash-esdie als ES-Module exportierte Lodash-Bibliothek anstelle von lodash(CommonJS) verwenden.

  2. lodash-es's package.json enthält "sideEffects": false, das Webpack 4 darüber informiert, dass alle Dateien im Paket nebenwirkungsfrei sind (siehe https://webpack.js.org/guides/tree-shaking/#mark-the-file-as-side -effektfrei ).

  3. Diese Informationen sind für das Baumschütteln von entscheidender Bedeutung, da Modulbündler keine Baumschütteldateien verwenden, die möglicherweise Nebenwirkungen enthalten, selbst wenn ihre exportierten Mitglieder nirgendwo verwendet werden.

Bearbeiten

Ab Version 1.9.0 unterstützt Parcel auch"sideEffects": false , daher import { has } from 'lodash-es';kann mit Parcel auch ein Baum geschüttelt werden. Es unterstützt auch das Baumschütteln von CommonJS-Modulen, obwohl es laut meinem Experiment wahrscheinlich ist, dass das Baumschütteln von ES-Modulen effizienter ist als CommonJS .

Kimamula
quelle
Ich habe alle meine lodash-Importe in " import { ... } from 'lodash-es'; Mein Bundle" konvertiert und enthält weiterhin die gesamte Bibliothek.
Isaac Pak
@IsaacPak Stellen Sie sicher, dass Sie keine ES-Module an CommonJS übertragen. Wenn Sie Typoskript verwenden, müssen Sie Satz - --moduleCompiler - Option wie es6, es2015oder esnext.
Kimamula
Ich verwende kein TypeScript und meine .babelrc env-Voreinstellung ist so eingestellt, modules: falsedass sie nicht in CommonJS transpiliert werden. Ich verwende jetzt die Lösung von Bruce, die zu funktionieren scheint. Vielen Dank für Ihren Beitrag, ich bin sicher, dass es funktioniert, aber ich habe einfach nicht das Setup dafür.
Isaac Pak
Leider können Lodash-es derzeit nicht mit Scherz verwendet werden: github.com/facebook/jest/issues/4842#issuecomment-491434065
Apollo
1
import has from 'lodash-es/has'und import {has} from 'lodash-es'beide Varianten machen Treeshaking bei der Verwendungwebpack-4
Legends
9

Importieren Sie bestimmte Methoden in geschweifte Klammern

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

Vorteile:

  • Nur eine Importzeile (für eine anständige Anzahl von Funktionen)
  • Besser lesbare Verwendung: map () anstelle von _.map () später im Javascript-Code.

Nachteile:

  • Jedes Mal, wenn wir eine neue Funktion verwenden oder eine andere nicht mehr verwenden möchten, muss sie gewartet und verwaltet werden
Nikhil
quelle
Danke für die nützliche Antwort. Ich möchte _.map()jedoch, dass die Syntax klar ist, dass eine externe Bibliothek verwendet wird. Ist es import _ from 'lodash'genauso effizient wie Ihr Vorschlag oder gibt es eine andere Möglichkeit, diese Syntax zu verwenden?
Toivo Säwén
1
@ ToivoSäwén Ich stimme voll und ganz zu und bevorzuge auch die explizite _.map()Syntax. Konnten Sie einen Weg finden, dies aufrechtzuerhalten, während Sie es6 importierten und Bäume schüttelten?
Raj
4

Wenn Sie babel verwenden, sollten Sie sich babel-plugin-lodash ansehen . Es wird die Teile von lodash auswählen, die Sie für Sie verwenden, weniger Aufwand und ein kleineres Bündel.

Es gibt einige Einschränkungen :

  • Sie müssen ES2015-Importe verwenden, um Lodash zu laden
  • Babel <6 & Node.js <4 werden nicht unterstützt
  • Kettensequenzen werden nicht unterstützt. In diesem Blogbeitrag finden Sie Alternativen.
  • Modularisierte Methodenpakete werden nicht unterstützt
Orlando
quelle
4

Sie können sie als importieren

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

oder als

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

Das zweite ist viel optimierter als das erste, da nur die benötigten Module geladen werden

dann benutze so

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