普通模块工厂

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));
    });
  },
);
警告

目前不支持返回模块实例或 false

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));
    });
  },
);