首页/文章/vite工具

Vite前端部署:版本更新,即刻知晓

2024-05-31
11864 分钟
...
  • 作者简介:大家好,我是文艺理科生Owen,某车企前端开发,负责AIGC+RAG项目
  • 目前在卷的技术方向:工程化系列,主要偏向最佳实践
  • 希望可以在评论区交流互动,感谢支持~~~

最近测试和用户频繁反馈,说经常会出现页面点不动了。然后每次都回复,刚发完版,刷新下就好了。但时间长了,就被怀疑是能力问题,因为其他项目为什么不这样呢?

先做一些准备工作,复盘一下当时的场景:

运行 pnpm create vite vue3-vite-router --template vue 在本地快速新建一个项目

进入项目目录中,运行pnpm i 安装依赖,安装成功后启动项目pnpm dev, 启动成功后运行 pnpm build进行打包。打包完成后根目录下会多出一个dist目录。运行 pnpm preview预览构建后的项目。

页面可以正常打开:

页面窗口保持不变(不进行刷新等其他操作)。在AboutView.vue文件中随便修改一点修改。再次运行打包pnpm build和预览 pnpm preview。在刚才的页面中点击 About 进行导航切换后,About页面对应的js文件请求失败了。

经过排查,是发版后js的文件名hash变了,原页面对应的html文件引用的js hash名称还是上一版本的,由于做了懒加载,所以点击跳转新页面时,对应的js文件不存在导致。懒加载的优化变成了事故,我冤枉啊~~~(我发誓:以后能跑起来绝对不优化)

为了证明自己的开发能力(掉发能力),针对vite项目调研了两种方案(纯前端方案,绝不麻烦后端):

翻看vite官方文档上发现了一个简单的办法:当vite加载动态导入失败时,会触发 vite:preloadError 事件。可以使用这个事件进行处理。

在main.js中增加以下代码:


window.addEventListener('vite:preloadError', (event) => {
  console.log('检测到有新版本,5秒后即将刷新...');
  setTimeout(() => {
    window.location.reload() 
    console.log('页面已更新为最新版本...');
  }, 5000)
})

先执行 pnpm buildpnpm preview,刷新页面。然后随意修改AboutView.vue的代码,重新执行 pnpm buildpnpm preview,点击About后,js请求异常,会触发vite:preloadError事件,然后执行回调中的刷新逻辑。

总结:这个方法比较简单,但是只能应用在路由切换的场景中。

还有一种场景是无路由切换时,代码未及时进行更新。对我们的项目来说,都是在晚上发布,如果有版本更新,运维同学会在群里及时同步测试和产品同学。如果需要解决,需要进行轮询操作。具体请参考:2种纯前端检测版本更新提示

目测最佳的时间方案为:

vite打包构建时生成版本号json文件,并将json文件保存到构建好的静态资源目录中。

路由变化时执行:对比json文件中的版本号与缓存中是否一致。若一致,则进行弹窗提示用户进行刷新。

相关代码参考了这篇文章:vite前端版本升级,刷新页面

  1. 新建一个vite插件,完成将发布版本的时间戳写入文件。代码如下:


import path from "path";
import fs from "fs";


const writeVersion = async (versionFile, content) => {
  fs.writeFile(versionFile, content, (err) => {
    if (err) throw err;
  });
};

export default (options) => {
  
  let configPath;
  return {
    name: "refreshVersion",
    configResolved(resolvedConfig) {
      
      configPath = resolvedConfig.publicDir;
    },
    async buildStart() {
      
      const file = configPath + path.sep + "version.json";
      
      const content = JSON.stringify({ version: options.version });
      if (fs.existsSync(configPath)) {
        
        writeVersion(file, content);
      } else {
        
        fs.mkdir(configPath, (err) => {
          if (err) throw err;
          writeVersion(file, content);
        });
      }
    },
  };
};
  1. vite配置文件中使用该插件,并在全局缓存版本时间戳,便于后续比对使用。代码如下:


import { fileURLToPath, URL } from 'node:url'

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import refreshPlugin from './src/plugins/refreshPlugin.js'
const now = new Date().getTime(); 



export default defineConfig({
  plugins: [
    vue(),
    
     refreshPlugin({
      version: now
    })
  ],
  resolve: {
    alias: {
      '@': fileURLToPath(new URL('./src', import.meta.url))
    }
  },
  
  define: {
    __APP_VERSION__: now,
  }
})
router/index.js




router.beforeEach(async (to, from, next) => {
  await versionCheck() 
  next()
});


