1.webpack热更新及原理

本文介绍了热模块替换(HMR)的概念,如何在Webpack中配置启用HMR,以及其实现原理,包括WebpackCompile、HMRServer、BundleServer和HMRRuntime的角色。重点讲解了HMR如何通过WebSocket在服务器和浏览器间传递更新文件,以实现无刷新更新模块。
摘要由CSDN通过智能技术生成

1.什么是热更新?

HMR全程Hot Module Replacement,可以理解为模块热替换,是指在应用程序运行过程中,替换、添加、删除模块,而无需刷新整个应用

2.相关配置

module.exports = {
  ...
  devServer: {
    host: "localhost",
    port: 3000,
    open: true,
    hot: true, // 开启HMR
    historyApiFallback: true, // 解决前端路由刷新404问题
  },
};

通过这样的配置,如果我们修改并保存css文件,能够以不刷新的形式更新到页面中,但是我们修改并保存js文件,页面依旧刷新,这里并没有触发热模块,所以HMR不像webpack其他特性一样可以开箱即用,需要一些额外的操作

我们需要指定哪些模块发生更新时进行HRM


if (module.hot) {
  module.hot.accept('./util.js', () => {
    console.log("util.js")
  })
}

3.实现原理

1.Webpack Compile:将JS源代码编译成bundle.js

2.HMR Server:将热更新的文件输出给HMR Runtime

3.Bundle Server:静态资源文件服务器,提供文件访问路径

4.HMR Runtime:socket服务器,会被注入到浏览器,更新文件变化

5.bundle.js:构建输出的文件

在HMR Runtime 和HMR Server之间建立websocket,即图上4号线,用于更新文件变化

启动阶段:1 -> 2 -> A -> B

更新阶段:1 ->2 -> 3 -> 4

总结:

        通过webpack-dev-server创建两个服务器:提供静态资源服务(express)和Socket服务

        express服务负责直接提供静态资源服务(打包后的资源直接被浏览器请求和解析)

        socket server 是一个websocket的长连接,双方可以通信

        当socket server 监听到对应的模块发生变化时,会生成两个文件.json(mainfest文件)和.js文件(update chunk)

        通过长连接,socket server 可以直接将两个文件主动发送给客户端(浏览器)

        浏览器拿到这两个文件后,通过HMR runtime机制,加载这两个文件,并且对修改的模块进行更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值