Compilation Hooks
Compilation 모ëì Compilerìì ì ì»´íì¼ ëë ë¹ë를 ë§ëë ë° ì¬ì©ë©ëë¤.
compilation ê°ì²´ë 모ë 모ëê³¼ í´ë¹ 모ëì ëíëìì ì ê·¼í ì ììµëë¤(ëë¶ë¶ ìí 참조).
ëí ì í리ì¼ì´ì
ì ëíëì ê·¸ëíì ìë 모ë 모ëì 리í°ë´ ì»´íì¼ì
ëë¤.
ì»´íì¼ ë¨ê³ ëì 모ëì
ë¡ë, ë´ì¸, ìµì í, ì²í¬, í´ì ë° ë³µìë©ëë¤.
Compilation í´ëì¤ë Tapableì íì¥íê³ ë¤ìê³¼ ê°ì ìëª
주기 í
ì ì ê³µí©ëë¤.
ì»´íì¼ë¬ í
ê³¼ ê°ì ë°©ìì¼ë¡ íí ì ììµëë¤.
compilation.hooks.someHook.tap(/* ... */);compilerì ë§ì°¬ê°ì§ë¡ tapAsync ë° tapPromiseë í
ì íì ë°ë¼
ì¬ì©í ì ììµëë¤.
buildModule
SyncHook
모ë ë¹ëê° ììë기 ì ì í¸ë¦¬ê±°ëë©° 모ëì ìì íë ë° ì¬ì©í ì ììµëë¤.
- ì½ë°± íë¼ë¯¸í°:
module
compilation.hooks.buildModule.tap(
"SourceMapDevToolModuleOptionsPlugin",
(module) => {
module.useSourceMap = true;
},
);rebuildModule
SyncHook
모ëì ë¤ì ë¹ëí기 ì ì ììë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
module
failedModule
SyncHook
모ë ë¹ëê° ì¤í¨íë©´ ì¤íí©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
moduleerror
succeedModule
SyncHook
모ëì´ ì±ê³µì ì¼ë¡ ë¹ëëìì ë ì¤íë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
module
finishModules
AsyncSeriesHook
모ë 모ëì´ ìë¬ìì´ ë¹ëëìì ë í¸ì¶ë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
modules
finishRebuildingModule
SyncHook
ì±ê³µíê±°ë ìë¬ê° ìë ê²½ì° ëª¨ëì´ ë¤ì ë¹ë ë ë ì¤íë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
module
seal
SyncHook
ì»´íì¼ì´ ìë¡ì´ 모ëì ë°ë ê²ì´ ì¤ì§ëë©´ ììë©ëë¤.
unseal
SyncHook
ì»´íì¼ì´ ìë¡ì´ 모ëì ë°ê¸° ììí ë ììë©ëë¤.
optimizeDependencies
SyncBailHook
ëíëì ìµì íê° ììí ë ììë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
modules
afterOptimizeDependencies
SyncHook
ëíëì ìµì í í ììë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
modules
afterChunks
SyncHook
'afterChunks' í ì ì²í¬ ë° ëª¨ë ê·¸ëí ìì± í ìµì í ì ì í¸ì¶ë©ëë¤. ì´ í ì íìí ê²½ì° ì²í¬ ê·¸ëí를 ê²ì¬, ë¶ì ë° ìì í ì ìë 기í를 ì ê³µí©ëë¤.
ë¤ìì compilation.hooks.afterChunks í
ì íì©íë ë°©ë²ì ëí ììì
ëë¤.
- ì½ë°± íë¼ë¯¸í°:
chunks
optimize
SyncHook
ìµì í ë¨ê³ê° ììë ë í¸ë¦¬ê±°ë©ëë¤.
optimizeModules
SyncBailHook
모ë ìµì í ë¨ê³ê° ììë ë í¸ì¶ë©ëë¤. íë¬ê·¸ì¸ì ì´ í ì íì©íì¬ ëª¨ëì ëí ìµì í를 ìíí ì ììµëë¤.
- ì½ë°± íë¼ë¯¸í°:
modules
afterOptimizeModules
SyncHook
모ë ìµì íê° ìë£ë í í¸ì¶ë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
modules
optimizeChunks
SyncBailHook
ì²í¬ ìµì í ë¨ê³ê° ììë ë í¸ì¶ë©ëë¤. íë¬ê·¸ì¸ì ì´ í ì íì©íì¬ ì²í¬ì ëí ìµì í를 ìíí ì ììµëë¤.
- ì½ë°± íë¼ë¯¸í°:
chunks
afterOptimizeChunks
SyncHook
ì²í¬ ìµì íê° ìë£ë í ììë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
chunks
optimizeTree
AsyncSeriesHook
ëíëì í¸ë¦¬ë¥¼ ìµì íí기 ì ì í¸ì¶ë©ëë¤. íë¬ê·¸ì¸ì ì´ í ì íì©íì¬ ëíëì í¸ë¦¬ ìµì í를 ìíí ì ììµëë¤.
- ì½ë°± íë¼ë¯¸í°:
chunksmodules
afterOptimizeTree
SyncHook
ëíëì í¸ë¦¬ ìµì íê° ì±ê³µì ì¼ë¡ ìë£ë íì í¸ì¶ë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
chunksmodules
optimizeChunkModules
SyncBailHook
ì²í¬ 모ë ìµì í ììì í¸ë¦¬ ìµì í íì í¸ì¶ë©ëë¤. íë¬ê·¸ì¸ì ì´ í ì íì©íì¬ ì²í¬ 모ëì ìµì í를 ìíí ì ììµëë¤.
- ì½ë°± íë¼ë¯¸í°:
chunksmodules
afterOptimizeChunkModules
SyncHook
ì²í¬ 모ë ìµì íê° ì±ê³µì ì¼ë¡ ìë£ë íì í¸ì¶ë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
chunksmodules
shouldRecord
SyncBailHook
ë ì½ë ì ì¥ ì¬ë¶ë¥¼ ê²°ì í기 ìí´ í¸ì¶ë©ëë¤. !== false를 ë°ííë©´ ë¤ë¥¸ 모ë "record" í
ì´ ì¤íëì§ ììµëë¤(record, recordModules, recordChunks ê·¸ë¦¬ê³ recordHash).
reviveModules
SyncHook
ë ì½ëìì 모ë ì 보를 ë³µìí©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
modulesrecords
beforeModuleIds
SyncHook
ê° ëª¨ëì id를 í ë¹í기 ì ì ì¤íë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
modules
moduleIds
SyncHook
ê° ëª¨ëì id를 í ë¹í기 ìí´ í¸ì¶ë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
modules
optimizeModuleIds
SyncHook
모ë id ìµì í ììì í¸ì¶ë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
modules
afterOptimizeModuleIds
SyncHook
모ë id ìµì í ë¨ê³ê° ìë£ëë©´ í¸ì¶ë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
modules
reviveChunks
SyncHook
ë ì½ëìì ì²í¬ ì 보를 ë³µìí©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
chunksrecords
beforeChunkIds
SyncHook
ê° ì²í¬ì id를 í ë¹í기 ì ì ì¤íë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
chunks
chunkIds
SyncHook
ê° ì²í¬ì id를 í ë¹í기 ìí´ í¸ì¶ë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
chunks
optimizeChunkIds
SyncHook
ì²í¬ id ìµì í ë¨ê³ ììì í¸ì¶ë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
chunks
afterOptimizeChunkIds
SyncHook
ì²í¬ id ìµì íê° ìë£ë íì í¸ë¦¬ê±°ë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
chunks
recordModules
SyncHook
ë ì½ëì 모ë ì 보를 ì ì¥í©ëë¤. ì´ê²ì shouldRecordê° ì°¸ê³¼ ê°ì ê°ì ë°ííë ê²½ì° í¸ë¦¬ê±°ë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
modulesrecords
recordChunks
SyncHook
ì²í¬ ì 보를 ë ì½ëì ì ì¥í©ëë¤. ì´ë shouldRecordê° ì°¸ê³¼ ê°ì ê°ì ë°ííë ê²½ì°ìë§ í¸ë¦¬ê±°ë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
chunksrecords
beforeModuleHash
SyncHook
모ëì´ í´ìë기 ì ì í¸ì¶ë©ëë¤.
afterModuleHash
syncHook
모ëì´ í´ì ë íì í¸ì¶ë©ëë¤.
beforeHash
SyncHook
ì»´íì¼ì´ í´ìë기 ì ì í¸ì¶ë©ëë¤.
afterHash
SyncHook
ì»´íì¼ì´ í´ìë기 ì ì í¸ì¶ë©ëë¤.
recordHash
SyncHook
ë ì½ë í´ìì ëí ì 보를 recordsì ì ì¥í©ëë¤. ì´ë shouldRecordê° ì°¸ê³¼ ê°ì ê°ì ë°ííë ê²½ì°ìë§ í¸ë¦¬ê±°ë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
records
record
SyncHook
compilationì ëí ì 보를 recordsì ì ì¥í©ëë¤. ì´ë shouldRecordê° ì°¸ê³¼ ê°ì ê°ì ë°ííë ê²½ì°ìë§ í¸ë¦¬ê±°ë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
compilationrecords
beforeModuleAssets
SyncHook
모ë ì ì ì´ ìì±ë기 ì ì ì¤íë©ëë¤.
additionalChunkAssets
SyncHook
ì²í¬ì ëí ì¶ê° ì ì ì ë§ëëë¤.
- ì½ë°± íë¼ë¯¸í°:
chunks
shouldGenerateChunkAssets
SyncBailHook
ì²í¬ ì ì
ì ë§ë¤ì§ ê²°ì í기 ìí´ í¸ì¶ë©ëë¤. !== false를 ë°ííë©´ ì²í¬ ì ì
ì ìì±í©ëë¤.
beforeChunkAssets
SyncHook
ì²í¬ ì ì ì ë§ë¤ê¸° ì ì ì¤íë©ëë¤.
additionalAssets
AsyncSeriesHook
ì»´íì¼ì ìí ì¶ê° ì ì ì ë§ëëë¤. ì´ í ì ì´ë¯¸ì§ë¥¼ ë¤ì´ë¡ëíë ë° ì¬ì©í ì ììµëë¤. ì를 ë¤ë©´ ë¤ìê³¼ ê°ìµëë¤.
compilation.hooks.additionalAssets.tapAsync("MyPlugin", (callback) => {
download("https://img.shields.io/npm/v/webpack.svg", (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"),
);
}
});
});optimizeChunkAssets
AsyncSeriesHook
ì²í¬ ì ì
ì ìµì ííì¸ì. ì ì
ì compilation.assetsì ì ì¥ë©ëë¤.
Chunkìë ì²í¬ë¡ ìì±ë 모ë íì¼ì ê°ë¦¬í¤ë files íë¡í¼í°ê° ììµëë¤.
ì¶ê° ì²í¬ ì ì
ì compilation.additionalChunkAssetsì ì ì¥ë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
chunks
ë¤ìì ë¨ìí ê° ì²í¬ì ë°°ë를 ì¶ê°íë ììì ëë¤.
compilation.hooks.optimizeChunkAssets.tapAsync(
"MyPlugin",
(chunks, callback) => {
for (const chunk of chunks) {
for (const file of chunk.files) {
compilation.assets[file] = new ConcatSource(
"/**Sweet Banner**/",
"\n",
compilation.assets[file],
);
}
}
callback();
},
);afterOptimizeChunkAssets
SyncHook
ì²í¬ ì ì ì´ ìµì íë íì í¸ì¶ë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
chunks
ë¤ìì ê° ì²í¬ì ë¤ì´ê° ë´ì©ì ì íí ì¶ë ¥íë @boopathiì íë¬ê·¸ì¸ ììì ëë¤.
compilation.hooks.afterOptimizeChunkAssets.tap("MyPlugin", (chunks) => {
for (const chunk of chunks) {
console.log({
id: chunk.id,
name: chunk.name,
includes: chunk.getModules().map((module) => module.request),
});
}
});optimizeAssets
AsyncSeriesHook
compilation.assetsì ì ì¥ë 모ë ì ì
ì ìµì íí©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
assets
afterOptimizeAssets
SyncHook
ì ì ì´ ìµì íë íì í¸ì¶ë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
assets
processAssets
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, // ë ë§ì ë¨ê³ë ìë를 ì°¸ê³ íì¸ì.
},
(assets) => {
console.log("List of assets and their sizes:");
for (const [pathname, source] of Object.entries(assets)) {
console.log(`â ${pathname}: ${source.size()} bytes`);
}
},
);Additional assets
name ë° stage ì¸ìë true ê°ì íì©íë additionalAssets 5.8.0+ ìµì
ëë assetsì 첫 ë²ì§¸ ì¸ìë¡ ë°ë ì½ë°± í¨ì를 ì ë¬í ì ììµëë¤.
-
trueâ ëì¤ì íë¬ê·¸ì¸ì ìí´ ì¶ê°ë ì ì ì ëí´ ì ê³µë ì½ë°±ì ë¤ì ì¤ííì¸ì.ì´ ëª¨ëìì ì½ë°±ì ì§ì ë ë¨ê³ ì´ì ì ì¶ê°ë ì ì ì ëí´ í ë², ëì¤ì íë¬ê·¸ì¸ì ìí´ ì¶ê°ë ì ì ì ëí´ ì´ ë¨ê³ ëë ë¤ì ë¨ê³ì ì¶ê°ë¡ ì¬ë¬ ë² í¸ì¶ë©ëë¤.
compilation.hooks.processAssets.tap( { name: "MyPlugin", stage: Compilation.PROCESS_ASSETS_STAGE_DEV_TOOLING, additionalAssets: true, }, (assets) => { // ì´ í¨ìë ê°ê°ì ìì ì ëí´ ì¬ë¬ ë² í¸ì¶ë©ëë¤. }, ); -
(assets, [callback]) => (void | Promise<void>)â ëì¤ì íë¬ê·¸ì¸ìì ì¶ê°í ì ì ì ëí´ ì´ ë¨ê³ ëë ë¤ì ë¨ê³ìì ì§ì ë ì½ë°±ì ì¤íí©ëë¤. ì½ë°±ì ì¬ì© ë í ë°©ë²ì ì íì ì¡´ì¤í´ì¼í©ëë¤. ì를 ë¤ë©´,tapPromise ()ì í¨ê» ì¬ì©íë©´ íë¡ë¯¸ì¤ë¥¼ ë°íí´ì¼í©ëë¤.compilation.hooks.processAssets.tap( { name: "MyPlugin", stage: Compilation.PROCESS_ASSETS_STAGE_DEV_TOOLING, additionalAssets: (assets) => { // ì´ í¨ìë ì´í ë¨ê³ìì ì¶ê°ë ì ì ì ëí´ ì¬ë¬ë² í¸ì¶ë ê°ë¥ì±ì´ ììµëë¤. }, }, (assets) => { // ì´ í¨ìë ì´ì ë¨ê³ìì íë¬ê·¸ì¸ì ìí´ ì¶ê°ë ì ì ì ëí´ í ë² í¸ì¶ë©ëë¤. }, );
List of asset processing 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â 기존 ì ì ì í¸íì± ìµì í(ì. í´ë¦¬í ëë vendor ì ëì¬ ì¶ê°).PROCESS_ASSETS_STAGE_OPTIMIZE_SIZEâ 기존 ì ì ì í¬ê¸° ìµì í(ì. 공백ì ìµìííê±°ë ìëµ).PROCESS_ASSETS_STAGE_DEV_TOOLINGâ ì ì ì ê°ë° ë구 ì¶ê°(ì. ìì¤ë§µ ì¶ì¶)PROCESS_ASSETS_STAGE_OPTIMIZE_INLINE5.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â 리í¬í 목ì ì¼ë¡ ì ì ì ìì±í©ëë¤.
Assets info
í ì "asset info" ë©í ë°ì´í°ê° ìëì¼ë¡ ì ê³µëì§ ììµëë¤. íìí ê²½ì° ì»´íì¼ ì¸ì¤í´ì¤ì ì ê³µë ì ì ê²½ë¡ ì´ë¦ì ì¬ì©íì¬ ì´ ë©í ë°ì´í°ë¥¼ ìëì¼ë¡ í´ê²°í´ì¼ í©ëë¤. ì´ê²ì webpackì 차기 ë²ì ìì ê°ì ë ê²ì ëë¤.
Example:
compilation.hooks.processAssets.tap(
{
/** ⦠*/
},
(assets) => {
for (const [pathname, source] of Object.entries(assets)) {
const assetInfo = compilation.assetsInfo.get(pathname);
// @todo: "pathname", "source" ë° "assetInfo"를 ì¬ì©íì¬ ìì
í´ì¤ëë¤.
}
},
);afterProcessAssets
SyncHook
processAssets í
ì´ ìë¬ìì´ ìë£ë íì í¸ì¶ë©ëë¤.
needAdditionalSeal
SyncBailHook
ë¤ë¥¸ íì¼ì í¬í¨í기 ìí´ ì»´íì¼ì ë´ì¸ í´ì í´ì¼ íëì§ íì¸í기 ìí´ í¸ì¶ë©ëë¤.
afterSeal
AsyncSeriesHook
needAdditionalSeal ë°ë¡ ë¤ì ì¤íë©ëë¤.
chunkHash
SyncHook
ê° ì²í¬ì ëí í´ì를 ë°©ì¶íëë¡ í¸ë¦¬ê±°ë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
chunkchunkHash
moduleAsset
SyncHook
모ëì ì ì ì´ ì»´íì¼ì ì¶ê°ë ë í¸ì¶ë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
modulefilename
chunkAsset
SyncHook
ì²í¬ì ì ì ì´ ì»´íì¼ì ì¶ê°ë ë í¸ë¦¬ê±°ë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
chunkfilename
assetPath
SyncWaterfallHook
ì ì ì ê²½ë¡ë¥¼ ê²°ì í기 ìí´ í¸ì¶ë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
pathoptions
needAdditionalPass
SyncBailHook
ì ì ì´ ë°©ì¶ë í ì¶ê°ë¡ ì²ë¦¬ëì´ì¼ íëì§ ì¬ë¶ë¥¼ íë³í기 ìí´ í¸ì¶ë©ëë¤.
childCompiler
SyncHook
ìì ì»´íì¼ë¬ë¥¼ ì¤ì í í ì¤íë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
childCompilercompilerNamecompilerIndex
normalModuleLoader
webpack v5ë¶í° normalModuleLoader í
ì´ ì ê±°ëì기 ë문ì, ì´ì ë¡ëì ì¡ì¸ì¤íë ¤ë©´ NormalModule.getCompilationHooks(compilation).loader를 ì¬ì©íì¸ì.
statsPreset
HookMap
ì´ HookMapì ì¬ì ì¤ì ì´ ì¬ì©ë ë í¸ë¦¬ê±°ëë ìì 목ë¡ê³¼ ê°ìµëë¤. ìµì ê°ì²´ë¥¼ ì¬ì©í©ëë¤. íë¬ê·¸ì¸ì´ ì¬ì ì¤ì ì ê´ë¦¬í ëìë 기존 ì¤ì ì ë°ê¾¸ì§ ìê³ ì´ ê°ì²´ì ì¤ì ì ì ì¤íê² ë³ê²½í´ì¼ í©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
optionscontext
íë¬ê·¸ì¸ ììë ë¤ìê³¼ ê°ìµëë¤.
compilation.hooks.statsPreset.for("my-preset").tap("MyPlugin", (options) => {
if (options.all === undefined) options.all = true;
});ì´ íë¬ê·¸ì¸ì ì¬ì ì¤ì 'my-preset'ì ëí´ all ìµì
ì´ ì ìëì§ ìì ê²½ì° ê¸°ë³¸ê°ì´ trueë¡ ì¤ì ëëë¡ í©ëë¤.
statsNormalize
SyncHook
ì´ í ì ìµì ê°ì²´ë¥¼ íì íìì ì½ê² ì¬ì©í ì ìë ì¼ê´ë íìì¼ë¡ ë³ííë ë° ì¬ì©ë©ëë¤. ëí ëë½ë ìµì ì´ ê¸°ë³¸ê°ì¼ë¡ ì¤ì ëëë¡ ë³´ì¥í©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
optionscontext
íë¬ê·¸ì¸ ììë ë¤ìê³¼ ê°ìµëë¤.
compilation.hooks.statsNormalize.tap("MyPlugin", (options) => {
if (options.myOption === undefined) options.myOption = [];
if (!Array.isArray(options.myOption)) options.myOptions = [options.myOptions];
});ì´ íë¬ê·¸ì¸ììë myOptionì´ ìì¼ë©´ ë¹ ë°°ì´ë¡ ì¤ì í©ëë¤. ëí myOptionì´ ìë ë¨ì¼ ê°ì¼ë¡ ì ìë ê²½ì°ìë íì ë°°ì´ìì ë³´ì¥í©ëë¤.
statsFactory
ì´ í
ì í¹ì ìµì
ìì StatsFactory í´ëì¤ì ëí ì¡ì¸ì¤ë¥¼ ì ê³µí©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
statsFactoryoptions
StatsFactory.hooks.extract
HookMap
- ì½ë°± íë¼ë¯¸í°:
objectdatacontext
dataìë í´ëì¤ê° í¬í¨ëì´ ììµëë¤. objectë ìì±ì ì¶ê°í´ì¼ íë ê°ì²´ì
ëë¤. contextë ê²½ë¡ì í´ëì¤ì ê°ì ìí©ë³ ì 보를 ì ê³µí©ëë¤.
Example:
compilation.hooks.statsFactory.tap("MyPlugin", (statsFactory, options) => {
statsFactory.hooks.extract
.for("compilation")
.tap("MyPlugin", (object, compilation) => {
object.customProperty = MyPlugin.getCustomValue(compilation);
});
});StatsFactory.hooks.result
HookMap
ê° ë 벨ì ê²°ê³¼ì í¨ê» í¸ì¶ë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
resultcontext
statsPrinter
ì´ í
ì í¹ì ìµì
ìì StatsPrinter í´ëì¤ì ëí ì¡ì¸ì¤ë¥¼ ì ê³µí©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
statsPrinteroptions
StatsPrinter.hooks.print
HookMap
ì´ í ì íí¸ë¥¼ ì¶ë ¥í´ì¼ í ë í¸ì¶ë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
objectcontext
StatsPrinter.hooks.result
HookMap
ì´ í ì íí¸ì ê²°ê³¼ 문ìì´ì ëí´ í¸ì¶ë©ëë¤.
- ì½ë°± íë¼ë¯¸í°:
resultcontext
CssModulesPlugin.getCompilationHooks(compilation)
experiments.cssê° íì±íëë©´ ë´ë¶ CssModulesPluginì plugin ìì±ì를 ìí´ compilationë³ hook ì§í©ì ë
¸ì¶í©ëë¤. ì´ hookë¤ì ì ì ë©ìë getCompilationHooks(compilation)ì íµí´ ì ê·¼í ì ììµëë¤.
const webpack = require("webpack");
class MyCssPlugin {
apply(compiler) {
compiler.hooks.thisCompilation.tap("MyCssPlugin", (compilation) => {
const hooks =
webpack.css.CssModulesPlugin.getCompilationHooks(compilation);
// ì¬ê¸°ìì hookì tap í©ëë¤.
});
}
}orderModules
5.107.0+SyncBailHook<[Chunk, Module[], Compilation], Module[] | undefined>
ì²í¬ì moduleì´ ì ì²´ module ì´ë¦ 기ì¤ì¼ë¡ 미리 ì ë ¬ë ìíìì, ê° CSS source type(CSS imports ë° CSS modules)ë§ë¤ í ë²ì© í¸ì¶ë©ëë¤. tapì webpackì 기본 import-order topological sort를 ë®ì´ì¸ ì ë ¬ë Module[]를 ë°íí ì ìê³ , 기본 ìì를 ì ì§íë ¤ë©´ undefined를 ë°ííë©´ ë©ëë¤.
ì´ hookì webpackì topological sortê° import ì¬êµ¬ì±ë§ì¼ë¡ í´ê²°í ì ìë Conflicting order between css ... ê²½ê³ ë¥¼ ë°ììí¬ ë ê¶ì¥ëë escape hatchì
ëë¤. 미리 ì ë ¬ë ë°°ì´(ëë ììì deterministic ìì)ì ë°ííë©´ ì í리ì¼ì´ì
ì½ë를 ë³ê²½íì§ ìê³ ë buildê° ìì ì ì¸ ìì를 ì íí ì ììµëë¤.
- ì½ë°± íë¼ë¯¸í°:
chunkmodulescompilation
const webpack = require("webpack");
class CssOrderByPathPlugin {
apply(compiler) {
compiler.hooks.thisCompilation.tap(
"CssOrderByPathPlugin",
(compilation) => {
const hooks =
webpack.css.CssModulesPlugin.getCompilationHooks(compilation);
// moduleì ì ì²´ module ì´ë¦ 기ì¤ì¼ë¡ 미리 ì ë ¬ë ìíë¡ ì ë¬ë©ëë¤.
// ê·¸ëë¡ ë°ííë©´ rebuild ê°ì deterministicí íì¼ ê²½ë¡ ìì를
// ì ì§íê³ conflicting-order ê²½ê³ ë¥¼ í¼í ì ììµëë¤.
hooks.orderModules.tap(
"CssOrderByPathPlugin",
(_chunk, modules) => modules,
);
},
);
}
}ì´ hookì SyncBailHookì´ë¯ë¡, undefinedê° ìë ê°ì ì²ì ë°íí tapì´ ì°ì í©ëë¤. ê·¸ ì´íì tapì í´ë¹ í¸ì¶ì ëí´ ì¤íëì§ ììµëë¤.



