模組解析

解析器是一個程式庫,可協助透過絕對路徑來找出模組。模組可以作為相依性從另一個模組中要求,如下所示

import foo from 'path/to/module';
// or
require('path/to/module');

相依性模組可以來自應用程式程式碼或第三方程式庫。解析器可協助 webpack 找出需要包含在套件中的模組程式碼,以供每個此類 require/import 陳述式使用。webpack 使用 enhanced-resolve 來解析檔案路徑,同時將模組打包。

webpack 中的解析規則

使用 enhanced-resolve,webpack 可以解析三種類型的檔案路徑

絕對路徑

import '/home/me/file';

import 'C:\\Users\\me\\file';

由於我們已經有檔案的絕對路徑,因此不需要進一步解析。

相對路徑

import '../src/file1';
import './file2';

在這種情況下,發生 importrequire 的原始檔案目錄會被視為內容目錄。在 import/require 中指定的相對路徑會加入此內容路徑,以產生模組的絕對路徑。

模組路徑

import 'module';
import 'module/lib/file';

模組會在 resolve.modules 中指定的所有目錄內進行搜尋。你可以使用 resolve.alias 設定選項為模組建立別名,以取代原始模組路徑。

  • 如果套件包含 package.json 檔案,則會依序查看 resolve.exportsFields 設定選項中指定的欄位,而 package.json 中的第一個此類欄位會根據 套件匯出指南 決定套件可用的匯出。

一旦路徑根據上述規則解析後,解析器會檢查路徑是否指向檔案或目錄。如果路徑指向檔案

  • 如果路徑有檔案副檔名,則會立即將檔案打包。
  • 否則,檔案副檔名會使用 resolve.extensions 選項解析,此選項會告訴解析器哪些副檔名可接受解析,例如 .js.jsx

如果路徑指向資料夾,則會執行下列步驟來尋找具有正確副檔名的正確檔案

  • 如果資料夾包含 package.json 檔案,則會依序查看 resolve.mainFields 設定選項中指定的欄位,而 package.json 中的第一個此類欄位會決定檔案路徑。
  • 如果沒有 package.json 或如果 resolve.mainFields 沒有傳回有效路徑,則會依序尋找 resolve.mainFiles 設定選項中指定的檔案名稱,以查看匯入/必要的目錄中是否存在相符的檔案名稱。
  • 然後會使用 resolve.extensions 選項以類似的方式解析檔案副檔名。

Webpack 會根據你的建置目標為這些選項提供合理的 預設值

解析載入器

這遵循與檔案解析指定的相同規則。但 resolveLoader 設定選項可用於為載入器制定不同的解析規則。

快取

每個檔案系統存取都會快取,因此對同一個檔案的多次平行或串列要求會執行得更快。在監控模式中,只有修改過的檔案會從快取中移除。如果監控模式關閉,那麼在每次編譯之前快取會被清除。

請參閱解析 API以進一步了解上述組態選項。

5 貢獻者

pksjcepastelskybyzykEugeneHlushkowizardofhogwarts