成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官:說說Webpack的熱更新是如何做到的?原理是什么?

開發 前端
HMR全稱 Hot Module Replacement,可以理解為模塊熱替換,指在應用程序運行過程中,替換、添加、刪除模塊,而無需重新刷新整個應用

[[397619]]

本文轉載自微信公眾號「JS每日一題」,作者灰灰。轉載本文請聯系JS每日一題公眾號。

一、是什么

HMR全稱 Hot Module Replacement,可以理解為模塊熱替換,指在應用程序運行過程中,替換、添加、刪除模塊,而無需重新刷新整個應用。

例如,我們在應用運行過程中修改了某個模塊,通過自動刷新會導致整個應用的整體刷新,那頁面中的狀態信息都會丟失

如果使用的是 HMR,就可以實現只將修改的模塊實時替換至應用中,不必完全刷新整個應用

在webpack中配置開啟熱模塊也非常的簡單,如下代碼:

  1. const webpack = require('webpack'
  2. module.exports = { 
  3.   // ... 
  4.   devServer: { 
  5.     // 開啟 HMR 特性 
  6.     hot: true 
  7.     // hotOnly: true 
  8.   } 

通過上述這種配置,如果我們修改并保存css文件,確實能夠以不刷新的形式更新到頁面中

但是,當我們修改并保存js文件之后,頁面依舊自動刷新了,這里并沒有觸發熱模塊

所以,HMR并不像 Webpack 的其他特性一樣可以開箱即用,需要有一些額外的操作

我們需要去指定哪些模塊發生更新時進行HRM,如下代碼:

  1. if(module.hot){ 
  2.     module.hot.accept('./util.js',()=>{ 
  3.         console.log("util.js更新了"
  4.     }) 

二、實現原理

首先來看看一張圖,如下:

  • Webpack Compile:將 JS 源代碼編譯成 bundle.js
  • HMR Server:用來將熱更新的文件輸出給 HMR Runtime
  • Bundle Server:靜態資源文件服務器,提供文件訪問路徑
  • HMR Runtime:socket服務器,會被注入到瀏覽器,更新文件的變化
  • bundle.js:構建輸出的文件
  • 在HMR Runtime 和 HMR Server之間建立 websocket,即圖上4號線,用于實時更新文件變化

上面圖中,可以分成兩個階段:

  • 啟動階段為上圖 1 - 2 - A - B

在編寫未經過webpack打包的源代碼后,Webpack Compile 將源代碼和 HMR Runtime 一起編譯成 bundle文件,傳輸給Bundle Server 靜態資源服務器

  • 更新階段為上圖 1 - 2 - 3 - 4

當某一個文件或者模塊發生變化時,webpack監聽到文件變化對文件重新編譯打包,編譯生成唯一的hash值,這個hash值用來作為下一次熱更新的標識

根據變化的內容生成兩個補丁文件:manifest(包含了 hash 和 chundId,用來說明變化的內容)和chunk.js 模塊

由于socket服務器在HMR Runtime 和 HMR Server之間建立 websocket鏈接,當文件發生改動的時候,服務端會向瀏覽器推送一條消息,消息包含文件改動后生成的hash值,如下圖的h屬性,作為下一次熱更新的標識

在瀏覽器接受到這條消息之前,瀏覽器已經在上一次socket 消息中已經記住了此時的hash 標識,這時候我們會創建一個 ajax 去服務端請求獲取到變化內容的 manifest 文件

mainfest文件包含重新build生成的hash值,以及變化的模塊,對應上圖的c屬性

瀏覽器根據 manifest 文件獲取模塊變化的內容,從而觸發render流程,實現局部模塊更新

三、總結

關于webpack熱模塊更新的總結如下:

  • 通過webpack-dev-server創建兩個服務器:提供靜態資源的服務(express)和Socket服務
  • express server 負責直接提供靜態資源的服務(打包后的資源直接被瀏覽器請求和解析)
  • socket server 是一個 websocket 的長連接,雙方可以通信
  • 當 socket server 監聽到對應的模塊發生變化時,會生成兩個文件.json(manifest文件)和.js文件(update chunk)
  • 通過長連接,socket server 可以直接將這兩個文件主動發送給客戶端(瀏覽器)
  • 瀏覽器拿到兩個新的文件后,通過HMR runtime機制,加載這兩個文件,并且針對修改的模塊進行更新

參考文獻

  • https://zhuanlan.zhihu.com/p/138446061
  • https://github.com/Jocs/jocs.github.io/issues/15
  • https://juejin.cn/post/6844904134697549832
  • https://vue3js.cn/interview/

 

 

責任編輯:武曉燕 來源: JS每日一題
相關推薦

2021-05-08 08:35:33

Webpack前端性能

2024-11-19 15:13:02

2023-12-27 18:16:39

MVCC隔離級別幻讀

2025-04-16 00:00:01

JWT客戶端存儲加密令

2024-03-05 10:33:39

AOPSpring編程

2024-08-22 10:39:50

@Async注解代理

2024-07-31 08:28:37

DMAIOMMap

2024-12-06 07:00:00

2024-03-14 14:56:22

反射Java數據庫連接

2024-03-11 18:18:58

項目Spring線程池

2024-03-22 06:56:24

零拷貝技術數據傳輸數據拷貝

2024-09-20 08:36:43

零拷貝數據傳輸DMA

2021-05-20 08:34:03

CDN原理網絡

2023-12-19 09:24:22

LinuxBIOSUEFI

2022-06-24 06:43:57

線程池線程復用

2021-08-24 08:05:41

泛型類型擦除Class

2024-06-04 09:02:03

2025-02-28 00:00:00

2021-06-07 17:12:22

線程安全Atomic

2024-02-29 16:49:20

volatileJava并發編程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美4p| 久热国产精品视频 | 成人国产在线观看 | 欧美成人精品一区 | 美女黄网站视频免费 | 欧美黄色片在线观看 | 九九热精品免费 | 国产不卡视频 | 日韩视频一区二区 | 精品国产青草久久久久福利 | 超碰综合 | 国产一区二区视频在线 | 国产精品一区久久久 | 99国产精品视频免费观看一公开 | 亚洲精品v | 永久免费av| 国产日韩精品在线 | 成人综合一区 | 成人毛片视频免费 | 日本超碰 | 成人a免费| 日日摸夜夜添夜夜添精品视频 | 亚洲一区二区三区欧美 | 国产精品1区2区 | 国产高清在线 | 亚洲国产成人久久久 | 99爱国产| 国产综合av | 亚洲色图在线观看 | 在线国产小视频 | 国产欧美在线播放 | 日韩精品极品视频在线观看免费 | 在线视频一区二区 | 中文字幕一级 | av在线视 | 成人在线精品视频 | 草草影院ccyy| 中文二区 | 亚洲欧美综合精品久久成人 | 五月激情综合网 | 男人久久天堂 |