解析器是一個程式庫,可協助透過絕對路徑來找出模組。模組可以作為相依性從另一個模組中要求,如下所示
import foo from 'path/to/module';
// or
require('path/to/module');
相依性模組可以來自應用程式程式碼或第三方程式庫。解析器可協助 webpack 找出需要包含在套件中的模組程式碼,以供每個此類 require
/import
陳述式使用。webpack 使用 enhanced-resolve 來解析檔案路徑,同時將模組打包。
使用 enhanced-resolve
,webpack 可以解析三種類型的檔案路徑
import '/home/me/file';
import 'C:\\Users\\me\\file';
由於我們已經有檔案的絕對路徑,因此不需要進一步解析。
import '../src/file1';
import './file2';
在這種情況下,發生 import
或 require
的原始檔案目錄會被視為內容目錄。在 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以進一步了解上述組態選項。