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