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" 훅이 실행되지 않습니다(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, // 더 많은 단계는 아래를 참고하세요.
},
(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
chunkHash
SyncHook
모듈의 애셋이 컴파일에 추가될 때 호출됩니다.
module
filename
SyncHook
청크의 애셋이 컴파일에 추가될 때 트리거됩니다.
chunk
filename
SyncWaterfallHook
애셋의 경로를 결정하기 위해 호출됩니다.
path
options
SyncBailHook
애셋이 방출된 후 추가로 처리되어야 하는지 여부를 판별하기 위해 호출됩니다.
SyncHook
자식 컴파일러를 설정한 후 실행됩니다.
childCompiler
compilerName
compilerIndex
webpack 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
options
HookMap
object
data
context
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);
});
});
HookMap
각 레벨의 결과와 함께 호출됩니다.
result
context
이 훅은 특정 옵션에서 StatsPrinter
클래스에 대한 액세스를 제공합니다.
statsPrinter
options
HookMap
이 훅은 파트를 출력해야 할 때 호출됩니다.
object
context
HookMap
이 훅은 파트의 결과 문자열에 대해 호출됩니다.
result
context