【Vite原理】之热更新原理

大家好我是蜗牛,热衷于用大白话讲解复杂的知识,让新手也能很好的接受。

上一篇文章我们介绍了 Vite 的工作原理,是如何快速实现项目构建的 # 面试官:"Vite为什么快?",在明白了 Vite 的构建原理之后我们再来细聊一下,Vite 中的热更新是如何实现的

1. 热更新思想

热更新的效果是当整个项目中任何一处代码有变更时,浏览器在不需要手动刷新的情况下,就能自动更新页面,这种效果听起来很简单,实现起来呢?其实也简单

主要的思想就是,只要有代码变更,我 Vite 服务端就要想办法主动通知浏览器,或者说,主动将变更内容发送给浏览器,诶?浏览器不发请求,服务端主动通知?这不就是 WebSocket 嘛!!!

所以核心思路更清晰了,项目代码变更,只要有办法感知到代码变更了,直接 WebSocket 推送给浏览器就好了。可是怎么感知到代码变更呢? chokidar库刚好实现这个效果

2. 实现过程

Vite 服务端:

  1. 安装 ws 和 chokidar

    npm i ws
    npm i chokidar

  2. 创建 socket 连接

javascript 复制代码
const WebSocket = require('ws');
const wss = new WebSocket.Server({ server });  // server 部分代码省略了

wss.on('connection', (ws) => {
  // 在客户端连接时执行的代码
  console.log('Client connected');

  // 在连接关闭时执行的代码
  ws.on('close', () => {
    console.log('Client disconnected');
  });
});
  1. 增加 chokidar 监听全局文件
javascript 复制代码
const WebSocket = require('ws');
const wss = new WebSocket.Server({ server });
const chokidar = require('chokidar');

wss.on('connection', (ws) => {
  // 在客户端连接时执行的代码
  console.log('Client connected');

  // 在连接关闭时执行的代码
  ws.on('close', () => {
    console.log('Client disconnected');
  });
});


const watcher = chokidar.watch('.', {
  ignored: ['**/node_modules/**', '**/.git/**'],
  persistent: true, // 持久监听
});

watcher.on('change', (path) => {
  // 发送热更新通知给所有连接的客户端
  wss.clients.forEach((client) => {
    if (client.readyState === WebSocket.OPEN) {
      client.send('update');
    }
  });
});
  1. 客户端 index.html 增加 socket 连接
xml 复制代码
<!doctype html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Vite + Vue</title>
</head>

<body>
  <div id="app"></div>

  <script>
    const socket = new WebSocket("ws://localhost:8080");

    socket.addEventListener("open", function (event) {
      socket.send("Hello Server!");
    });

    socket.addEventListener("message", function (event) {
      console.log("Message from server ", event.data);
      window.location.reload() // 接收到后端的推送后直接刷新页面
    });


    window.process = {
      env: {
        NODE_ENV: 'dev'
      }
    }

  </script>
  <script type="module" src="/src/main.js"></script>
</body>

</html>

如此一来便实现了前后端的 socket 的连接,当 chokidar 监听到文件变更时,客户端会接收到一个 'update' 通知,客户端直接做刷新页面的操作

3. 优化客户端代码

客户端的 index.html 被我们 写入了过多的代码,这些在官方的 Vite 中都是不存在的,我们修改 simple-vite.js 中的部分代码代码

这里就不展示热更新的效果了,最后效果是正常的!

4. 总结一下

我们这里写的代码是一个热更新的核心原理,源码要考虑的细枝末节更多,总体来说,Vite 中的热更新,就是借助 WebSocket 建立前后端的连接,通过类似于 chokidar 这样的文件监听的库来实时监听整个项目中的所有文件资源,当有资源发生变更的时候就向客户端推送一个更新通知,客户端做刷新项目的操作。

完整代码在这里

相关推荐
NeilCarmack15 分钟前
Deepseek-harness增加桌面版端序列:第 2 讲 · spawn Electron:当前进程如何“交棒“
前端·javascript·electron
上海魁鲸科技有限公司1 小时前
APS高级排产系统到底有什么用?一文讲清功能、选型与落地建议
前端·microsoft·excel
陈随易1 小时前
Bun v1.4 更新总结:把浏览器、图片、定时任务和工程工具都装进一个运行时
前端·后端·程序员
东风破_2 小时前
TypeScript 高级类型进阶:keyof、Exclude、Record 与类型组合思想
前端·后端·typescript
DS随心转插件3 小时前
Grok生成的html怎么导出——AI导出鸭:大模型结构化输出的“最后一公里”工程化解构
前端·人工智能·ai·html·豆包·deepseek·ai导出鸭
এ慕ོ冬℘゜3 小时前
使用 jQuery 动态渲染表格与状态切换
前端·javascript·jquery
人间凡尔赛4 小时前
2026 前端必修:4 个让 CSS 脱胎换骨的现代新特性(附实战代码)
前端·css
用户2181697049304 小时前
Flutter (二十) 轮播图
前端
前端snow4 小时前
ai agent - RAG 汇总
前端
计算机魔术师4 小时前
AI为拿高分不惜入侵网站:22个模型作弊审计,真相让人背脊发凉
前端