熱更新(Hot Module Replacement,簡稱HMR)是指在無需刷新整個頁面,只更新頁面的局部完成更新。HMR是webpack的內置功能,可以通過HotModuleReplacementPlugin或--hot開啟。
webpack熱更新基本原理:
1、修改的entry配置
在啟動webpack的本地服務之前,調用了updateCompiler(iler)方法,該方法修改了的entry配置:在entry中新增兩個js文件,這意味着這兩個js文件會在打包時隨着入口文件一起打包為。
一個是webpack-dev-server/client/,負責與本地服務建立webSocket通信。另一個是webpack/hot/,負責瀏覽器在收到本地服務消息後進行熱更新檢查及更新操作。因為這兩個操作都需要在瀏覽器端完成,所以需要隨入口文件一起打包,這樣就能在瀏覽器的環境中運行了。
2、啟動本地服務
簡單來説就是
webpack依賴express啟動了一個本地服務器,可以訪問本地靜態資源。
生成了compiler對象,可以對本地文件的修改進行監聽
啟動本地服務後,可以通過webSocket與瀏覽器端進行通信
3、監聽文件發生變化
在setupDevMiddleware中監聽了本地文件的變化,當文件發生變化時重新進行編譯。然後執行setFs方法,將編譯後的文件打包內存。
4、監聽webpack編譯完成
當一次webpack編譯結束,就會調用_sendStats方法通過websocket給瀏覽器發送通知,ok和hash事件,這樣瀏覽器就可以拿到最新的hash值了,做檢查更新邏輯。
5、瀏覽器收到檢查更新通知
瀏覽器收到ok和hash事件,開始檢查更新。
hash事件:更新最新一次打包的值
ok事件:進行更新檢查
6、HotModuleReplacementPlugin進行更新
在此之前,一直是webpack-dev-server所做的事情,接下來更新這裏是HotModuleReplacementPlugin負責。HotModuleReplacementPlugin裏面的k方法,發送請求,獲取上一次的hash值,在使用hotApply(這裏省略一些步驟…)刪除掉舊的模塊,添加新的模塊。