lodashをインポートする正しい方法


185

以下にプルリクエストのフィードバックがありましたが、lodashをインポートする正しい方法はどちらかと思いますか?

インポートは 'lodash / has'から行うほうがよいでしょう。それ自体がかなり重いlodash(v3)の以前のバージョンでは、lodashライブラリ全体をインポートするのではなく、特定のモジュール/関数のみをインポートする必要があります。新しいバージョン(v4)については不明です。

import has from 'lodash/has';

import { has } from 'lodash';

ありがとう


4
Webpackなどの一部の環境でパフォーマンスが最適化される理由については、この回答を参照してください。これは、静的分析とツリーの揺れの使用によるものです。
Patrick Roberts

回答:


244

import has from 'lodash/has';lodashはすべての関数を単一のファイルに保持しているため、より優れています。したがって、「lodash」ライブラリ全体を100kでインポートhasするのではなく、おそらく2kであるlodashの関数をインポートする方が適切です。


1
@GeorgeKatsanos使用する関数をインポートするだけで、「_」は不要です
Bill

5
@GeorgeKatsanos 'lodash/has'は独立したパッケージではありません。has.js通常の'lodash'パッケージのルートに呼び出されたファイルがあり、import has from 'lodash/has'(またはconst has = require ('lodash/has)がそのファイルをロードします。npmに個別のメソッドパッケージがあります、「ドット構文」を使用します'lodash.has'。これは、使用するすべての方法に個別のパッケージをインストールすることを気にしない場合(そしてpackage.json結果として大規模になる可能性がある場合)にも有効な方法です。
daemonexmachina 2016年

80
ここに追加する必要があります。webpack2またはロールアップ(ツリーの揺れをサポートするバンドル)を使用する場合import { has } from 'lodash'、残りは取り除かれるので同じように機能します
Alex JM

1
@PDN webpack 2ツリーシェイクで自動的に行われるはずです
Bill

23
他のいくつかとは異なり、私のツリーの揺れはより明白な構文では機能しません。lodash-esに切り替えてimport has from 'lodash-es/has'構文を使用した後でなければ、完全なツリーの揺れが得られませんでした。526キロバイトから184キロバイトに行き、見stackoverflow.com/questions/41991178/...
ブランドンセーレンCulley

86

を使用しているwebpack 4場合、次のコードはツリーを揺らすことができます。

import { has } from 'lodash-es';

注意すべき点;

  1. CommonJSモジュールはツリーを揺らすことができないためlodash-eslodash(CommonJS)ではなく、ESモジュールとしてエクスポートされたLodashライブラリであるを必ず使用する必要があります。

  2. lodash-esのpackage.jsonには"sideEffects": false、パッケージ内のすべてのファイルに副作用がないことをwebpack 4に通知するが含まれています(https://webpack.js.org/guides/tree-shaking/#mark-the-file-as-sideを参照) -効果なし)。

  3. エクスポートされたメンバーがどこでも使用されていない場合でも、モジュールバンドルは副作用を含む可能性のあるファイルをツリーシェイクしないため、この情報はツリーシェイクにとって重要です。

編集する

バージョン1.9.0以降、Parcel"sideEffects": falseはもサポートしているため、Parcelでimport { has } from 'lodash-es';ツリーを揺さぶることもできます。私の実験によると ESモジュールのツリーシェイクはCommonJSよりも効率的である可能性が高いですが、CommonJSモジュールのツリーシェイキングもサポートしています。


すべてのlodashインポートをimport { ... } from 'lodash-es'; Myバンドルに変換しましたが、ライブラリ全体がまだ含まれています。
Isaac Pak

@IsaacPak ESモジュールをCommonJSにトランスパイピングしないようにしてください。TypeScriptを使用している場合は、--moduleコンパイラオプションをes6es2015またはに設定する必要がありますesnext
kimamula

TypeScriptを使用しておらず、.babelrc envプリセットがに設定されているmodules: falseため、CommonJSに変換されません。私は今動作するように見えるブルースのソリューションを使用しています。ご協力いただきありがとうございます。きっと動作しますが、設定がありません。
Isaac Pak

残念ながら、現時点ではjashでlodash-esを使用できません:github.com/facebook/jest/issues/4842#issuecomment-491434065
apollo

1
import has from 'lodash-es/has'そしてimport {has} from 'lodash-es'使用している場合、両方の変異体は、treeshakingんwebpack-4
伝説の

9

中括弧内に特定のメソッドをインポートする

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

長所:

  • 1つのインポート行のみ(適切な量の関数の場合)
  • より読みやすい使用法:後でJavaScriptコードの_.map()ではなくmap()。

短所:

  • 新しい機能を使用したり、別の機能の使用を停止したりするたびに、それを維持および管理する必要があります

有用な回答をありがとう。ただし、_.map()外部ライブラリが使用されていることを明確にする構文が好きです。import _ from 'lodash'あなたの提案と同じくらい効率的ですか、この構文を使用できる別の方法はありますか?
ToivoSäwén

1
@ToivoSäwén私は完全に同意し、明示的な_.map()構文も好みます。es6のインポートとツリーのシェイクを実行しているときにそれを維持する方法を理解できましたか?
Raj

4

babelを使用している場合は、babel-plugin-lodashを確認してください。使用しているlodashのパーツが選択され、手間が少なく、バンドルが小さくなります。

これにはいくつかの制限があります。

  • Lodashをロードするには、ES2015インポートを使用する必要があります
  • Babel <6&Node.js <4はサポートされていません
  • チェーンシーケンスはサポートされていません。代替案については、このブログ投稿を参照してください。
  • モジュール化されたメソッドパッケージはサポートされていません

4

次のようにインポートできます

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

またはとして

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

2つ目は必要なモジュールのみをロードするため、1つ目よりもはるかに最適化されています

次に、このように使用します

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

1

Lodashをバージョンにインポート 4.17.15

import * as _ from 'lodash';
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.