Compilation
モジュールは、Compiler
によって新しいコンパイル(またはビルド)を作成するために使用されます。compilation
インスタンスは、すべてのモジュールとその依存関係(そのほとんどは循環参照です)にアクセスできます。これは、アプリケーションの依存関係グラフ内のすべてのモジュールの文字通りのコンパイルです。コンパイルフェーズでは、モジュールはロード、シール、最適化、チャンク化、ハッシュ化、復元されます。
Compilation
クラスはTapable
を拡張し、以下のライフサイクルフックを提供します。これらはコンパイラーフックと同じ方法でタップできます。
compilation.hooks.someHook.tap(/* ... */);
compiler
と同様に、フックの種類によってはtapAsync
とtapPromise
も使用できる場合があります。
SyncHook
モジュールのビルドが開始される前にトリガーされ、モジュールを変更するために使用できます。
module
compilation.hooks.buildModule.tap(
'SourceMapDevToolModuleOptionsPlugin',
(module) => {
module.useSourceMap = true;
}
);
SyncHook
モジュールの再ビルド前に発生します。
module
SyncHook
モジュールのビルドが失敗したときに実行されます。
module
error
SyncHook
モジュールが正常にビルドされたときに実行されます。
module
AsyncSeriesHook
すべてのモジュールがエラーなしでビルドされたときに呼び出されます。
modules
SyncHook
成功した場合とエラーが発生した場合の両方で、モジュールの再ビルドが完了したときに実行されます。
module
SyncHook
コンパイルが新しいモジュールを受け入れなくなる際に発生します。
SyncHook
コンパイルが新しいモジュールを受け入れ始める際に発生します。
SyncBailHook
依存関係の最適化の開始時に発生します。
modules
SyncHook
依存関係の最適化後に発生します。
modules
SyncHook
afterChunks
フックは、チャンクとモジュールグラフの作成後、それらの最適化前に呼び出されます。このフックは、必要に応じてチャンクグラフを検査、分析、および変更する機会を提供します。
compilation.hooks.afterChunks
フックの使用方法の例をこちらで確認できます。
chunks
SyncHook
最適化フェーズの開始時にトリガーされます。
SyncBailHook
モジュールの最適化フェーズの開始時に呼び出されます。プラグインは、このフックを利用してモジュールの最適化を実行できます。
modules
SyncHook
モジュールの最適化が完了した後に呼び出されます。
modules
SyncBailHook
チャンクの最適化フェーズの開始時に呼び出されます。プラグインは、このフックを利用してチャンクの最適化を実行できます。
chunks
SyncHook
チャンクの最適化が完了した後に発生します。
chunks
AsyncSeriesHook
依存関係ツリーの最適化の前に呼び出されます。プラグインは、このフックを利用して依存関係ツリーの最適化を実行できます。
chunks
modules
SyncHook
依存関係ツリーの最適化が正常に完了した後に呼び出されます。
chunks
modules
SyncBailHook
ツリーの最適化後、チャンクモジュールの最適化の開始時に呼び出されます。プラグインは、このフックを利用してチャンクモジュールの最適化を実行できます。
chunks
modules
SyncHook
chunkmodulesの最適化が正常に完了した後に呼び出されます。
chunks
modules
SyncBailHook
レコードを保存するかどうかを決定するために呼び出されます。!== false
を返すものは、他のすべての「レコード」フックの実行を妨げます(record
、recordModules
、recordChunks
、およびrecordHash
)。
SyncHook
レコードからモジュール情報を復元します。
modules
records
SyncHook
各モジュールにid
を割り当てる前に実行されます。
modules
SyncHook
各モジュールにid
を割り当てるために呼び出されます。
modules
SyncHook
モジュールのid
最適化の開始時に呼び出されます。
modules
SyncHook
モジュールのid
最適化フェーズが完了したときに呼び出されます。
modules
SyncHook
レコードからチャンク情報を復元します。
chunks
records
SyncHook
各チャンクにid
を割り当てる前に実行されます。
chunks
SyncHook
各チャンクにid
を割り当てるために呼び出されます。
chunks
SyncHook
チャンクのid
最適化フェーズの開始時に呼び出されます。
chunks
SyncHook
チャンクのid
最適化が完了した後にトリガーされます。
chunks
SyncHook
shouldRecord
がtruthy値を返す場合に、レコードにモジュール情報を保存します。
modules
records
SyncHook
shouldRecord
がtruthy値を返す場合にのみ、レコードにチャンク情報を保存します。
chunks
records
SyncHook
モジュールのハッシュ化の前に呼び出されます。
syncHook
モジュールのハッシュ化後に呼び出されます。
SyncHook
コンパイルのハッシュ化の前に呼び出されます。
SyncHook
コンパイルのハッシュ化後に呼び出されます。
SyncHook
shouldRecord
がtruthy値を返す場合にのみ、レコードハッシュに関する情報をrecords
に保存します。
records
SyncHook
shouldRecord
がtruthy値を返す場合にのみ、compilation
に関する情報をrecords
に保存します。
compilation
records
SyncHook
モジュールアセットの作成前に実行されます。
SyncHook
チャンクに追加のアセットを作成します。
chunks
SyncBailHook
チャンクアセットを生成するかどうかを決定するために呼び出されます。!== false
を返すものは、チャンクアセットの生成を許可します。
SyncHook
チャンクアセットの作成前に実行されます。
AsyncSeriesHook
コンパイルに追加のアセットを作成します。このフックは、たとえば画像をダウンロードするために使用できます。
compilation.hooks.additionalAssets.tapAsync('MyPlugin', (callback) => {
download('https://img.shields.io/npm/v/webpack.svg', function (resp) {
if (resp.status === 200) {
compilation.assets['webpack-version.svg'] = toAsset(resp);
callback();
} else {
callback(
new Error('[webpack-example-plugin] Unable to download the image')
);
}
});
});
AsyncSeriesHook
チャンクアセットを最適化します。アセットはcompilation.assets
に保存されます。Chunk
には、チャンクによって作成されたすべてのファイルを指すプロパティfiles
があります。追加のチャンクアセットは、compilation.additionalChunkAssets
に保存されます。
chunks
各チャンクにバナーを追加する例を次に示します。
compilation.hooks.optimizeChunkAssets.tapAsync(
'MyPlugin',
(chunks, callback) => {
chunks.forEach((chunk) => {
chunk.files.forEach((file) => {
compilation.assets[file] = new ConcatSource(
'/**Sweet Banner**/',
'\n',
compilation.assets[file]
);
});
});
callback();
}
);
SyncHook
チャンクアセットは最適化されました。
chunks
@boopathi の例として、各チャンクに何が含まれているかを正確に出力するプラグインを示します。
compilation.hooks.afterOptimizeChunkAssets.tap('MyPlugin', (chunks) => {
chunks.forEach((chunk) => {
console.log({
id: chunk.id,
name: chunk.name,
includes: chunk.getModules().map((module) => module.request),
});
});
});
AsyncSeriesHook
compilation.assets
に格納されているすべてのアセットを最適化します。
assets
SyncHook
アセットは最適化されました。
assets
AsyncSeriesHook
アセット処理。
フックパラメータ
name: string
— プラグインの名前stage: Stage
— 介入するステージ (下記の サポートされているステージのリスト を参照)additionalAssets?: true | (assets, [callback]) => (void | Promise<void>)
— 追加のアセットに関するコールバック (下記参照)コールバックパラメータ
assets: { [pathname: string]: Source }
— キーがアセットのパス名、値が Source
で表されるアセットのデータであるプレーンオブジェクト。例
compilation.hooks.processAssets.tap(
{
name: 'MyPlugin',
stage: Compilation.PROCESS_ASSETS_STAGE_ADDITIONS, // see below for more stages
},
(assets) => {
console.log('List of assets and their sizes:');
Object.entries(assets).forEach(([pathname, source]) => {
console.log(`— ${pathname}: ${source.size()} bytes`);
});
}
);
name
と stage
に加えて、true
またはassets
を最初の引数として受け取るコールバック関数のいずれかの値を受け入れる additionalAssets
5.8.0+ オプションを渡すことができます。
true
— 後でプラグインによって追加されたアセットに対して、提供されたコールバックを再度実行します。
このモードでは、コールバックは複数回呼び出されます。指定されたステージの前に追加されたアセットに対して1回、その後でプラグインによって追加されたアセットに対して追加で複数回呼び出されます(このステージまたは次のステージで)。
compilation.hooks.processAssets.tap(
{
name: 'MyPlugin',
stage: Compilation.PROCESS_ASSETS_STAGE_DEV_TOOLING,
additionalAssets: true,
},
(assets) => {
// this function will be called multiple times with each bulk of assets
}
);
(assets, [callback]) => (void | Promise<void>)
— 後でプラグインによって追加されたアセットに対して、指定されたコールバックを実行します(このステージまたは次のステージで)。コールバックは、使用されたタップメソッドのタイプを尊重する必要があります(例:tapPromise()
で使用する場合、プロミスを返す必要があります)。
compilation.hooks.processAssets.tap(
{
name: 'MyPlugin',
stage: Compilation.PROCESS_ASSETS_STAGE_DEV_TOOLING,
additionalAssets: (assets) => {
// this function potentially could be called multiple times for assets added on later stages
},
},
(assets) => {
// this function will be called once with assets added by plugins on prior stages
}
);
サポートされているステージのリスト(処理順)を示します。
PROCESS_ASSETS_STAGE_ADDITIONAL
— コンパイルに追加のアセットを追加します。PROCESS_ASSETS_STAGE_PRE_PROCESS
— アセットの基本的な前処理。PROCESS_ASSETS_STAGE_DERIVED
— 既存のアセットから新しいアセットを派生します。PROCESS_ASSETS_STAGE_ADDITIONS
— 既存のアセットに追加セクションを追加します(例:バナーまたは初期化コード)。PROCESS_ASSETS_STAGE_OPTIMIZE
— 一般的な方法で既存のアセットを最適化します。PROCESS_ASSETS_STAGE_OPTIMIZE_COUNT
— 既存のアセットの数を最適化します(例:マージすることによって)。PROCESS_ASSETS_STAGE_OPTIMIZE_COMPATIBILITY
— 既存のアセットの互換性を最適化します(例:ポリフィルまたはベンダープレフィックスを追加する)。PROCESS_ASSETS_STAGE_OPTIMIZE_SIZE
— 既存のアセットのサイズを最適化します(例:空白を最小化または省略する)。PROCESS_ASSETS_STAGE_DEV_TOOLING
— アセットに開発ツールを追加します(例:ソースマップを抽出する)。PROCESS_ASSETS_STAGE_OPTIMIZE_INLINE
5.8.0+ — 既存のアセットの数を最適化します(例:アセットを他のアセットにインライン化する)。PROCESS_ASSETS_STAGE_SUMMARIZE
— 既存のアセットのリストを要約します。PROCESS_ASSETS_STAGE_OPTIMIZE_HASH
— アセットのハッシュを最適化します(例:アセットコンテンツの実際のハッシュを生成する)。PROCESS_ASSETS_STAGE_OPTIMIZE_TRANSFER
— 既存のアセットの転送を最適化します(例:圧縮された(gzip)ファイルを別のアセットとして準備する)。PROCESS_ASSETS_STAGE_ANALYSE
— 既存のアセットを分析します。PROCESS_ASSETS_STAGE_REPORT
— レポート目的のアセットを作成します。このフックでは、「アセット情報」メタデータは自動的に提供されません。必要に応じて、コンパイルインスタンスと提供されたアセットパス名を使用して、このメタデータを手動で解決する必要があります。これはWebpackの今後のバージョンで改善されます。
例
compilation.hooks.processAssets.tap(
{
/** … */
},
(assets) => {
Object.entries(assets).forEach(([pathname, source]) => {
const assetInfo = compilation.assetsInfo.get(pathname);
// @todo: do something with "pathname", "source" and "assetInfo"
});
}
);
SyncHook
processAssets
フックがエラーなしで終了した後に呼び出されます。
SyncBailHook
コンパイルで他のファイルを含めるために封印を解除する必要があるかどうかを判断するために呼び出されます。
AsyncSeriesHook
needAdditionalSeal
の直後に実行されます。
SyncHook
各チャンクのハッシュを発行するためにトリガーされます。
chunk
chunkHash
SyncHook
モジュールのアセットがコンパイルに追加されたときに呼び出されます。
module
filename
SyncHook
チャンクのアセットがコンパイルに追加されたときにトリガーされます。
chunk
filename
SyncWaterfallHook
アセットのパスを決定するために呼び出されます。
path
options
SyncBailHook
アセットが発行された後、さらに処理する必要があるかどうかを判断するために呼び出されます。
SyncHook
子コンパイラの設定後に実行されます。
childCompiler
compilerName
compilerIndex
Webpack v5以降、normalModuleLoader
フックは削除されました。ローダーにアクセスするには、代わりにNormalModule.getCompilationHooks(compilation).loader
を使用してください。