<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
loader是一個函數,loader模組要預設匯出該函數,同時這個函數上可以有pitch方法,webpack會執行這個pitch方法,pitch方法會影響webpack後續行為。
loader的作用是將原始檔轉化為可以執行的js模組,webpack會檢查loader返回的這個模組是否是正確的,符合js模組化規範,如果有錯誤會終止打包。例如我定義了一個test.js
模組,其預設匯出一個函數:
test.js
module.exports = function (a, b) { return a+b; }
然後定義一個test-loader
,讓其只會匹配test.js
:
module.exports = function (content) { return `var a = {name: 'wjl'}; module.exports = a;` }
test-loader
返回了一段新的程式碼,預設匯出一個物件,在index.js
中我們匯入test.js
模組,嘗試輸出物件上的name
屬性,然後通過webpack
打包:
const a = require('./test.js') console.log(a.name)
打包結果為main.js
,執行main.js
可以正確得到輸出。這說明webpack
執行了var a = {name: 'wjl'}; module.exports = a;
,test.js
模組最終匯出的內容為a
。
當把test-loader
的匯出語句刪除,改為以下內容時,能夠正確通過webpack
檢查,但是index.js
中不能存取匯出物件了:
test-loader.js
module.exports = function (content) { // return `var a = {name: 'wjl'}; console.log(123); module.exports = a;` return `var a = {name: 'wjl'}; console.log(123);` }
index.js
const a = require('./test.js') console.log(a, a.name)
執行匯出檔案main.js
得到
這是由於這個模組沒有匯出內容(物件上沒有屬性),test.js
的模組程式碼會在執行時執行(輸出123,cjs的模組需要執行完模組內容才能得到匯出物件)。
(如果loader
匯出的內容中含有import
或require
等語句,webpack
會再次進行相關內容的匯入,這方面的知識目前暫時不分析)
loader總結:loader
的作用是將準備匯入的模組裡面的內容轉換成可以正常執行的js
模組程式碼,轉換後的內容會在執行時執行,以得到模組的匯出內容或執行其他副作用程式碼。
為什麼需要使用pitch?我們以css-loader
和style-loader
作為分析。
在只使用css-loader
的情況下,假設我們有兩個檔案:index.css
和index.js
,index.css
定義了一些樣式,index.js
匯入了index.css
:
index.css
:
body { font-size: 16px; color: red; }
index.js
:
const style = require('./index.css') console.log(style);
執行結果為:
css-loader
將目標樣式檔案轉換成一個js物件並匯出了該物件,預設屬性上有index.css
檔案的資訊。
需要注意的是,這個物件是執行完css-loader
轉換的模組內容後得到的!我們先定義一個普通的my-style-loader
根據呼叫順序拿到css-loader
的返回值:
my-style-loader
:
module.exports = function (source) { console.log('*******************'); console.log(source); console.log('*******************'); return source; }
css-loader
將index.css
模組轉換為以下內容:
// Imports import ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from "./node_modules/.pnpm/registry.npmmirror.com+css-loader@6.7.3_webpack@5.75.0/node_modules/css-loader/dist/runtime/noSourceMaps.js"; import ___CSS_LOADER_API_IMPORT___ from "./node_modules/.pnpm/registry.npmmirror.com+css-loader@6.7.3_webpack@5.75.0/node_modules/css-loader/dist/runtime/api.js"; var ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___); // Module ___CSS_LOADER_EXPORT___.push([module.id, "body {rn font-size: 16px;rn color: red;rn}", ""]); // Exports export default ___CSS_LOADER_EXPORT___;
也就是說,index.css
裡面的內容,還是要執行完index.css
模組才能得到
使用style-loader
的目的是往document
中插入style
標籤,如果style-loader
是一個普通loader
的話,它需要執行css-loader
返回的模組才能得到css
樣式,當然可以解析css-loader
返回的模組內容,然後得到樣式,然後返回建立style
標籤的相關語句,但是這樣工作量太大了。而返回的模組中有import
相關的語句時,webpack
還會載入那些import的內容,但是例如./node_modules/.pnpm/registry.npmmirror.com+css-loader@6.7.3_webpack@5.75.0/node_modules/css-loader/dist/runtime/api.js
是會被webpack
最終打包生成的模組,在nodejs環境中是無法得到的。
打包產物:
一個模組載入(import '!!xxxx-loader!./index.css')被webpack
打包之後會新增到module map
裡面,鍵就是請求路徑。
style-loader
的思路就是,得到css-loader
的模組內容,然後再將模組內容插入到style
標籤中,再將style
標籤插入檔案中。
為了得到css-loader
處理後的內容(需要能被執行),style-loader
構造了一個新的require
語句,即:
require(`${loaderUtils.stringifyRequest(this, '!!' + remainingRequest)}`) // !!./node_modules/.pnpm/registry.npmmirror.com+css-loader@6.7.3_webpack@5.75.0/node_modules/css-loader/dist/cjs.js!./index.css
webpack
發現返回的內容中有模組匯入,然後使用路徑中的loader
去載入這個模組,並將其儲存在記憶體中(多個檔案參照同一個模組,目標模組只會被處理一次)。
loader
和picher
本質上都是改變目標檔案的內容,讓它變成符合js語法的程式碼,如果返回的內容有不存在的匯入,則會再次執行匯入。
webpack
每個loader
處理的結果都會生成單獨的模組,但是在loader
函數中,它無法之前使用了哪些loader,也無法知道已生成模組的名字,因此style-loader
無法在loader
函數中匯入已經生成的模組。
而pitch
階段可以獲取到之後的loader
順序,實現起來也更加方便。
以上就是style-loader為什麼要使用pitch方法原理解析的詳細內容,更多關於style-loader使用pitch方法的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45