const versionCheck = async () => {
  if (process.env.NODE_ENV === 'development') return
  const response = await axios.get('version.json')
  if (__APP_VERSION__ !== response.data.version) {
      
      console.log('有新版本,5秒后自动刷新页面');
      setTimeout(() => {
          window.location.reload()
      }, 5000)
  }
}

与第一种方案相同操作,先后运行两次 pnpm buildpnpm preview。结果显示,第二次build后,路由切换自动刷新完成。

总结:本文提出了vite项目中版本变化的刷新问题,通过监听vite异常事件事件维护比对发布版本时间戳两种方案,成功解决了自动刷新问题,并展示了demo相关代码和运行结果。

日拱一卒,功不唐捐。

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
vite工具2026-03-17
深度解析:NODE_ENV 与 Mode (模式)
在现代前端开发中,尤其是使用 Vite 、 Qwik 、 Next.js 等基于 Node.js 的构建工具时,开发者经常会被两个相似的概念绕晕: 和 Mode (模式) 。 它们看起来都在做同一件事:“区分开发环境和生产环境”。但实际上,它们在架构设计中扮演着截然不同却又紧密协作的角色。混淆这两者可能导致构建配置错误、环境变量加载失败,甚至生产环境泄露敏感信息。 一、核心定义:它们到底是什么? 1\. :行业通用的“运行时开关” 起源...
学习
vite工具2025-10-01
vite常用配置
目录 1\. 基础配置 1.1 项目初始化 1.2 基础 vite.config.js 配置 配置说明与最佳实践 插件配置 (plugins) 好处 : 插件系统是Vite的核心特性,提供了丰富的功能扩展能力 坏处 : 过多插件会增加构建时间,插件冲突可能导致构建失败 建议 : 只引入必要的插件,定期检查插件更新和兼容性 适用场景 : 所有Vite项目都需要根据技术栈选择合适的插件 开发服务器配置 (server) host: ‘0.0...
学习
vite工具2025-06-04
Vite 项目中使用 vite-plugin-dts 插件的详细指南
在现代前端开发中,TypeScript 的类型声明文件( )对于提供良好的开发体验和代码提示至关重要。如果你正在使用 Vite 构建一个库项目, 插件是一个非常有用的工具,它可以帮助你自动生成 文件。以下是如何在你的 Vite 项目中安装、配置和使用 插件的详细指南。 一、插件介绍 是一个用于在 Vite 的库模式下,从 或 源文件生成类型文件( )的插件。它能够帮助开发者在构建库时,自动生成类型声明文件,从而提高开发效率。 二、安装插...
学习
vite工具2025-03-11
vite项目打包build后提示说超过500k了
说可以通过配置build.rollupOptions.output.manualChunks来提升一下,好可以,我来配置一下,把那些可能大的包单独分配一下: 然后再看一下,是变小了,但是还是500警告啊: 那就开始分析是哪个包比较大吧,使用rollup plugin visualizer这个插件来分析一下,rollup plugin visualizer是一个开源项目,地址: 安装: 配置插件 在 文件中添加 插件的配置,如下: 构建完...
学习
vite工具2024-10-10
一次低端机 WebView 白屏的兼容之路
问题 项目:Vite4 + Vue3,APP WebView 项目 页面在 OPPO A5 手机上打不开,页面空白。 最开始是客户端在看,然后发现一个警告,大概也因为没看出什么问题,给到 Web 前端。 相关背景 为了方便描述过程的行为,先做一些相关背景的介绍。知道这些背景才能更好的了解问题的复杂。这些在解决问题的过程中始终是干扰因素,在反复调试试错的过程中才梳理总结出来,这里把它们列出来。 使用测试 App,其中有两个入口,一个是本地...
学习
vite工具2024-09-09
推荐工具vite-plugin-fake-server,可线上部署使用mockmock线上部署
最近遇到了个麻烦,后端迟迟给不了接口,测试那边又要求数据不能写死,必须可以提供mock调试。这不最近找到了一个mock工具,能解决传统mock工具无法线上部署的问题。 工具名字叫做 ,兼容vite,从官网示例上来看是同时支持 和 来模拟数据的。使用起来也非常简单,分三步走就行。 1. 安装 2. 引入 这里贴出最简单的配置,一个是制定文件夹,一个是设置在生产环境下模拟数据。 3. 使用 这里我根据个人习惯,在 文件夹下创建一个 和数个模...
学习

评论

请登录后发表评论

去登录
加载评论中...