愛伊米

webpack 流程解析 (5) module reslove

作者:csywweb

前言

上文說道我們拿到了構建modlule的factory,和依賴等關鍵資料,透過addModuleTree經過的控制走到了。這個時候就開始了reslove過程。

本文主要分析, 內部 ,,,  這幾個鉤子。

配置檔案

本文圍繞的配置檔案如下:

factory.create

入口從開始,這裡的  是之前  獲取到的

webpack 流程解析 (5) module reslove

先觸發了其內部的  鉤子,然後在回撥裡執行了  鉤子函式。

鉤子內有又呼叫了。

這裡看起來比較繞,簡單解釋一下:

鉤子的呼叫順序,就像是這樣。

->  ->

沒找到之前註冊過的地方,看起來什麼都沒幹,也有可能是我沒找到

之前在外掛中註冊過,這裡會處理下的資訊。

鉤子註冊在內部,用於解析這個,生成對應的loader和依賴資訊,這裡的重點就在

resolve

getLoaderResolver

進來的第一步 鉤子先呼叫了 返回loaderResolver,這個可以理解為是解析loader的方法。

簡單過一下分為以下幾步:

呼叫到了裡的方法

判斷是否有對應型別的快取

建立 ,

呼叫建立了一個 ,然後返回 繼續執行程式碼。

暴露了一個方法,用於解析。

normalResolver

接著往下走,略過一些判斷,直接走到了這個方法,這裡會根據webpack配置檔案中的選項,生成一個 。同樣的,這個也是的例項,也暴露出了一個方法。

接下來會把這個 和一些上下文資訊傳給方法,這裡最終會呼叫到的。

然後根據返回的和一起拼裝成。我們在後續解析loader的時候還會用到這個。

資料結構

webpack 流程解析 (5) module reslove

解析loader

在的回撥裡繼續執行

這裡會根據配置檔案裡的得到需要的loader,這個例子裡,我們的是

webpack 流程解析 (5) module reslove

接下來會透過這個的遍歷,生成, , 。

然後呼叫得到。

當前例子並沒有和,這裡只有。內部呼叫解析,最後結果就是把裡的loader替換成了對應的真實檔案地址。

生成回撥資料

最後在處理下已經生成好的資料,首先是對的合併。把這幾個合併。然後一下, 這個來自於鉤子的入口傳入的data。

這裡著重講一下和, 這兩個方法返回的是對應檔案的解析器和構建模板的方法。按照當前示例,返回的是和。

然後這個將被用於。

在執行完的鉤子後

reslove結束了,即將開始下一步,建立!

小結

module resolve 流程用於獲得各 loader 和模組的絕對路徑等資訊。

在鉤子裡,先透過enhanced-resolve獲取,提供 resolve 方法

在方法裡,獲取r, 提供 resolve 方法。

解析,得到檔案的絕對路徑等資訊

根據得到 loader

使用  得到loader的絕對路徑等資訊

合併 loader, 拼接資料,

呼叫的鉤子,結束流程。