放肆青春的博客
首页
前端
算法
网络
面试
技术
后端
运维
杂项
数据库
工具
网址
电脑
个人
文章
  • 分类
  • 标签
  • 归档
github (opens new window)
gitee (opens new window)

放肆青春

一个前端菜鸟的技术成长之路
首页
前端
算法
网络
面试
技术
后端
运维
杂项
数据库
工具
网址
电脑
个人
文章
  • 分类
  • 标签
  • 归档
github (opens new window)
gitee (opens new window)
  • 前端

    • 前端 概览
    • 前端汇总

    • front 博文

    • front 项目总结

    • front 高级

    • front tools

      • 打包,构建工具
      • webpack

        • webpack
        • webpack知识点
        • webpack hash哈希值
        • webpack loader
        • webpack 插件
        • webpack热更新原理
          • webpack 热更新原理
            • webpack 热更新原理
            • 相关知识点
        • webpack原理
        • webpack版本
      • vite
      • rollup
      • grunt
      • yeoman
      • babel
      • gulp
      • lerna
  • vue

    • vue 概览
    • vue 汇总

    • vue 博文

    • vue 项目总结

    • vue 高级

  • html

    • html 概览
    • html 汇总

    • html 博文

  • css

    • css 概览
    • css 汇总

    • css 博文

    • sass

    • less

  • js

    • javascript 概览
    • JS 汇总

    • ES6

    • JS 博文

    • JS 工具

  • node

    • node 概览
    • node 汇总

    • node 框架

    • node 博文

  • react

    • react 概览
    • react 汇总

    • react 博文

    • react 高级

  • 微信小程序

    • 微信小程序 概览
    • 微信小程序总结
    • 微信小程序文章
    • 微信小程序 博文

    • 微信小程序 高级

  • 微信公众号

    • 微信公众号 概览
    • 微信公众号总结
    • 微信公众号文章
  • 多端开发

    • 多端开发
    • dsbridge 概览
    • jsbridge 概览
    • webview
    • uniapp

      • uniapp 概览
    • taro

      • taro 概览
    • flutter

      • flutter 概览
      • flutter 环境搭建
    • electron

      • electron 概览
  • front
放肆青春
2021-12-13

webpack热更新原理

# webpack 热更新原理

简答:

大概流程是我们用 webpack-dev-server 启动一个服务之后,浏览器和服务端是通过 websocket 进行长连接,webpack 内部实现的 watch 就会监听文件修改,只要有修改就 webpack 会重新打包编译到内存中,然后 webpack-dev-server 依赖中间件 webpack-dev-middleware 和 webpack 之间进行交互,每次热更新都会请求一个携带 hash 值的 json 文件和一个 js,websocket 传递的也是 hash 值,内部机制通过 hash 值检查进行热更新,

# webpack 热更新原理

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

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

  3. socket server 是一个 websocket 的长连接,可以建立本地服务和浏览器的双向通信。当本地文件发生变化时,服务器会立马告知浏览器热更新代码。

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

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

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

# 相关知识点

webpack-dev-server:只负责启动服务和前置准备工作

webpack-dev-middleware:所有文件相关的操作都抽离至此,主要是本地文件的编译和输出以及监听

代码改动(生成了一个 Hash 和两个文件):

每次修改代码,紧接着触发重新编译,然后浏览器就会发出 2 次请求。请求的便是本次新生成的 2 个文件。如下:

  1. 新的 Hash 值(Hash 值代表每一次编译的标识,本次输出的 Hash 值会被作为下次热更新的标识。):a61bdd6e82294ed06fa3

  2. 新的 JSON 文件(上次输出的 Hash 值会作为本次编译新生成的文件标识): a93fd735d02d98633356.hot-update.json

JSON 文件返回的结果对象中:

h 表示本次新生成的 Hash 值,用于下次文件热更新请求的前缀

c 表示当前要热更新的文件对应的是 index 模块

  1. 新的 JS 文件(上次输出的 Hash 值会作为本次编译新生成的文件标识):index.a93fd735d02d98633356.hot-update.js

JS 文件为本次修改的代码

如果没有任何代码改动:

  1. 新的 Hash 值:d2e4208eca62aa1c5389

  2. 新的 JSON 文件:a61bdd6e82294ed06fa3.hot-update.json

更新时间: 2/17/2022, 2:59:48 PM
webpack 插件
webpack原理

← webpack 插件 webpack原理→

最近更新
01
前端权限管理
02-24
02
vue2指令
02-24
03
vue2 hook
02-24
更多文章>
Theme by Vdoing | Copyright © 2019-2022 放肆青春
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式