Bagaimana cara Mengimpor Fungsi Lodash Tunggal?

128

Menggunakan webpack, saya mencoba mengimpor isEqual karena lodashsepertinya mengimpor semuanya. Saya telah mencoba melakukan hal berikut tetapi tidak berhasil:

import { isEqual } from 'lodash'

import isEqual from 'lodash/lang'

import isEqual from 'lodash/lang/isEqual'

import { isEqual } from 'lodash/lang'

import { isEqual } from 'lodash/lang'
adang3
sumber
1
Apakah maksud Anda npmjs.com/package/lodash.isequal ?
Boris Charpentier
1
tidak, saya juga ingin mengimpor fungsi lain
adang3
2
Dalam pemahaman saya, Anda sekarang dapat mengimpor satu per satu atau semuanya, tanpa jalan tengah. Saya akan merekomendasikan satu per satu meskipun itu menambahkan banyak ketergantungan di package.json, akan lebih mudah untuk menguji dan meningkatkan metode satu per satu nanti, daripada semuanya dalam satu langkah
Boris Charpentier

Jawaban:

205

Anda dapat menginstal lodash.isequalsebagai modul tunggal tanpa menginstal seluruh paket lodash seperti:

npm install --save lodash.isequal

Saat menggunakan modul ECMAScript 5 dan CommonJS, Anda kemudian mengimpornya seperti ini:

var isEqual = require('lodash.isequal');

Menggunakan modul ES6, ini akan menjadi:

import isEqual from 'lodash.isequal';

Dan Anda dapat menggunakannya di kode Anda:

const obj1 = {username: 'peter'};
const obj2 = {username: 'peter'};
const obj3 = {username: 'gregory'};

isEqual(obj1, obj2) // returns true
isEqual(obj1, obj3) // returns false

Sumber: Dokumentasi Lodash

Setelah mengimpor, Anda dapat menggunakan isEqualfungsi tersebut di kode Anda. Perhatikan bahwa ini bukan bagian dari objek yang dinamai _jika Anda mengimpornya dengan cara ini, jadi Anda tidak mereferensikannya dengan _.isEqual, tetapi langsung denganisEqual .

Alternatif: Menggunakan lodash-es

Seperti yang ditunjukkan oleh @kimamula :

Dengan webpack 4 dan lodash-es 4.17.7 dan yang lebih tinggi, kode ini berfungsi.

import { isEqual } from 'lodash-es';

Hal ini karena Webpack 4 mendukung para sideeffects bendera dan lodash-es4.17.7 dan lebih tinggi termasuk bendera (yang diatur ke false).

Mengapa Tidak Menggunakan Versi Dengan Slash? Jawaban lain untuk pertanyaan ini menyarankan Anda juga dapat menggunakan tanda hubung sebagai pengganti titik, seperti ini:

import isEqual from 'lodash/isequal';

Ini juga berfungsi, tetapi ada dua kelemahan kecil:

  • Anda harus menginstal seluruh paket lodash ( npm install --save lodash), bukan hanya lodash.isequal kecil yang terpisah paket ; ruang penyimpanan murah dan CPU cepat, jadi Anda mungkin tidak peduli tentang ini
  • Bundel yang dihasilkan saat menggunakan alat seperti webpack akan sedikit lebih besar; Saya menemukan bahwa ukuran bundel dengan contoh kode minimal isEqualrata-rata 28% lebih besar (mencoba webpack 2 dan webpack 3, dengan atau tanpa Babel, dengan atau tanpa Uglify)
Patrick Hund
sumber
Tidak berhasil untuk saya karena alasan tertentu, saya dapatkan _ is not definedsaat menggunakan_.isEquals
adang3
9
@cvDv, Tetapi tidak seharusnya menggunakan seperti _.isEqual, Anda harus menggunakan langsungisEqual
Aren Hovsepyan
1
Sudahkah Anda menginstal modul? npm i --save lodash.isequal
Patrick Hund
1
@thund Karena jawaban ini mendapat banyak suara positif, saya telah meluangkan waktu untuk membandingkan ukuran bundel saat menggunakan titik (seperti yang direkomendasikan oleh dokumen lodash) dan garis miring, lihat jawaban saya yang diedit
Patrick Hund
1
@PatrickHund: Itu sangat menarik. Saya setuju bahwa biaya overhead untuk memiliki seluruh lodash di mesin pengembangan Anda cukup sepele, terutama karena ini menghilangkan kebutuhan untuk menjalankan npm --save lodash.whateversetiap fungsi secara terpisah, tetapi ukuran bundel yang lebih besar tentu saja dapat membuatnya layak menggunakan metode periode. Saya terkejut bahwa ada perbedaan, jadi saya senang Anda menghitung jumlahnya untuk kami.
guntur
64

