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
在區塊模組最佳化成功完成後呼叫。
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
傳回真值,則會觸發此動作。
modules
records
SyncHook
將區塊資訊儲存到記錄中。如果 shouldRecord
傳回真值,則只會觸發此動作。
chunks
records
SyncHook
在對模組進行雜湊處理之前呼叫。
syncHook
在對模組進行雜湊處理之後呼叫。
SyncHook
在對編譯進行雜湊處理之前呼叫。
SyncHook
在對編譯進行雜湊處理之後呼叫。
SyncHook
將紀錄雜湊的資訊儲存到 records
。這僅會在 shouldRecord
傳回真值時觸發。
records
SyncHook
將 compilation
的資訊儲存到 records
。這僅會在 shouldRecord
傳回真值時觸發。
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
之外,您還可以傳遞 additionalAssets
5.8.0+ 選項,它接受 true
值或接收 assets
作為第一個引數的回呼函式
true
— 針對外掛稍後新增的資源再次執行提供的回呼函式。
在此模式中,回呼函式將會被呼叫多次:一次是針對在指定階段之前新增的資源,以及多次針對外掛稍後新增的資源 (在此或下一個階段)。
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>)
— 針對外掛稍後新增的資源 (在此或下一個階段) 執行指定的回呼函式。回呼函式必須符合所使用的 tap 方法的類型 (例如,當與 tapPromise()
一起使用時,它應該傳回一個 Promise)。
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
— 最佳化現有資源的相容性,例如新增 polyfill 或供應商前綴。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
。