🔥 Webpack 热更新(HMR)原理详解

📌 本文适用于 Vue、React 等使用 Webpack 的项目开发者,适配 Vue CLI / 自定义 Webpack 项目。


🎯 一、什么是 HMR?

Hot Module Replacement 是 Webpack 提供的一种机制,使得浏览器在不刷新页面的前提下,只替换发生变化的模块代码

它能做到的事:

  • 修改 JS / CSS / Vue 文件时 页面不刷新
  • 保持组件状态(如表单输入、滚动位置)
  • 快速查看变更结果,极大提升开发效率

🧩 二、HMR 整体流程图

源码改动↓
Webpack 重新编译生成新模块↓
dev-server 通过 WebSocket 通知浏览器↓
浏览器下载更新模块↓
HMR runtime 应用新模块(替换/销毁旧模块)

⚙️ 三、核心模块组成

1️⃣ Webpack-dev-server(或 Vite 等 dev server)

  • 启动本地服务,监听源码变更
  • 内置 WebSocket 服务,用于通知客户端代码变化
  • 静态资源由内存提供,不写入磁盘(性能高)

2️⃣ WebSocket 通信

浏览器连接到 dev-server 的 WebSocket 地址(如 ws://localhost:8080/sockjs-node

当文件变动,Webpack 编译完成后,会通过 WebSocket 发送如下消息:

{"type": "update","assets": [{"id": "./src/App.vue","type": "js"}]
}

3️⃣ HMR Runtime(客户端逻辑)

Webpack 构建时注入的 HMR Runtime 在浏览器中运行,主要做:

  • 接收更新消息
  • 下载新的模块代码(chunk)
  • 执行模块的 acceptdispose 等钩子
  • 更新页面 DOM 或组件状态

💡 四、源码级更新过程(详解)

以 Vue 项目为例(vue-loader + webpack-dev-server):

  1. 开发者修改了 App.vue
  2. webpack-dev-server 监听到文件变动,触发 Webpack 编译
  3. Webpack 编译出新的模块 App.vue?vue&type=template
  4. webpack-dev-middleware 把变更信息推送给浏览器
  5. 浏览器 HMR 客户端接收到变更,通过 JSONP 请求拉取更新模块
  6. 模块执行 module.hot.accept() 回调,组件重渲染,但状态保留

🧪 五、HMR 接口示例(Node API)

if (module.hot) {module.hot.accept('./math.js', function () {console.log('math.js 模块更新了!')})module.hot.dispose(() => {console.log('清理旧模块资源')})
}

🧱 六、HMR 与普通 Live Reload 的区别

特性HMRLive Reload(全刷新)
刷新页面❌ 不刷新✅ 整页刷新
状态是否丢失❌ 状态保留(如表单输入)✅ 状态丢失
应用速度⚡ 快速(只替换模块)🐢 慢(页面重新加载)
用途JS/CSS/Vue 组件等模块级更新HTML 等非模块文件的更新

🧰 七、常见问题与解决方案

❓ 为什么我的项目没热更新?

  • ✅ 是否使用了 webpack-dev-servervite
  • devServer.hot = true 是否开启?
  • ✅ 是否在代码中正确使用了 module.hot.accept()
  • ✅ 使用了不支持 HMR 的插件(如某些 CSS 插件)?

🔧 八、HMR 配置示例(webpack.config.js)

const webpack = require('webpack')module.exports = {mode: 'development',devServer: {hot: true, // 启用 HMRstatic: './dist',},plugins: [new webpack.HotModuleReplacementPlugin()]
}

Vue CLI、Create React App 等已默认配置好 HMR


🧠 九、在框架中的实现(Vue / React)

Vue 中的 HMR(vue-loader 实现)

// App.vue
export default {name: 'App',mounted() {console.log('App Mounted')}
}if (import.meta.hot) {import.meta.hot.accept((newModule) => {console.log('模块更新!', newModule)})
}

React 中的 HMR(react-refresh 实现)

import { hot } from 'react-hot-loader/root'
const App = () => <div>Hello</div>
export default hot(App)

✅ 十、总结

模块作用
webpack-dev-server启动服务 + WebSocket 通信
Webpack Runtime管理模块热更新逻辑,替换更新模块
HMR API提供 accept / dispose 等钩子
WebSocket 通道通知浏览器代码更新

热更新的真正威力在于:快速反馈 + 状态保留 + 节省时间,在现代前端开发中是不可或缺的一部分。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/86832.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/86832.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/86832.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL索引完全指南

一、索引是什么&#xff1f;为什么这么重要&#xff1f; 索引就像字典的目录 想象一下&#xff0c;你要在一本1000页的字典里找"程序员"这个词&#xff0c;你会怎么做&#xff1f; 没有目录&#xff1a;从第1页开始一页一页翻&#xff0c;可能要翻500页才能找到有…

学习使用dotnet-dump工具分析.net内存转储文件(2)

运行ShenNiusModularity项目&#xff0c;使用createdump工具dump完整的进程内存映射文件&#xff0c;然后运行dotnet-dump analyze命令加载dump文件。   可以先使用dumpheap命令显示有关垃圾回收堆的信息和有关对象的收集统计信息。dumpheap支持多类参数&#xff08;如下所示…

Oracle BIEE 交互示例(一)同一分析内

Oracle BIEE 交互示例(一)同一分析内 1 示例背景2 实践目标3 实操步骤3.1 创建数据集3.1.1 TEST_TABLE3.1.2 保存名字为【01 TEST_TABLE】3.2 创建分析3.2.1 创建列3.2.2 创建视图3.2.2.1 数据透视表3.2.2.2 图形3.2.2.3 表3.3 设置交互4 结果示例1 示例背景 版本:OBIEE 12…

使用API有效率地管理Dynadot域名,出售账户中的域名

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

Vite 打包原理详解 + Webpack 对比

&#x1f680; Vite 打包原理详解 Webpack 对比 &#x1f44b; 本文适合&#xff1a;Vite 使用者、Vue/React 工程师、希望搞清楚打包流程及与 Webpack 区别的开发者 &#x1f310; 技术背景&#xff1a;Vite 采用 ES Modules 原生浏览器能力驱动开发体验&#xff0c;Webpack…

区块链RWA(Real World Assets)系统开发全栈技术架构与落地实践指南

一、技术架构设计&#xff1a;分层架构与模块协同 1. 核心区块链层 区块链选型策略&#xff1a; 公链&#xff1a;以太坊主网&#xff08;安全性高&#xff0c;DeFi生态完备&#xff09; Polygon CDK&#xff08;Layer2定制化合规链&#xff0c;Gas费低至$0.003&#xff09;…

GBDT:梯度提升决策树——集成学习中的预测利器

核心定位&#xff1a;一种通过串行集成弱学习器&#xff08;决策树&#xff09;、以梯度下降方式逐步逼近目标函数的机器学习算法&#xff0c;在结构化数据预测任务中表现出色。 本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖…

Redis持久化机制深度解析:RDB与AOF全面指南

摘要 本文深入剖析Redis的持久化机制&#xff0c;全面讲解RDB和AOF两种持久化方式的原理、配置与应用场景。通过详细的操作步骤和原理分析&#xff0c;您将掌握如何配置Redis持久化策略&#xff0c;确保数据安全性与性能平衡。文章包含思维导图概览、命令实操演示、核心原理图…

CentOS7升级openssh10.0p2和openssl3.5.0详细操作步骤

背景 近期漏洞扫描时&#xff0c;发现有很多关于openssh的相关高危漏洞&#xff0c;因此需要升级openssh的版本 升级步骤 由于openssh和openssl的版本是需要相匹配的&#xff0c;这次计划将openssh升级至10.0p2版本&#xff0c;将openssl升级至3.5.0版本&#xff0c;都是目前…

fishbot随身系统安装nvidia显卡驱动

小鱼的fishbot是已经配置好的ubuntu22.04,我听说在预先配置系统时需要勾选安装第三方图形化软件&#xff0c;不然直接安装会有进不去图形化界面的风险&#xff0c;若没有勾选&#xff0c;建议使用其他安装方法&#xff0c;比如禁用系统自带的驱动那套安装流程 1.打开设置->关…

学习昇腾开发的第十天--ffmpeg推拉流

1、FFmpeg推流 注意&#xff1a;在推流之前先运行rtsp-simple-server&#xff08;mediamtx&#xff09; ./mediamtx 1.1 UDP推流 ffmpeg -re -i input.mp4 -c copy -f rtsp rtsp://127.0.0.1:8554/stream 1.2 TCP推流 ffmpeg -re -i input.mp4 -c copy -rtsp_transport t…

成为一名月薪 2 万的 web 安全工程师需要掌握哪些技能??

现在 web 安全工程师比较火&#xff0c;岗位比较稀缺&#xff0c;现在除了一些大公司对学历要求严格&#xff0c;其余公司看中的大部分是能力。 有个亲戚的儿子已经工作 2 年了……当初也是因为其他的行业要求比较高&#xff0c;所以才选择的 web 安全方向。 资料免费分享给你…

Pytorch8实现CNN卷积神经网络

CNN卷积神经网络 本章提供一个对CNN卷积网络的快速实现 全连接网络 VS 卷积网络 全连接神经网络之所以不太适合图像识别任务&#xff0c;主要有以下几个方面的问题&#xff1a; 参数数量太多 考虑一个输入10001000像素的图片(一百万像素&#xff0c;现在已经不能算大图了)&…

平地起高楼: 环境搭建

技术选型 本小册是采用纯前端的技术栈模拟实现小程序架构的系列文章&#xff0c;所以主要以前端技术栈为主&#xff0c;但是为了模拟一个App应用的效果&#xff0c;以及小程序包下载管理流程的实现&#xff0c;我们还是需要搭建一个基础的App应用。这里我们将选择 Tauri2.0 来…

langgraph学习2 - MCP编程

3中通信方式&#xff1a; 目前sse用的很少 3.开发mcp框架 主流框架2个&#xff1a; MCP skd 官方 Fast Mcp V2 &#xff0c;&#xff08;V1捐给MCP 官方&#xff09; 大模型如何识别用哪个tools&#xff0c; 以及如何使用tools&#xff1a;

CSS 与 JavaScript 加载优化

&#x1f4c4; CSS 与 JavaScript 加载优化指南&#xff1a;位置、阻塞与性能 让你的网页飞起来&#xff01;&#x1f680; 本文详细解析 CSS 和 JavaScript 标签的放置位置如何影响页面性能&#xff0c;涵盖阻塞原理、浏览器机制和最佳实践。掌握这些知识可显著提升用户体验…

WSL安装发行版上安装podman

WSL安装发行版上安装podman 1.WSL拉取发行版1.1 拉取2.2.修改系统拉取的镜像&#xff0c;可以加速软件包的更新 2.podman安装2.1.安装podman 容器工具2.2.配置podman的镜像仓库2.3.拉取n8n镜像并创建容器 本文在windows11上&#xff0c;使用WSL拉取并创建ubuntu24.04虚拟机&…

Excel 常用快捷键与对应 VBA 方法/属性清单

功能描述快捷键VBA 对应方法/属性 (核心逻辑)说明导航 (类似 End 方向键)这些是 End 键行为的直接对应向下到连续区域末尾Ctrl ↓ActiveCell.End(xlDown)从当前单元格向下&#xff0c;遇到第一个空单元格停止。向上到连续区域开头Ctrl ↑ActiveCell.End(xlUp)从当前单元格向上…

计算机组成原理与体系结构-实验四 微程序控制器 (Proteus 8.15)

一、实验目的 1、理解“微程序”设计思想&#xff0c;了解“指令-微指令-微命令”的微程序结构。 2、掌握微程序控制器的结构和设计方法。 二、实验内容 设计一个“最简版本”的 CPU 模型机&#xff1a;利用时序发生器来产生 CPU 的预定时序&#xff0c;通过微程序控制器的自…

安卓端某音乐类 APP 逆向分享(二)协议分析

以歌曲搜索协议为例&#xff0c;查看charles中歌曲搜索协议详情 拷贝出搜索协议的Curl形式 curl -H Host: interface3.music.xxx.com -H Cookie: EVNSM1.0.0; NMCIDoufhty.1667355455436.01.4; versioncode8008050; buildver221010200836; resolution2392x1440; deviceIdYDwXa…