Jika Anda hanya ingin memasukkan isEqualdan bukan lodashfungsi lainnya (berguna untuk menjaga ukuran bundel Anda tetap kecil), Anda dapat melakukan ini di ES6;

import isEqual from 'lodash/isEqual'

Ini cukup banyak yang sama seperti apa yang dijelaskan dalam yang lodashREADME , kecuali bahwa ada mereka gunakan require()sintaks.

var at = require('lodash/at');
Jo Sprague
sumber
29

Dengan webpack 4 dan lodash-es 4.17.7 dan yang lebih tinggi, kode ini berfungsi.

import { isEqual } from 'lodash-es';

Ini karena webpack 4 mendukung sideEffectsflag dan lodash-es 4.17.7 dan yang lebih tinggi menyertakan flag (yang disetel kefalse ).

Sunting

Mulai versi 1.9.0, Parcel juga mendukung"sideEffects": false , karena import { isEqual } from 'lodash-es';itu juga pohon dapat diguncang dengan Parcel.

kimamula
sumber
1
Luar biasa, saya menambahkan info ini ke jawaban saya, semoga Anda baik-baik saja 😀
Patrick Hund
Mengagumkan. Ini dapat mengurangi ukuran bundel saya dari 78 kb menjadi 18 kb menggunakan webpack.
fsevenm
6

Tidak terkait dengan webpack tetapi saya akan menambahkannya di sini karena banyak orang saat ini pindah ke skrip ketikan.

Anda juga dapat mengimpor satu fungsi dari lodash menggunakan import isEqual from 'lodash/isEqual';in typescript dengan esModuleInteropflag di opsi compiler (tsconfig.json)

contoh

{
  "compilerOptions": {
    "module": "commonjs",
    "target": "es5",
    "lib": ["es6", "dom"],
    "moduleResolution": "node",
    "esModuleInterop": true,
    ...
  }
}
Alex Beauchemin
sumber
1

Lodash mencantumkan beberapa opsi di README mereka :

  • babel-plugin-lodash

    • Instal lodash dan plugin babel:
    $ npm i --save lodash
    $ npm i --save-dev babel-plugin-lodash @babel/cli @babel/preset-env
    • Tambahkan ini ke Anda .babelrc
    {
      "plugins": ["lodash"],
      "presets": [["@babel/env", { "targets": { "node": 6 } }]]
    }
    • Ubah ini
    import _ from 'lodash'
    import { add } from 'lodash/fp'
    
    const addOne = add(1)
    _.map([1, 2, 3], addOne)

    Secara kasar untuk ini:

    import _add from 'lodash/fp/add'
    import _map from 'lodash/map'
    
    const addOne = _add(1)
    _map([1, 2, 3], addOne)
  • lodash-webpack-plugin

    • Instal plugin lodash dan webpack:
    $ npm i --save lodash
    $ npm i --save-dev lodash-webpack-plugin babel-core babel-loader babel-plugin-lodash babel-preset-env webpack
    • Konfigurasi Anda webpack.config.js:
    var LodashModuleReplacementPlugin = require('lodash-webpack-plugin');
    var webpack = require('webpack');
    
    module.exports = {
      'module': {
        'rules': [{
          'use': 'babel-loader',
          'test': /\.js$/,
          'exclude': /node_modules/,
          'options': {
            'plugins': ['lodash'],
            'presets': [['env', { 'modules': false, 'targets': { 'node': 4 } }]]
          }
        }]
      },
      'plugins': [
        new LodashModuleReplacementPlugin,
        new webpack.optimize.UglifyJsPlugin
      ]
    };
  • lodash-es menggunakan lodash cli

    • $ lodash modularize exports=es -o ./
mlunoe
sumber
0

ini benar-benar berhasil untuk saya

import { isEqual } from 'lodash';
viktorko99
sumber
24
Anda masih mendapatkan perpustakaan lodash lengkap dengan menggunakan sintaks ini. OP hanya ingin mendapatkan funtion isEqual, mengurangi ukuran bundelnya.
Nyegaard
Ini akan mengimpor semua lib dan kemudian mengekstrak satu fungsi ke lingkup saat ini.
Lukas Liesis
0

import { isEqual } from 'lodash-es';sedang mengimpor seluruh perpustakaan. Saya menggunakan Rollup yang seharusnya melakukan goyangan pohon secara default.

Setiap kali saya menulis modul saya sendiri, sintaks impor bernama ini berfungsi dan Rollup berhasil getar pohon, jadi saya agak bingung mengapa tidak berfungsi dengan Lodash.

Ollie Williams
sumber