Compilation 모ëì Compilerìì ì ì»´íì¼ ëë ë¹ë를 ë§ëë ë° ì¬ì©ë©ëë¤.
compilation ê°ì²´ë 모ë 모ëê³¼ í´ë¹ 모ëì ëíëìì ì ê·¼í ì ììµëë¤(ëë¶ë¶ ìí 참조).
ëí ì í리ì¼ì´ì
ì ëíëì ê·¸ëíì ìë 모ë 모ëì 리í°ë´ ì»´íì¼ì
ëë¤.
ì»´íì¼ ë¨ê³ ëì 모ëì
ë¡ë, ë´ì¸, ìµì í, ì²í¬, í´ì ë° ë³µìë©ëë¤.
Compilation í´ëì¤ë Tapableì íì¥íê³ ë¤ìê³¼ ê°ì ìëª
주기 í
ì ì ê³µí©ëë¤.
ì»´íì¼ë¬ í
ê³¼ ê°ì ë°©ìì¼ë¡ íí ì ììµëë¤.
compilation.hooks.someHook.tap(/* ... */);compilerì ë§ì°¬ê°ì§ë¡ tapAsync ë° tapPromiseë í
ì íì ë°ë¼
ì¬ì©í ì ììµëë¤.
SyncHook
모ë ë¹ëê° ììë기 ì ì í¸ë¦¬ê±°ëë©° 모ëì ìì íë ë° ì¬ì©í ì ììµëë¤.
modulecompilation.hooks.buildModule.tap(
'SourceMapDevToolModuleOptionsPlugin',
(module) => {
module.useSourceMap = true;
}
);SyncHook
모ëì ë¤ì ë¹ëí기 ì ì ììë©ëë¤.
moduleSyncHook
모ë ë¹ëê° ì¤í¨íë©´ ì¤íí©ëë¤.
module errorSyncHook
모ëì´ ì±ê³µì ì¼ë¡ ë¹ëëìì ë ì¤íë©ëë¤.
moduleAsyncSeriesHook
모ë 모ëì´ ìë¬ìì´ ë¹ëëìì ë í¸ì¶ë©ëë¤.
modulesSyncHook
ì±ê³µíê±°ë ìë¬ê° ìë ê²½ì° ëª¨ëì´ ë¤ì ë¹ë ë ë ì¤íë©ëë¤.
moduleSyncHook
ì»´íì¼ì´ ìë¡ì´ 모ëì ë°ë ê²ì´ ì¤ì§ëë©´ ììë©ëë¤.
SyncHook
ì»´íì¼ì´ ìë¡ì´ 모ëì ë°ê¸° ììí ë ììë©ëë¤.
SyncBailHook
ëíëì ìµì íê° ììí ë ììë©ëë¤.
modulesSyncHook
ëíëì ìµì í í ììë©ëë¤.
modulesSyncHook
'afterChunks' í ì ì²í¬ ë° ëª¨ë ê·¸ëí ìì± í ìµì í ì ì í¸ì¶ë©ëë¤. ì´ í ì íìí ê²½ì° ì²í¬ ê·¸ëí를 ê²ì¬, ë¶ì ë° ìì í ì ìë 기í를 ì ê³µí©ëë¤.
ë¤ìì compilation.hooks.afterChunks í
ì íì©íë ë°©ë²ì ëí ììì
ëë¤.
chunksSyncHook
ìµì í ë¨ê³ê° ììë ë í¸ë¦¬ê±°ë©ëë¤.
SyncBailHook
모ë ìµì í ë¨ê³ê° ììë ë í¸ì¶ë©ëë¤. íë¬ê·¸ì¸ì ì´ í ì íì©íì¬ ëª¨ëì ëí ìµì í를 ìíí ì ììµëë¤.
modulesSyncHook
모ë ìµì íê° ìë£ë í í¸ì¶ë©ëë¤.
modulesSyncBailHook
ì²í¬ ìµì í ë¨ê³ê° ììë ë í¸ì¶ë©ëë¤. íë¬ê·¸ì¸ì ì´ í ì íì©íì¬ ì²í¬ì ëí ìµì í를 ìíí ì ììµëë¤.
chunksSyncHook
ì²í¬ ìµì íê° ìë£ë í ììë©ëë¤.
chunksAsyncSeriesHook
ëíëì í¸ë¦¬ë¥¼ ìµì íí기 ì ì í¸ì¶ë©ëë¤. íë¬ê·¸ì¸ì ì´ í ì íì©íì¬ ëíëì í¸ë¦¬ ìµì í를 ìíí ì ììµëë¤.
chunks modulesSyncHook
ëíëì í¸ë¦¬ ìµì íê° ì±ê³µì ì¼ë¡ ìë£ë íì í¸ì¶ë©ëë¤.
chunks modulesSyncBailHook
ì²í¬ 모ë ìµì í ììì í¸ë¦¬ ìµì í íì í¸ì¶ë©ëë¤. íë¬ê·¸ì¸ì ì´ í ì íì©íì¬ ì²í¬ 모ëì ìµì í를 ìíí ì ììµëë¤.
chunks modulesSyncHook
ì²í¬ 모ë ìµì íê° ì±ê³µì ì¼ë¡ ìë£ë íì í¸ì¶ë©ëë¤.
chunks modulesSyncBailHook
ë ì½ë ì ì¥ ì¬ë¶ë¥¼ ê²°ì í기 ìí´ í¸ì¶ë©ëë¤. !== false를 ë°ííë©´ ë¤ë¥¸ 모ë "record" í
ì´ ì¤íëì§ ììµëë¤(record, recordModules, recordChunks ê·¸ë¦¬ê³ recordHash).
SyncHook
ë ì½ëìì 모ë ì 보를 ë³µìí©ëë¤.
modules recordsSyncHook
ê° ëª¨ëì id를 í ë¹í기 ì ì ì¤íë©ëë¤.
modulesSyncHook
ê° ëª¨ëì id를 í ë¹í기 ìí´ í¸ì¶ë©ëë¤.
modulesSyncHook
모ë id ìµì í ììì í¸ì¶ë©ëë¤.
modulesSyncHook
모ë id ìµì í ë¨ê³ê° ìë£ëë©´ í¸ì¶ë©ëë¤.
modulesSyncHook
ë ì½ëìì ì²í¬ ì 보를 ë³µìí©ëë¤.
chunks recordsSyncHook
ê° ì²í¬ì id를 í ë¹í기 ì ì ì¤íë©ëë¤.
chunksSyncHook
ê° ì²í¬ì id를 í ë¹í기 ìí´ í¸ì¶ë©ëë¤.
chunksSyncHook
ì²í¬ id ìµì í ë¨ê³ ììì í¸ì¶ë©ëë¤.
chunksSyncHook
ì²í¬ id ìµì íê° ìë£ë íì í¸ë¦¬ê±°ë©ëë¤.
chunksSyncHook
ë ì½ëì 모ë ì 보를 ì ì¥í©ëë¤. ì´ê²ì shouldRecordê° ì°¸ê³¼ ê°ì ê°ì ë°ííë ê²½ì° í¸ë¦¬ê±°ë©ëë¤.
modules recordsSyncHook
ì²í¬ ì 보를 ë ì½ëì ì ì¥í©ëë¤. ì´ë shouldRecordê° ì°¸ê³¼ ê°ì ê°ì ë°ííë ê²½ì°ìë§ í¸ë¦¬ê±°ë©ëë¤.
chunks recordsSyncHook
모ëì´ í´ìë기 ì ì í¸ì¶ë©ëë¤.
syncHook
모ëì´ í´ì ë íì í¸ì¶ë©ëë¤.
SyncHook
ì»´íì¼ì´ í´ìë기 ì ì í¸ì¶ë©ëë¤.
SyncHook
ì»´íì¼ì´ í´ìë기 ì ì í¸ì¶ë©ëë¤.
SyncHook
ë ì½ë í´ìì ëí ì 보를 recordsì ì ì¥í©ëë¤. ì´ë shouldRecordê° ì°¸ê³¼ ê°ì ê°ì ë°ííë ê²½ì°ìë§ í¸ë¦¬ê±°ë©ëë¤.
recordsSyncHook
compilationì ëí ì 보를 recordsì ì ì¥í©ëë¤. ì´ë shouldRecordê° ì°¸ê³¼ ê°ì ê°ì ë°ííë ê²½ì°ìë§ í¸ë¦¬ê±°ë©ëë¤.
compilation recordsSyncHook
모ë ì ì ì´ ìì±ë기 ì ì ì¤íë©ëë¤.
SyncHook
ì²í¬ì ëí ì¶ê° ì ì ì ë§ëëë¤.
chunksSyncBailHook
ì²í¬ ì ì
ì ë§ë¤ì§ ê²°ì í기 ìí´ í¸ì¶ë©ëë¤. !== 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ì ì ì¥ë 모ë ì ì
ì ìµì íí©ëë¤.
assetsSyncHook
ì ì ì´ ìµì íë íì í¸ì¶ë©ëë¤.
assetsAsyncSeriesHook
ì ì ì ì²ë¦¬í©ëë¤.
í íë¼ë¯¸í°:
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:');
Object.entries(assets).forEach(([pathname, source]) => {
console.log(`â ${pathname}: ${source.size()} bytes`);
});
}
);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) => {
// ì´ í¨ìë ì´ì ë¨ê³ìì íë¬ê·¸ì¸ì ìí´ ì¶ê°ë ì ì
ì ëí´ í ë² í¸ì¶ë©ëë¤.
}
);ë¤ìì ì§ìëë ë¨ê³ë¥¼ ì²ë¦¬ ììëë¡ ëì´í 목ë¡ì ëë¤.
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_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 â 리í¬í
목ì ì¼ë¡ ì ì
ì ìì±í©ëë¤.í ì "asset info" ë©í ë°ì´í°ê° ìëì¼ë¡ ì ê³µëì§ ììµëë¤. íìí ê²½ì° ì»´íì¼ ì¸ì¤í´ì¤ì ì ê³µë ì ì ê²½ë¡ ì´ë¦ì ì¬ì©íì¬ ì´ ë©í ë°ì´í°ë¥¼ ìëì¼ë¡ í´ê²°í´ì¼ í©ëë¤. ì´ê²ì webpackì 차기 ë²ì ìì ê°ì ë ê²ì ëë¤.
Example:
compilation.hooks.processAssets.tap(
{
/** ⦠*/
},
(assets) => {
Object.entries(assets).forEach(([pathname, source]) => {
const assetInfo = compilation.assetsInfo.get(pathname);
// @todo: "pathname", "source" ë° "assetInfo"를 ì¬ì©íì¬ ìì
í´ì¤ëë¤.
});
}
);SyncHook
processAssets í
ì´ ìë¬ìì´ ìë£ë íì í¸ì¶ë©ëë¤.
SyncBailHook
ë¤ë¥¸ íì¼ì í¬í¨í기 ìí´ ì»´íì¼ì ë´ì¸ í´ì í´ì¼ íëì§ íì¸í기 ìí´ í¸ì¶ë©ëë¤.
AsyncSeriesHook
needAdditionalSeal ë°ë¡ ë¤ì ì¤íë©ëë¤.
SyncHook
ê° ì²í¬ì ëí í´ì를 ë°©ì¶íëë¡ í¸ë¦¬ê±°ë©ëë¤.
chunk chunkHashSyncHook
모ëì ì ì ì´ ì»´íì¼ì ì¶ê°ë ë í¸ì¶ë©ëë¤.
module filenameSyncHook
ì²í¬ì ì ì ì´ ì»´íì¼ì ì¶ê°ë ë í¸ë¦¬ê±°ë©ëë¤.
chunk filenameSyncWaterfallHook
ì ì ì ê²½ë¡ë¥¼ ê²°ì í기 ìí´ í¸ì¶ë©ëë¤.
path optionsSyncBailHook
ì ì ì´ ë°©ì¶ë í ì¶ê°ë¡ ì²ë¦¬ëì´ì¼ íëì§ ì¬ë¶ë¥¼ íë³í기 ìí´ í¸ì¶ë©ëë¤.
SyncHook
ìì ì»´íì¼ë¬ë¥¼ ì¤ì í í ì¤íë©ëë¤.
childCompiler compilerName compilerIndexwebpack v5ë¶í° normalModuleLoader í
ì´ ì ê±°ëì기 ë문ì, ì´ì ë¡ëì ì¡ì¸ì¤íë ¤ë©´ NormalModule.getCompilationHooks(compilation).loader를 ì¬ì©íì¸ì.
HookMap
ì´ HookMapì ì¬ì ì¤ì ì´ ì¬ì©ë ë í¸ë¦¬ê±°ëë ìì 목ë¡ê³¼ ê°ìµëë¤. ìµì ê°ì²´ë¥¼ ì¬ì©í©ëë¤. íë¬ê·¸ì¸ì´ ì¬ì ì¤ì ì ê´ë¦¬í ëìë 기존 ì¤ì ì ë°ê¾¸ì§ ìê³ ì´ ê°ì²´ì ì¤ì ì ì ì¤íê² ë³ê²½í´ì¼ í©ëë¤.
options contextíë¬ê·¸ì¸ ììë ë¤ìê³¼ ê°ìµëë¤.
compilation.hooks.statsPreset.for('my-preset').tap('MyPlugin', (options) => {
if (options.all === undefined) options.all = true;
});ì´ íë¬ê·¸ì¸ì ì¬ì ì¤ì 'my-preset'ì ëí´ all ìµì
ì´ ì ìëì§ ìì ê²½ì° ê¸°ë³¸ê°ì´ trueë¡ ì¤ì ëëë¡ í©ëë¤.
SyncHook
ì´ í ì ìµì ê°ì²´ë¥¼ íì íìì ì½ê² ì¬ì©í ì ìë ì¼ê´ë íìì¼ë¡ ë³ííë ë° ì¬ì©ë©ëë¤. ëí ëë½ë ìµì ì´ ê¸°ë³¸ê°ì¼ë¡ ì¤ì ëëë¡ ë³´ì¥í©ëë¤.
options contextíë¬ê·¸ì¸ ììë ë¤ìê³¼ ê°ìµëë¤.
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 optionsHookMap
object data contextdataìë í´ëì¤ê° í¬í¨ëì´ ììµëë¤. objectë ìì±ì ì¶ê°í´ì¼ íë ê°ì²´ì
ëë¤. contextë ê²½ë¡ì í´ëì¤ì ê°ì ìí©ë³ ì 보를 ì ê³µí©ëë¤.
Example:
compilation.hooks.statsFactory.tap('MyPlugin', (statsFactory, options) => {
statsFactory.hooks.extract
.for('compilation')
.tap('MyPlugin', (object, compilation) => {
object.customProperty = MyPlugin.getCustomValue(compilation);
});
});HookMap
ê° ë 벨ì ê²°ê³¼ì í¨ê» í¸ì¶ë©ëë¤.
result contextì´ í
ì í¹ì ìµì
ìì StatsPrinter í´ëì¤ì ëí ì¡ì¸ì¤ë¥¼ ì ê³µí©ëë¤.
statsPrinter optionsHookMap
ì´ í ì íí¸ë¥¼ ì¶ë ¥í´ì¼ í ë í¸ì¶ë©ëë¤.
object contextHookMap
ì´ í ì íí¸ì ê²°ê³¼ 문ìì´ì ëí´ í¸ì¶ë©ëë¤.
result context