Vite版本更新检查实现页面自动刷新的解决思路

作者:Naomi_233 时间:2024-04-27 16:17:07 

前端版本更新检查,实现页面自动刷新

使用vite对项目进行打包,对 js 和 css 文件使用了 chunkhash 进行了文件缓存控制,但是项目的index.html文件在版本频繁迭代更新时,会存在被浏览器缓存的情况。

在发版后,如果用户不强制刷新页面,浏览器会使用旧的index.html文件,在跳转页面时会向服务器端请求了上个版本 chunkhash 的 js 和 css 文件,但此时的文件已经在版本更新时已替换删除了,最终表现为页面卡顿,控制台报错 404。

解决思路

思路 1

服务器端发版时,上一个版本的assets内的文件不删除。

缺点是会随着频繁发版,服务器端前端项目文件会越来越多,浪费空间;若旧页面的接口涉及到参数改动等,会引起报错;流水线使用 docker 打包部署会变得非常麻烦。

思路 2

在每次打包生产代码时,在public下生成一个version.json版本信息文件,页面跳转时请求服务器端的version.json中的版本号和浏览器本地缓存的版本号进行对比,从而监控版本迭代更新,实现页面自动更新,获取新的index.html文件(前提是服务器端对index.html进行不缓存配置)。

1.首先应该禁止浏览器缓存index.htmlversion.json,这里实现nginx的不缓存处理

添加nginx配置

location ~ .*\.(htm|html|json)?$ {    expires -1;}

2.使用Vite 插件打包时自动生成版本信息

版本信息插件

// versionUpdatePlugin.js
const fs = require('fs')
const path = require('path')

const writeVersion = (versionFile, content) => {
 // 写入文件
 fs.writeFile(versionFile, content, (err) => {
   if (err) throw err
 })
}

export default (options) => {
 let config

return {
   name: 'version-update',

configResolved(resolvedConfig) {
     // 存储最终解析的配置
     config = resolvedConfig
   },

buildStart() {
     // 生成版本信息文件路径
     const file = config.publicDir + path.sep + 'version.json'
     // 这里使用编译时间作为版本信息
     const content = JSON.stringify({ version: options.version })

if (fs.existsSync(config.publicDir)) {
       writeVersion(file, content)
     } else {
       fs.mkdir(config.publicDir, (err) => {
         if (err) throw err
         writeVersion(file, content)
       })
     }
   },
 }
}

vite 配置文件

// vite.config.js
export default defineConfig((config) => {
 const now = new Date().getTime()
 return {
   ...
   define: {
     // 定义全局变量
     __APP_VERSION__: now,
   },
   plugins: [
     ...
     versionUpdatePlugin({
       version: now,
     }),
   ],
   ...
 }
})

3.路由跳转时,实时检测版本

检测到新版本自动刷新页面,应该使用前置守卫,在跳转失败报错前检测,跳转失败不会触发后置守卫

const router = useRouter()
// 这里在路由全局前置守卫中检查版本
router.beforeEach(async () => {
 await versionCheck()
})

// 版本监控
const versionCheck = async () => {
 if (import.meta.env === 'development') return
 const response = await axios.get('version.json')
 // eslint-disable-next-line no-undef
 if (__APP_VERSION__ !== response.data.version) {
   // eslint-disable-next-line no-undef
   ElMessage({
     message: '发现新内容,自动更新中...',
     type: 'success',
     showClose: true,
     duration: 1500,
     onClose: () => {
       window.location.reload()
     },
   })
 }
}

来源:https://blog.csdn.net/qwe134133987/article/details/127979312

标签:vite,页面,自动刷新
0
投稿

猜你喜欢

  • 对Python+opencv将图片生成视频的实例详解

    2022-01-03 08:42:16
  • python 统计列表中不同元素的数量方法

    2023-10-16 05:22:33
  • Python编程如何在递归函数中使用迭代器

    2023-08-04 11:20:24
  • 通过百度地图获取公交线路的站点坐标的js代码

    2024-04-18 09:28:14
  • Windows下Anaconda的安装和简单使用方法

    2022-04-21 16:46:50
  • Django开发中的日志输出的方法

    2023-02-24 07:37:17
  • python dataframe向下向上填充,fillna和ffill的方法

    2021-11-07 18:16:47
  • 轻松掌握执行一个安全的SQL Server安装

    2009-01-13 14:03:00
  • Python函数装饰器的使用教程

    2022-10-26 03:01:06
  • Web开发人员常用速查手册 英文集合推荐

    2023-03-27 22:22:03
  • Task List 管理任务JavaScript源码

    2010-01-22 15:43:00
  • php 伪造本地文件包含漏洞的代码

    2023-11-17 06:36:40
  • 如何在Access报表中每隔N行显示一条粗线

    2008-11-16 18:11:00
  • python绘制双Y轴折线图以及单Y轴双变量柱状图的实例

    2023-06-02 00:29:11
  • Python正则表达式实现截取成对括号的方法

    2023-08-22 23:01:47
  • Python 自动化表单提交实例代码

    2022-12-20 06:16:14
  • Python之批量创建文件的实例讲解

    2021-04-10 15:17:08
  • SQL 联合查询与XML解析实例详解

    2024-01-26 18:26:58
  • 长期使用中型Access数据库的一点经验

    2007-12-21 13:23:00
  • Flask路由尾部有没有斜杠有什么区别

    2021-03-17 12:00:58
  • asp之家 网络编程 m.aspxhome.com