普通模块工厂
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]>
在具有方案 (URI) 的请求被解析之前调用。
resolveForScheme
通常用于处理具有特定协议的模块请求,例如 file://
、https://
等。
compiler.hooks.compilation.tap(
'MyPlugin',
(compilation, { normalModuleFactory }) => {
normalModuleFactory.hooks.resolveForScheme.tap('MyPlugin', resourceData => {
console.log(JSON.stringify(resourceData, null, 2));
});
},
);