Webpack中Loader的pitch方法


一、Loader介紹

1.官網介紹:loader 用於對模塊的源代碼進行轉換。loader 可以使你在 import 或"加載"模塊時預處理文件。因此,loader 類似於其他構建工具中“任務(task)”,並提供了處理前端構建步驟的強大方法。loader 可以將文件從不同的語言(如 TypeScript)轉換為 JavaScript,或將內聯圖像轉換為 data URL。loader 甚至允許你直接在 JavaScript 模塊中 import CSS文件!

2.簡單來說,loader就是將不同語言轉成webpack可識別並打包代碼的函數,它的執行在webpack打包之前

二、Loader使用

以官網css-loader和style-loader的使用為例:

 
 

三、自定義簡單的Loader

 

 
 

 

四、串行Loader的正常執行順序

正常的loader的執行順序是從右向左的,如下圖,執行順序為:c-loader ----> b-loader----> a---->loader, 也就是a-loader(b-loader(c-loader(resource)))

 
 

五、Loader的pitch方法

在定義一個loader函數時,可以導出一個pitch方法,這個方法會在loader函數執行前執行。

 
 

另外,如果存在多個loader串行的情況,這些loader的pitch函數會從左到右依次執行,其示意圖如下:

 

 
 

六、style-loader中pitch的使用

style-loader的作用是將css-loader返回的js符串轉成css樣式,然后添加到html中。它的導出就用到了pitch方法,原因是因為什么呢?我們知道css-loader最后會導出一段js字符串,里面可能包含需要動態執行的函數。按照正常的執行順序,style-loader只能拿到這些字符串而並不能把他們轉成真正的css代碼。因此,在執行css-loader之前,我們需要對在style-loader的pitch方法里面先執行如下代碼(已簡化)

 
 

而由上面的loader執行順序圖可知,當style-loader的pitch方法里有返回值時,我們將不再執行剩余的css-loader,這樣不就是完全沒對樣式文件做處理么?這是我最疑惑的地方,后來查到了這么一段話:

 
 

其大概的意思是,在style-loader的pitch方法有返回值時,剩余的css-loader的pitch方法、css-loader的normal方法以及style-loader的normal方法都不會執行了。而style-loader的pitch方法里面調用了require('!!.../x.css'),這就會把require的css文件當作新的入口文件,重新鏈式調用剩余的loader函數進行處理。(值得注意的是'!!'是一個標志,表示不會再重復遞歸調用style-loader,而只會調用css-loader處理了)



作者:帥氣的奶蓋
鏈接:https://www.jianshu.com/p/9dfb8e18e76d
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM