一般的に、我々はより多くの何に、WebPACKの最適化について話す時間を梱包し、ボリューム梱包最適化を。
時間をパッキング
梱包時間を最適化し、我々は戦略を考えることができます:読んでする必要性減らすために文書を解析 し、 パッケージのパフォーマンスを向上します。
ファイルを読み取り、解析する必要性を削減
1.最適化ローダー
バベル・ローダーをするには、たとえば、あなたは、私たちが指定した範囲を除外含めるしようとすることができる場合
キャッシングのパラメータがあるとして、あなたがバベル・ローダーを好きなら、それはまた、使用することができます
モジュール:{ ルール:[ { テスト: /\.js$/ 、 ローダ: 'バベルローダ?CACHEDIRECTORY = TRUE ' 、 含まれる:[解決( 'SRC' )]、 除外する: / node_modules / } ] }
2.演奏のDLL
あなたは、すべてのコードのこの部分を再梱包必要がない場合、プロジェクトにパッケージDLLとしてラベルされた、事前にいくつかの変更頻度の低いコード(通常は、サードパーティのライブラリ)、、。
DLLのWebPACKの構成:
// 別のファイルに配置された // webpack.dll.conf.jsの CONST =パス( 'パス'が必要) のconstのWebPACK =( 'のWebPACK'が必要) module.exportsはは = { {:エントリ // 統一されたパッケージのクラスを希望しますライブラリ ベンダー:[ 'REACT'、 'jQueryの' ] }、 出力:{ パス:path.join(__ DIRNAME、 'DIST' )、 ファイル名: '[名]は.dll.js' 、 ライブラリ: '[名] - [ハッシュ] ' }、 プラグイン:[ 新しい新しいwebpack.DllPlugin({ // 名前が同じである必要がありoutput.library 名:' [名] - [ハッシュ] '、 // この属性は、一貫性のあるDllReferencePlugin必要 __dirname、:コンテキスト パス:path.joinを(__ dirnameは、 'DIST'、 '[名] -manifest.json' ) }) ] }
プロジェクトのWebPACK構成:
// webpack.conf.js module.exportsは= { // ...他の構成は省略されます [:プラグインの 新しい新webpack.DllReferencePlugin({ コンテキスト:__dirnameを、 // マニフェストは、JSONファイルの前に梱包され マニフェスト:必要(」./ DIST /ベンダーmanifest.jsonを' ) }) ] }
パッケージング性能を向上しました。
1. HappyPack
画期的なシングルスレッド、マルチスレッド解像度。
モジュール1:{ ローダーへ:[ { テスト: /\.js$/は、 ザは、以下が挙げられる:【解決( 'SRC' )]、 除外する: node_modules / / 、 // の後ろに以下に対応するコンテンツID 「:?ローダhappypack /ローダID = happybabel ' } ] }、 プラグインは:[ 新しい新しいHappyPackは({ ID: ' happybabel 'は、 ローダーに[ 'CACHEDIRECTORYバベルローダ'?]、 // 4つのスレッドを開く :.ねじ山4 }) ]
私たちは、通常使用し UglifyJS
、我々はそれがシングルスレッド、マルチプロセスの圧縮コードを突破させ、代わりにWebPACKの並列-uglify-プラグインを使用したい場合があり、コードを圧縮します。
幸いなことに、公式バージョン4.xでのWebPACKは、デフォルトでは、私たちは実現に役立っています。私たちは、このプラグインを使用する必要はありません。限り、モードは、それに生産に設定されているよう。
いくつかの小さな最適化のポイント
我々はまた、いくつかの小さな最適化のポイントでパッケージのスピードを加速することができます
resolve.extensions
:ファイル拡張子のリストを示すには、デフォルトの順序は見つけることです['.js', '.json']
、あなたがその順序でファイルを検索しますサフィックスを追加していないファイルをインポートする場合、。私たちは、接尾辞として、リストの長さを短くする必要があり、その後、高周波サフィックス上面が表示されますresolve.alias
:あなたは速いパスを見つけるのWebPACKせ、道の別名を通るパスをマップすることができますmodule.noParse
:あなたはWebPACKのファイルをスキャンしないようにするには、このプロパティを使用することができ、他の依存関係次のファイルことが確実な場合は、この方法は、大きなライブラリーのために有用です
パッケージのボリューム
最適化されたパッケージングボリューム、我々は戦略を考えることができます(UglifyJS上記)圧縮符号、分割ファイルを、マージモジュール、パッケージ化されてくるの必要性減少のファイルを。
分割ファイル - ロードオンデマンド
輸入ES6()で動的な負荷要求を達成するために、WebPACKのこの部分は、別のファイルを分割します
「./a.js'からインポートします。 もし(XXX){ (); } / * ****************替换成********************* * / // 」からインポートA ./a.js'; もし(XXX){ インポート(/ * webpackChunkName: "haha233" * /」./a.js' ) .then(MOD => { MOD(); }) }
マージモジュール - スコープ巻上げ
スコープ巻き上げ関数にマージするパッケージモジュールのうち、できるだけ多くのモジュール間の依存関係を解析します。
ただ、最適化を設定します。concatenateModules
本当です、それは開くことができます。
幸いなことに、それが自動的にWebPACKの4.xの生産モードをオンにします。
削減パッケージは、ファイルに来る - ツリーを振ります
振るツリーには、例えば、コードを削除するために使用されていない私たちを助けることができます。
// test.js エクスポートCONST A = 1つの 輸出CONST B = 2 // index.js 「./test.js'からインポート{A}
幸いなことに、それが自動的にWebPACKの4.xの生産モードをオンにします。