NormalModuleFactory
NormalModuleFactory
由 編譯器 用於產生模組 (NormalModule
)。從每個入口模組 (entry
) 開始,它解析模組的依賴請求,以獲得依賴項的最終路徑。根據這些最終路徑,它會建立 NormalModule
實例。然後,它會進一步解析新建立模組的依賴請求。這個過程是遞迴的,透過 NormalModuleFactory
將每個模組建立為 NormalModule
。
NormalModuleFactory
提供以下生命週期鉤子。這些鉤子的使用方式與 Compiler
鉤子相同
NormalModuleFactory.hooks.someHook.tap(/* ... */);
所有鉤子都繼承自 Tapable
。除了 tap()
,您還可以根據鉤子的類型使用 tapAsync()
和 tapPromise()
。
beforeResolve
AsyncSeriesBailHook<[ResolveData]>
當遇到新的依賴請求時呼叫。可以透過返回 false
來忽略依賴項。否則,它應該返回 undefined
以繼續。
beforeResolve
鉤子在模組解析過程的一開始就會被呼叫,允許在解析發生之前攔截和修改模組的請求資訊。此鉤子可用於預處理、篩選或阻止特定模組的解析。
compiler.hooks.compilation.tap(
'MyPlugin',
(compilation, { normalModuleFactory }) => {
normalModuleFactory.hooks.beforeResolve.tap('MyPlugin', resolveData => {
// access and modify module request information
console.log(JSON.stringify(resolveData, null, 2));
});
},
);
factorize
AsyncSeriesBailHook<[ResolveData]>
在啟動解析之前呼叫。它應該返回 undefined 以繼續。
factorize
鉤子用於在模組實例化之前新增自訂邏輯,修改模組建立過程。
compiler.hooks.compilation.tap(
'MyPlugin',
(compilation, { normalModuleFactory }) => {
normalModuleFactory.hooks.factorize.tap('MyPlugin', resolveData => {
// access and modify module request information
console.log(JSON.stringify(resolveData, null, 2));
});
},
);
警告
目前不支援返回模組實例。此鉤子會影響模組的建立過程,因此請謹慎使用。
resolve
AsyncSeriesBailHook<[ResolveData]>
在解析請求之前呼叫,它應該返回 undefined
以繼續。 resolve
鉤子可用於在模組解析開始之前攔截和修改模組請求資訊。此鉤子允許對模組請求進行預處理。
compiler.hooks.compilation.tap(
'MyPlugin',
(compilation, { normalModuleFactory }) => {
normalModuleFactory.hooks.resolve.tap('MyPlugin', resolveData => {
// access and modify module request information
console.log(JSON.stringify(resolveData, null, 2));
});
},
);
afterResolve
AsyncSeriesBailHook<[ResolveData]>
在解析請求之後呼叫。
afterResolve
鉤子用於在模組解析完成後進一步處理或修改結果。它會在模組解析過程結束時呼叫,這表示在這個階段,模組的路徑、請求資訊等都已經確定。
compiler.hooks.compilation.tap(
'MyPlugin',
(compilation, { normalModuleFactory }) => {
normalModuleFactory.hooks.afterResolve.tap('MyPlugin', resolveData => {
// access and modify the resolved module information
console.log(JSON.stringify(resolveData, null, 2));
});
},
);
resolveForScheme
AsyncSeriesBailHook<[ResourceDataWithData]>
在解析具有 scheme (URI) 的請求之前呼叫。
resolveForScheme
通常用於處理具有特定協定的模組請求,例如 file://
、https://
等。
compiler.hooks.compilation.tap(
'MyPlugin',
(compilation, { normalModuleFactory }) => {
normalModuleFactory.hooks.resolveForScheme.tap('MyPlugin', resourceData => {
console.log(JSON.stringify(resourceData, null, 2));
});
},
);