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