Bonne façon d'importer lodash


185

J'ai eu un commentaire de demande de tirage ci-dessous, je me demandais simplement quelle est la bonne façon d'importer lodash?

Vous feriez mieux d'importer à partir de 'lodash / has'. Pour la version antérieure de lodash (v3) qui en elle-même est assez lourde, nous ne devrions importer qu'un module / une fonction spécifique plutôt que d'importer toute la bibliothèque lodash. Pas sûr de la version la plus récente (v4).

import has from 'lodash/has';

contre

import { has } from 'lodash';

Merci


4
Voir cette réponse pour une discussion plus approfondie sur les raisons pour lesquelles ce dernier peut encore entraîner une optimisation des performances dans certains environnements tels que Webpack. Cela est dû à l'utilisation de l'analyse statique et de la secousse d'arbre.
Patrick Roberts

Réponses:


244

import has from 'lodash/has';est mieux parce que lodash contient toutes ses fonctions dans un seul fichier, donc plutôt que d'importer la bibliothèque entière 'lodash' à 100k, il est préférable d'importer simplement la hasfonction de lodash qui est peut-être 2k.


1
@GeorgeKatsanos vous importez simplement la fonction que vous souhaitez utiliser, vous n'avez pas besoin de '_'
Projet de loi

5
@GeorgeKatsanos 'lodash/has'n'est pas un package séparé. Il y a un fichier appelé has.jsà la racine du 'lodash'paquet normal , et import has from 'lodash/has'(ou const has = require ('lodash/has) chargera ce fichier. Il y a des paquets de méthode séparés sur NPM, mais ils utilisent la « syntaxe à point »: 'lodash.has'. Ce serait également un moyen valable de s'y prendre si cela ne vous dérange pas d'installer un package séparé pour chaque méthode que vous utilisez (et potentiellement de créer votre package.jsonénorme en conséquence).
daemonexmachina

80
Je dois ajouter ici que, si vous utilisez webpack 2 ou rollup (un bundler qui prend en charge le tremblement des arbres), import { has } from 'lodash'cela fonctionnerait de la même manière, puisque le reste sera supprimé
Alex JM

1
@PDN webpack 2 tree shaking devrait le faire pour vous automatiquement
Bill

23
contrairement à certains autres, mon arbre tremblant ne fonctionnerait pas avec la syntaxe la plus évidente, ce n'est qu'après être passé à lodash-es et utilisé la import has from 'lodash-es/has'syntaxe que j'ai obtenu un tremblement complet de l'arbre. est passé de 526 Ko à 184 Ko, voir stackoverflow.com/questions/41991178/…
Brandon Søren Culley

86

Si vous utilisez webpack 4, le code suivant est modifiable dans l'arborescence.

import { has } from 'lodash-es';

Les points à noter;

  1. Les modules CommonJS ne sont pas transformables en arborescence, vous devez donc absolument utiliser lodash-es, qui est la bibliothèque Lodash exportée en tant que modules ES, plutôt que lodash(CommonJS).

  2. lodash-es's package.json contient "sideEffects": false, qui notifie au webpack 4 que tous les fichiers à l'intérieur du package sont sans effet secondaire (voir https://webpack.js.org/guides/tree-shaking/#mark-the-file-as-side -sans effet ).

  3. Ces informations sont cruciales pour le tremblement de l'arbre car les bundlers de modules ne secouent pas les fichiers qui peuvent contenir des effets secondaires même si leurs membres exportés ne sont utilisés nulle part.

Éditer

À partir de la version 1.9.0, Parcel prend également en charge"sideEffects": false , par conséquent, l'arborescence import { has } from 'lodash-es';peut également être modifiée avec Parcel. Il prend également en charge les modules CommonJS d'arborescence, bien qu'il soit probable que l'arborescence des modules ES soit plus efficace que CommonJS selon mon expérience .


J'ai converti toutes mes importations lodash en import { ... } from 'lodash-es'; mon bundle inclut toujours la bibliothèque entière.
Isaac Pak

@IsaacPak Assurez-vous que vous ne transférez pas les modules ES vers CommonJS. Si vous utilisez TypeScript, vous devez définir l' --moduleoption du compilateur sur es6, es2015ou esnext.
kimamula

Je n'utilise pas TypeScript et mon préréglage d'env .babelrc est défini sur modules: falseafin qu'ils ne soient pas transpilés en CommonJS. J'utilise maintenant la solution de Bruce qui semble fonctionner. Merci pour votre contribution, je suis sûr que cela fonctionne mais je n'ai tout simplement pas la configuration pour cela.
Isaac Pak

Malheureusement, je ne peux pas utiliser lodash-es avec jest pour le moment: github.com/facebook/jest/issues/4842#issuecomment-491434065
apollo

1
import has from 'lodash-es/has'et les import {has} from 'lodash-es'deux variantes font trembler les arbres lors de l'utilisationwebpack-4
Legends

9

Importer des méthodes spécifiques à l'intérieur des accolades

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

Avantages:

  • Une seule ligne d'importation (pour un nombre décent de fonctions)
  • Utilisation plus lisible: map () au lieu de _.map () plus tard dans le code javascript.

Les inconvénients:

  • Chaque fois que nous voulons utiliser une nouvelle fonction ou arrêter d'en utiliser une autre - elle doit être maintenue et gérée

Merci pour la réponse utile. Cependant, j'aime que la _.map()syntaxe indique clairement qu'une bibliothèque externe est utilisée. Est-ce import _ from 'lodash'aussi efficace que votre suggestion ou existe-t-il une autre façon de pouvoir utiliser cette syntaxe?
Toivo Säwén le

1
@ ToivoSäwén Je suis tout à fait d'accord et je préfère également la _.map()syntaxe explicite . Avez-vous réussi à trouver un moyen de maintenir cela tout en effectuant des importations ES6 et en secouant les arbres?
Raj

4

Si vous utilisez babel, vous devriez vérifier babel-plugin-lodash , il sélectionnera les parties de lodash que vous utilisez pour vous, moins de tracas et un paquet plus petit.

Il a quelques limitations :

  • Vous devez utiliser les importations ES2015 pour charger Lodash
  • Babel <6 et Node.js <4 ne sont pas pris en charge
  • Les séquences de chaîne ne sont pas prises en charge. Consultez ce billet de blog pour des alternatives.
  • Les packages de méthodes modulaires ne sont pas pris en charge

4

Vous pouvez les importer comme

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

ou comme

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

le second est beaucoup plus optimisé que le premier car il ne charge que les modules nécessaires

alors utilisez comme ça

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

1

Importer Lodash dans la version 4.17.15

import * as _ from 'lodash';
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.