vite hmr项目热更新配置(解决配置完刷新页面不生效)

6,766 阅读3分钟

热更新配置

我们知道,热更新就是实时更新应用程序的变化,使得开发者能够在修改代码后立即看到结果,无需手动刷新浏览器。通常在各种项目中,配置热更新会让开发更高效快速。

vue3+vite项目中的热更是这样配置的。

vite-config-ts中设置热更新:

server: {
    host: 'localhost',
    hmr: true
}

改完代码保存后,重新断开跑一下才会生效。


hmr

是什么

hmr (hot module replacement) 热模块替换。这个hmr功能能够在我们修改代码后,自动将更新的模块代码注入到运行中的应用程序,以便我们立即看到修改后的效果,而无需手动刷新页面。

原理

1、模块热替换: 当我们修改一个模块的代码时,vite会在构建的过程中生成一个独立的模块标识符。这个标识符可以唯一地识别一个模块。当你保存代码并触发重新构建时,vite会生成一个新的模块标识符,并与之前的标识符进行比较,以确定哪些模块发生了变化。

2、更新模块:一旦vite确定了发生变化的模块,它将会使用新的模块代码替换原有的模块,而无需完全重新加载整个应用程序。这样,只有受影响的模块会被更新,而其他模块将保持不变。这个过程是在运行时进行的,所以我们可以立即看到修改后的效果,而无需刷新浏览器。

3、保持应用程序状态:为了保持应用程序的状态和上下文,vite的hmr功能会尽力保留当前应用程序的状态。当模块发生变化时,vite会尝试将旧模块的状态应用到新模块上,以保证代码变更时不会丢失已有的数据或状态。

怎么实现的

大致流程:就是vite server监听到文件变化,通过websocketvite client发送通知,client根据通知内容解析,发起http请求获取更新后的文件,然后进行局部更新页面。

vite的代码目录结构:

image.png

src下面有两个文件夹clientnode

node

开发时vite dev启动项目,其中也就是启动了一个node服务,当中有两个功能与hmr相关:

  • 监听项目文件变化
  • 启动websocket服务,向客户端主动推送消息

client

项目中有入口index.html文件,在实际请求时返回的html内容和实际在项目中写的内容并不相同:

<script type="module" src="/@vite/client"></script>

vite通过这种方式向我们的代码中注入vite client,当中有两个功能与hmr相关:

  • 监听websocket消息,解析后发起文件请求
  • 执行import.meta.hot中定义的钩子函数

npm create vue@latestnpm init @vitejs/app创建的项目是自动处理的,无需编写额外的代码来启用hmr功能(自带开箱即用的模块热更新hmr支持)。

vite构建的项目中,默认情况下是启用了热模块更新饿。如果需要修改hmr相关配置,可以在vite的配置文件中(vite.config.js)中,对server.hmr进行配置。

如果需要禁用hmr:server: { hmr: false}

如果修改连接超时: server: { hmr: { timeout: 30000, overlay: false } }