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

目前不支援返回模組實例或 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]>

在解析具有 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));
    });
  },
);