Webpack模塊熱替換原理(梁王的理論自習(xí)室)

Webpack模塊熱替換(HMR)

熱替換就是我代碼更新了,我不需要手動f5頁面就更新了索绪,這個功能主要是用于開發(fā)過程中契吉,對生產(chǎn)環(huán)境沒有任何幫助宅荤。效果上就是界面的無刷新更新。

原理闡述

這一部分主要是參考官網(wǎng)的文檔加一些自己的理解

webpack在編譯的時候會加一小段HMR runtime的代碼進bundle里面浸策,這一段代碼運行在你的APP中冯键。當(dāng)編譯結(jié)束后Webpack不會退出而是監(jiān)聽源代碼的變化,如果檢測到了源代碼變化庸汗,Webpack會重新編譯發(fā)生變化的模塊(不會全部重新編譯)惫确。

然后根據(jù)設(shè)置(這個設(shè)置是啥讀者能不能告訴我),webpack會發(fā)送信號給HMR runtime或者HMR runtime會輪詢webpack是否有變化蚯舱。反正不管怎么樣變化后的模塊會發(fā)送給HMR runtime改化,然后會嘗試熱更新。

首先檢查這個更新后的模塊是否是self-accept枉昏。如果不是陈肛,它就會檢查其他依賴于這個更新后的模塊的其他模塊,如果這些模塊也不accept(accept我后面會解釋)這個更新凶掰,那就會冒泡到更上一層燥爷,去檢測那些依賴于依賴這個更新后的模塊的模塊的模塊(好繞啊。懦窘。反正就是處于依賴層再上一層的模塊)前翎。冒泡會直到這個更新被accept或者到達app的入口起點(entry points),不過這種情況熱更新就廢了畅涂。

從 App 的角度

App 代碼請求 HMR runtime檢查更新.(這里的說法應(yīng)該是輪詢)
HMR runtime會下載(異步)更新的代碼,
通知 App 代碼運行已經(jīng)可用.
App 代碼請求 HMR runtime應(yīng)用更新.
HMR 運行時應(yīng)用更新(同步).
這個過程, App 代碼可以也可以不依賴用戶操作(看需要).

從編譯器(Webpack)角度

除了普通的靜態(tài)文件, 編譯器觸發(fā) "Update" 進行版本更新."Update" 包含兩個部分:

  1. the update manifest (json)
  2. one or multiple update chunks (js)

manifest 包含新的編譯結(jié)果的 Hash 和列表儲存的 chunks (2.).
更新的 chunks 包含 chunk 當(dāng)中所有更新掉的模塊的代碼(或者模塊已經(jīng)被移除的標(biāo)記)
編譯器額外會保證模塊和 chunk 的 id 在多個建構(gòu)當(dāng)中一致

它使用 "records" JSON 文件在建構(gòu)之間保存它們(或者存儲在內(nèi)存里)

從模塊角度

HMR 是個可選功能, 它只影響包含 HMR 代碼的模塊文件里描述了模塊中可用的 API通常模塊開發(fā)者寫的處理器代碼會在這個模塊的依賴更新時被調(diào)用他也可以寫個處理器, 在當(dāng)前模塊更新時被調(diào)用

大多數(shù)情況不會強制在每個模塊里寫上 HMR 代碼如果一個模塊不包含 HMR 處理器, 更新事件就會向上冒泡意味著單個處理器可以處理整個模塊樹的更新如果樹當(dāng)中單個模塊被更新, 整個模塊樹就會重新(刷新而不是 transferred(轉(zhuǎn)移?))

從 HMR runtime角度(技術(shù)的)

對模塊系統(tǒng)而言, HMR runtime是一段被插入的代碼港华,它用來追蹤模塊的父節(jié)點子節(jié)點
管理層面, 運行時支持兩個方法: checkapply

check

check 發(fā)起 HTTP 請求去獲取更新的 manifest。請求失敗時, 意味著沒有可用的更新否則將能返回更新的 chunks 的列表, 和當(dāng)前已加載的 chunks 列表做對比每個被更新的 chunk 對應(yīng)的更新后的 chunk 都會被下載所有存儲在運行時當(dāng)中的代碼模塊隨著代碼進行更新運行時會切換到 ready狀態(tài), 表明更新已經(jīng)被下載并準(zhǔn)備好應(yīng)用
對于每個 ready 狀態(tài)的新的 chunk 請求來說, 更新的 chunk 也已經(jīng)被下載好了

apply

apply 方法標(biāo)記所有更新過的模塊為 invalid午衰,每個 invalid 模塊需要有個 update 處理器, 在模塊中或者在每個父節(jié)點不然 invalid 向上冒泡, 多有的父節(jié)點也被標(biāo)記為 invalid這個步驟持續(xù)知道不再有"冒泡"出現(xiàn)如果冒泡到了 entry point 就說明過程失敗了
現(xiàn)在所有 invalid 模塊會被處置(dispose 處理器)和卸載隨后當(dāng)前的 hash 被更新, 所有的 "accept" 處理器被調(diào)用運行時切換回到 "idle" 狀態(tài), 一切繼續(xù)正常運行
生成的文件(技術(shù)的)
左側(cè)表示初始的編譯器流程右側(cè)表示當(dāng)模塊 4 和 9 更新的流程

后記

立宜。。臊岸。寫到后面感覺我就是在翻譯文檔而已橙数。。不過還算學(xué)到了一些東西順便練習(xí)了下英語帅戒。
在我自己的vue項目里面幾乎只在plugins里面有一句new webpack.HotModuleReplacementPlugin()而看不到一些很細節(jié)的東西灯帮,真方便。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末逻住,一起剝皮案震驚了整個濱河市钟哥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瞎访,老刑警劉巖腻贰,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異扒秸,居然都是意外死亡播演,警方通過查閱死者的電腦和手機冀瓦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來写烤,“玉大人咕幻,你說我怎么就攤上這事《ハ迹” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵锣吼,是天一觀的道長选浑。 經(jīng)常有香客問我,道長玄叠,這世上最難降的妖魔是什么古徒? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮读恃,結(jié)果婚禮上隧膘,老公的妹妹穿的比我還像新娘。我一直安慰自己寺惫,他們只是感情好疹吃,可當(dāng)我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著西雀,像睡著了一般萨驶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上艇肴,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天腔呜,我揣著相機與錄音,去河邊找鬼再悼。 笑死核畴,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的冲九。 我是一名探鬼主播谤草,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼娘侍!你這毒婦竟也來了咖刃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤憾筏,失蹤者是張志新(化名)和其女友劉穎嚎杨,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體氧腰,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡枫浙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年刨肃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片箩帚。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡真友,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出紧帕,到底是詐尸還是另有隱情盔然,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布是嗜,位于F島的核電站愈案,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鹅搪。R本人自食惡果不足惜站绪,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望丽柿。 院中可真熱鬧恢准,春花似錦、人聲如沸甫题。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坠非。三九已至眯漩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間麻顶,已是汗流浹背赦抖。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留辅肾,地道東北人队萤。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像矫钓,于是被迫代替她去往敵國和親要尔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容