1つ、webpackコアモジュール
Webpack
プロジェクトは巨大ですが、それWebpack
は本質的にイベントの流れのメカニズムです。イベントを介して直列に接続されたさまざまなプラグフローは、最終的にWebpack
プロセス全体のコアを完成させTapable
ます。イベントフローメカニズムの実現はモジュールです。Webpack
のコンパイルCompiler
と作成Bundle
を担当するのCompilation
は、から継承されTapable
ます。Webpack
コアライブラリのTapable
原則EventEmitter
は、イベントを登録および監視することにより、Webpack
関数メソッドのライフサイクルをトリガーすることにより、類似していますが、さまざまなタイプを含め、より強力です。ではWebpack
真ん中、tapable
彼らはオブジェクトを入れてhooks
、我々はそれらのフックを呼び出すので、上Tapable
主成分分析、Tapable
実行プロセスは4つのステップに分けることができます。
tap*
バインディングを登録するためのイベントの使用。バインディングのタイプに応じて、次の3つの方法tap、tapPromise、tapAsync
がありtapPromise、tapAsync
ますHook
。非同期タイプのバインディング方法。call*
タイプに応じてイベントトリガーを使用しますが、トリガーする3つの方法も提供します。call、promise、callAsync;
- 対応するタイプのコードスニペットを生成します(実行されるコードは、実際にはスペル文字列によってスペルアウトされます)。
- 3番目のステップで生成されたコードフラグメントを生成します。
- 要約:これ
Tapable
はWebpack
、達成するために実行Webpack
されているすべてのワークプロセスのコアモジュールですTapable
。Tapable
基本的に、さまざまなタイプのイベントバインディングメカニズムを提供しますHook
。使用するさまざまなプロセスに応じて、さまざまなタイプの特性を選択できます。Tapable
通常のカスタムJavaScript
イベントバインディング(たとえばEventEmitter
)を使用したバインディングイベントのコア実装段階はそれほど違いはありませんが、イベントがトリガーされると、関数の実行が一時的に実行可能なコードスニペットを生成します。この実装でTapable
は、イベントのフローを制御する強力な機能waterfall/parallel
を実現するために、ストリームなどの非同期/並列イベントを制御する機能を実現するシリーズメソッドとしても増加しました。
2.Webpackのコンパイラとコンパイル
Webpack
ワークフロー、Compiler
およびはCompilation
から継承されているTapable
異なる点は、Compiler
各ことWebpack
に対応する構成Compiler
オブジェクトは、レコード全体Webpack
のライフサイクルを、すべての生成された各構築物の構築中にCompilation,Compilation
構築サイクルの生成物です。- 概要:
Webpack
2つのコアクラスCompiler
とCompilation
。Compiler
たびにWebpack
、すべてのライフサイクルの対象とCompilation
されWebpack
、ビルドプロセスは、毎回オブジェクトのライフサイクルCompilation
を通じてCompiler
インスタンスを作成。どちらのクラスにも、それぞれのクラスとは異なる独自のライフサイクルがあります。Hook
対応するHook
イベントを追加することで、各キーデータとオブジェクトのライフサイクルを取得できます。Compilation
非常に重要な課題があるがありStats
、オブジェクトをすることによって得ることができるオブジェクトWebpack
のすべてのパッケージmodule、chunk 和 assets
の分析を通じて、情報をStats
などとして有用な情報オブジェクトの多くを得ることができwebpack-bundle-analyzer
、分析パッケージのプラグインのこのタイプは、分析の結果であるStats
と分析レポートオブジェクトを取得します。
3、Webpackの基本的なプロセス
Webpack
基本的なプロセスは、次の3つの段階に分けることができます。
- 準備フェーズ:主なタスクは
Compiler
、Compilation
オブジェクトを作成することです。 - コンパイルフェーズ:このフェーズは、タスクの
modules
解析と生成を完了するためのものchunks
です。 module
分析:インスタンス、loaders
アプリケーション、依存関係のコレクションを作成する3つの主要なステップが含まれています。chunks
生成することは、主要なステップごとに、chunk
を含める必要性を見つけることですmodules
。- 出力段階:この段階の主なタスクは
chunks
、最終ドキュメントの生成に基づいています。
- 出力段階では、テンプレートの
Hash
更新、テンプレートのレンダリングchunk
、生成されたファイルの3つの主要なステップがあります。特定のコードレベルに洗練されて、それは大まかに次のように分けることができます:
- 初期化パラメーターには、次のものが含まれます。構成ファイルと
shell
読み取りおよび組み合わせパラメーターから、最終パラメーターを取得します。 shell
のパラメータは、構成ファイルのパラメータよりも優れています。- 前のステップで
Compiler
、クラスのインスタンス、登録されているすべてのプラグインのパラメーターを使用して、対応するWebpack
ビルドライフサイクルバインディングに取得しますHook
。 - コンパイルを開始します。コンパイルを開始する
Compiler
ためのクラスrun
メソッドの実装。 compiler.run
メソッド呼び出しcompiler.compile
、中compile
のインスタンスCompilation
クラス。
Compilation
それは物事を構築してパッケージ化することであり、主なものは次のとおりです。
- 入口の検索:
entry
構成に従って、すべてのエントリー文書を検索します。 - モジュールのコンパイル:ファイルの種類と
loader
構成に基づいて、対応するloader
ファイル変換処理を使用して実行されます。 - ファイル
AST
構文ツリーの解析。 - ファイルの依存関係を調べます。
- 依存モジュールを再帰的にコンパイルします。
- 各再帰ファイルの最終的な結果の後、に従って
entry
コード生成ブロックの構成chunk
、
全ての出力chunk
対応するoutput
パス。 shell
のパラメータは、構成ファイルよりも優れています。例:構成ファイルで指定されているのmode
はdevelopment
、shell
であり、着信の--mode production
場合は、最終mode
値production
です。- では
Webpack
ワークフロー、Tapable
それらを介して実行すると、Tapable
すべての種類Hook
(フック)を構成するWebpack
ライフサイクルを。Tapable Hook
ライフサイクルとの関係は次のとおりです。
Hook
:フック、に対応します。Tapable
Hook
- ライフサイクル:
Webpack
実行の流れは、フックは、実際には、一般的に類似のライフサイクルでentryOption
のHook
ライフサイクルでは、entry-option
。 Webpack
2つの重要なモジュールプロセスへの参加は次のとおりCompiler和Compilation
です。
-
概要:
Webpack
パッキングプロセスは、プロパティの準備段階、modules
出力段階、chunks
出力段階、およびbundle
出力段階の後に、それぞれ構成ファイルの読み取りを開始します。各段階では、それぞれが参加する異なる「役割」を持ち、Webpack
パッケージングプロセス全体がCompiler
制御され、それぞれがCompilation
制御されたプロセスでパッケージ化されます。通常モードでは、パッケージ化、および1対1の関係であり、モード、それがあるファイルはそう、複数の包装工程で結果が変更されるため、そして対多の関係で、通過プロセス、あなたがコールバックすべての包装工程を得ることができます。webpack
Compiler
Compilation
watch
Webpack
Compiler
Compiler
Compilation
Hook Compiler
-
Webpack
ワークフローのクラスは次のとおりです。
Tapbale
:Webpack
イベントフローのコアクラス。Compiler
:Webpack
ワークフローの最高レベルのオブジェクト、初期構成はWebpack
、そのようなグローバルフックプロセスを提供しますdone、compilation
。Compilation
:Compiler
オブジェクトのインスタンスが作成され、各パッケージがプロセスフローのコアであり、オブジェクトモジュールの依存関係、リソースの最適化、runtime
コードのレンダリングなどで解決されます。Compilation
一部のオブジェクトでは、次のものが使用されます。Resolver
:モジュール(module)、loader
などのパスを分析して、対応する場所を見つけるのに役立てます。ModuleFactory
:モジュール構成の例を担当し、Resolver
解決はファイルから読み取られたソースコード内のコンポーネントを引き継ぎ、モジュールオブジェクトを作成します。Template
:主にruntime
コードを生成するために、コードは次の依存関係の順序処理に従って解析され、Template
最終的にコードをパックしたものに配置されます。
4、webpackのHMR
HMR
サイクル全体は、起動フェーズとファイルの監視および更新プロセスの2つの部分に分かれています。- 起動段階で
Webpack
、webpack-dev-server
相互作用します。Webpack
そして、webpack-dev-server
主に相互作用するExpress
ミドルウェアwebpack-dev-middleware
を介して、この段階は次のステップに細分できます。
webpack-dev-server
Webpack
パッケージwatch
モードを開始します。このモードでWebpack
は、ファイルの変更を監視します。ファイルが変更されると、ファイルは再パッケージ化され、watch
モードWebpack
パックの結果はディスクをドロップしません(ハードディスクに保存されます)。webpack-dev-server
相互作用、受信初期化オブジェクトを、フックが監視することができ、パッケージング工程;webpack-dev-middleware
Webpack
Webpack-dev-middleware
Webpack
Compiler
Compiler
Webpack
- の場合
devServer.watchContentBase=true
はwebpack-dev-server
、モニター静的ファイルフォルダーを変更し、通知ブラウザーを変更してページを再度更新し、新しいファイルを要求します。 - ブラウザ
webpack-dev-server
を開いた後、ブラウザを使用sockjs
しServer
、WebSocket
長い接続を作成する間、この接続は長く、ブラウザのwebpack-dev-server
通信ブリッジ、それらの間の通信は、hash
今回のWebpack
監視ファイルの変更が発生した場合、ファイル情報(コンパイルされたモジュール値)を渡すことです。、webpack/hot/dev-server
達成するためにHMR
更新するか、ページを更新。
- 次のように注意してください。
webpack-dev-server
contentBase
起動、サーバーのフォルダ上の静的リソースディレクトリとして理解することができserver
、後に、あなたはURLメソッド+コンピュータのファイルパスに特定のドキュメントにアクセスすることができ、使用してファイルWebpack
のパスのうち、パッケージは同じではありません。- 2つの監視ファイルの変更があり
Webpack
ます。モジュール全体の依存関係の変更を監視する最初のステップ、再起動Webpack
コンパイルの変更です。webpack-dev-server
独自の監視contentBase
ファイルの変更の3番目のステップで、ファイルはブラウザにページの変更を更新するように指示します。パッケージ化されていない依存関係のコンテンツがあるHMR
ため、ページは更新されません。contentBase
Webpack
WebSocket
Need server and browserは、このファイルに挿入して通信を作成すること(new WebSocket),webpack-dev-server
により、ブラウザに対応する接続コードを作成しました。chunks
webpack-dev-server/client
WebSocket
- このフェーズの終了を開始し
Webpack
ます。ファイルの変更を監視した後、今度はファイル更新プロセスの監視にWebpack
入り、ファイルの後で依存関係グラフの変更を監視します。
Webpack
ファイルを再コンパイルします。今回はwebpack.config.js
プラグインを追加HotModuleReplacementPlugin
すると、コンパイルされた2つのファイルの違いのリストが生成され(manifest)
ます[hash].hot-update.json
。このmanifest JSON
ファイルには変更ファイルのUpdate
内容が含まれています[id].[hash].hot-update.js
。合格するプロセスを梱包フックリスニングをした後、通知の使用コンパイルした後、長い接続プッシュ値を、webpack-dev-server
webpack-dev-middler
Webpack
Compiler
webpack-dev-server
WebSocket
hash
- コンパイルされた
Hash
値を外部に送信することに加えwebpack-dev-server
て、長い接続を介してブラウザに現在のページコードがinvalid
状態であることを通知し、新しいコードを更新する必要があります。 Hash
後を追うブラウザは、最初にファイルのAjax
要求manifest
ファイルの[hash].hot-update.json
内容を開始します。manifest
取得するためのファイルリストの内容の後、教えてくれるHMR
のRuntime
これらの要求変更JavaScript
今回がします、ファイルRuntime
のインベントリリストに基づいて開始することがJSONP
要求、2は、差分ファイルがコンパイルされ[id].[hash].hot-update.js
たページの中に降りhead
ラベルscript
の実行中に、最終的にはフルを完了プロセスを更新します。
- 概要:
webpack-dev-server
直接開始することもできますがHMR
、実際のコアはwebpack-dev-middleware
です。webpack-dev-server
このミドルウェアに加えて、主な機能は静的サーバーです。