webpack熱更新的原理及實(shí)現(xiàn)
刷新分為兩種:一種是頁(yè)面刷新,不保留頁(yè)面狀態(tài),就是簡(jiǎn)單粗暴,直接window.location.reload();另一種只需要局部刷新頁(yè)面上發(fā)生變化的模塊,同時(shí)可以保留當(dāng)前的頁(yè)面狀態(tài),比如復(fù)選框的選中狀態(tài)、輸入框的輸入等。
Webpack熱更新( Hot Module Replacement,簡(jiǎn)稱 HMR,后續(xù)均以 HMR 替代),無(wú)需完全刷新整個(gè)頁(yè)面的同時(shí),更新代碼變動(dòng)的模塊,是 Webpack 內(nèi)置的最有用的功能之一。
HMR 的好處,在日常開(kāi)發(fā)工作中體會(huì)頗深:節(jié)省寶貴的開(kāi)發(fā)時(shí)間、提升開(kāi)發(fā)體驗(yàn)。引用官網(wǎng)的描述來(lái)概述一下:
HMR 功能會(huì)在應(yīng)用程序運(yùn)行過(guò)程中,替換、添加或刪除模塊,而無(wú)需重新加載整個(gè)頁(yè)面。主要是通過(guò)以下幾種方式,來(lái)顯著加快開(kāi)發(fā)速度:
- 保留在完全重新加載頁(yè)面期間丟失的應(yīng)用程序狀態(tài)。
- 只更新變更內(nèi)容,以節(jié)省寶貴的開(kāi)發(fā)時(shí)間。
- 在源代碼中對(duì) CSS / JS 進(jìn)行修改,會(huì)立刻在瀏覽器中進(jìn)行更新,這幾乎相當(dāng)于在瀏覽器 devtools 直接更改樣式。
1. 熱更新原理
Webpack 的熱模塊替換(Hot Module Replacement,HMR)是一種在不完全刷新頁(yè)面的情況下更新應(yīng)用代碼的技術(shù),從而提高了開(kāi)發(fā)效率。以下是 HMR 的核心原理:
| 步驟 | 描述 |
|---|---|
| 1 | 開(kāi)發(fā)者使用 webpack-dev-server 啟動(dòng)本地開(kāi)發(fā)服務(wù)器,提供靜態(tài)文件服務(wù)并支持 WebSocket 實(shí)時(shí)通信。 |
| 2 | webpack-dev-server 構(gòu)建應(yīng)用時(shí),在輸出的 JavaScript 文件中注入 HMR 運(yùn)行時(shí)代碼,處理更新通知。 |
| 3 | Webpack 配置 watch 模式,監(jiān)聽(tīng)源代碼文件變化,發(fā)現(xiàn)變化后開(kāi)始重新編譯。 |
| 4 | 編譯完成,新模塊版本生成并存儲(chǔ)在內(nèi)存,啟用 HMR 時(shí)不刷新頁(yè)面,準(zhǔn)備更新包。 |
| 5 | 通過(guò) WebSocket 長(zhǎng)連接,webpack-dev-server 通知客戶端哪些模塊有更新。 |
| 6 | HMR 運(yùn)行時(shí)嘗試應(yīng)用更新,調(diào)用模塊的 HMR 接口,替換舊模塊實(shí)例(若支持)。 |
| 7 | 模塊可接受或拒絕更新,有副作用則拒絕并提示手動(dòng)刷新。 |
| 8 | 更新失敗,Webpack 運(yùn)行時(shí)回滾到之前狀態(tài),避免應(yīng)用崩潰。 |
| 9 | 對(duì)于不支持 HMR 或無(wú)法更新的模塊,開(kāi)發(fā)者可選擇手動(dòng)刷新頁(yè)面。 |
2. 熱更新配置
啟用 webpack 的 模塊熱替換 特性:
webpack.config.js
module.exports = {
//...
devServer: {
hot: true,
},
};
通過(guò)命令行使用:
npx webpack serve --hot
如需禁用:
npx webpack serve --no-hot
啟用模塊熱替換功能,在構(gòu)建失敗時(shí)不刷新頁(yè)面作為回退,使用 hot: 'only':
webpack.config.js
module.exports = {
//...
devServer: {
hot: 'only',
},
};
通過(guò)命令行使用:
npx webpack serve --hot only
提示
從webpack-dev-server v4開(kāi)始,HMR是默認(rèn)啟用的。它會(huì)自動(dòng)應(yīng)用webpack.HotModuleReplacementPlugin,這是啟用HMR所必需的。因此當(dāng)hot設(shè)置為true或者通過(guò)CLI設(shè)置--hot,你不需要在你的webpack.config.js添加該插件。
到此這篇關(guān)于webpack熱更新的原理及實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)webpack熱更新內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS ES6展開(kāi)運(yùn)算符的幾個(gè)妙用
這篇文章主要介紹了JS ES6展開(kāi)運(yùn)算符的幾個(gè)妙用,想了解ES6的同學(xué),可以參考下2021-04-04
基于JavaScript實(shí)現(xiàn)大文件上傳后端代碼實(shí)例
JavaScript實(shí)現(xiàn)給數(shù)字添加千位分隔符
前端檢測(cè)到省略號(hào)文本自動(dòng)顯示Tooltip的方法技巧

