熱加載又名“模塊熱替換(HMR - Hot Module Replacement)”改衩。是一種不需要重新加載頁面霎肯,就可以增加拧晕,刪除藐石,修改代碼中的模塊塞茅,并生效的一種功能美尸,webpack功能罩锐。
一. HMR可以做到以下幾點(diǎn):
1.保留應(yīng)用程序狀態(tài)猜丹。
完全加載頁面求泰,會(huì)讓程序狀態(tài)回歸原始央渣。HMR修改模塊,不會(huì)重新加載頁面渴频,所以芽丹,程序狀態(tài)不會(huì)改變。
2.只更新變更的內(nèi)容卜朗,沒有改變的模塊拔第,不做更改。
3.調(diào)整樣式更加快速 - 幾乎相當(dāng)于在瀏覽器調(diào)試器中更改樣式场钉。
二. HMR為什么可以做到以下幾點(diǎn):
1.在應(yīng)用程序中
(1)應(yīng)用程序代碼要求 HMR runtime 檢查更新
(2)HMR runtime(異步)下載更新蚊俺,然后通知應(yīng)用程序代碼。
(3)應(yīng)用程序代碼要求 HMR runtime 應(yīng)用更新.
(4)HMR runtime(同步)應(yīng)用更新
2.模塊中
(1)舉個(gè)例子逛万,通過?style-loader?為 style 樣式追加補(bǔ)丁泳猬。為了運(yùn)行追加補(bǔ)丁,style-loader?實(shí)現(xiàn)了 HMR 接口;當(dāng)它通過 HMR 接收到更新暂殖,它會(huì)使用新的樣式替換舊的樣式价匠。
(2)不需要強(qiáng)制在每個(gè)模塊中寫入 HMR 代碼。如果一個(gè)模塊沒有 HMR 處理函數(shù)呛每,更新就會(huì)冒泡(bubble up)踩窖。這意味著一個(gè)簡單的處理函數(shù)能夠?qū)φ麄€(gè)模塊樹(complete module tree)進(jìn)行更新。如果在這個(gè)模塊樹中晨横,一個(gè)單獨(dú)的模塊被更新洋腮,那么整組依賴模塊都會(huì)被重新加載。(等于頁面刷新了)
(3)module.hot
3.在HMR的runtime中
(1)對于模塊系統(tǒng)的 runtime手形,附加的代碼被發(fā)送到?parents?和?children?跟蹤模塊啥供。在管理方面,runtime 支持兩個(gè)方法?check?和?apply
(2)check?發(fā)送 HTTP 請求來更新 manifest库糠。如果請求失敗伙狐,說明沒有可用更新。如果請求成功瞬欧,待更新 chunk 會(huì)和當(dāng)前加載過的 chunk 進(jìn)行比較贷屎。對每個(gè)加載過的 chunk,會(huì)下載相對應(yīng)的待更新 chunk艘虎。當(dāng)所有待更新 chunk 完成下載唉侄,就會(huì)準(zhǔn)備切換到?ready?狀態(tài)
(3)apply?方法將所有被更新模塊標(biāo)記為無效。對于每個(gè)無效模塊野建,都需要在模塊中有一個(gè)更新處理函數(shù)(update handler)属划,或者在它的父級(jí)模塊們中有更新處理函數(shù)
(4)之后,所有無效模塊都被(通過 dispose 處理函數(shù))處理和解除加載候生。然后更新當(dāng)前 hash同眯,并且調(diào)用所有 "accept" 處理函數(shù)。runtime 切換回閑置狀態(tài)(idle state)陶舞,一切照常繼續(xù)嗽测。
理解:runtime對代碼進(jìn)行追蹤和監(jiān)控,發(fā)送http確定是否發(fā)生更改肿孵。當(dāng)有更改后唠粥,進(jìn)行處理和加載,然后將模塊標(biāo)記為無效停做。在進(jìn)行一輪追蹤和監(jiān)控晤愧。