发版提示
- 1、打包的时候,增加版本json的文件
- 在public目录下放一个version.json文件,每次构建的时候更新里面的版本号
- 可以编写一个插件,在构建生成后,自动生成一个version.json文件到dist目录
- 2、根据script src的hash值去判断
利用插件
- @plugin-web-update-notification
- 原理
- 以git commit hash作为版本号,并将version写入json文件中。客户端轮询服务器的版本,与本地的进行比较,如果不相同,则通知用户刷新页面
- 原理
手动实现
- 1、创建版本插件
vite-plugin-version.js
// vite-plugin-version.js
import { writeFileSync } from 'fs'
export default function (version = Date.now()) {
return {
name: 'vite-plugin-version',
buildStart() {
writeFileSync('public/version.json', JSON.stringify({ version }))
}
}
}
- 2、配置Vite
// vite.config.js
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import versionPlugin from './vite-plugin-version'
export default defineConfig({
plugins: [vue(), versionPlugin()],
})
- 3、版本检查工具类
src/utils/version.js
let localVersion = localStorage.getItem('app_version')
export const checkVersion = async () => {
try {
// 加随机参数防止缓存
const res = await fetch('/version.json?t=' + Date.now())
const { version } = await res.json()
if (localVersion !== version) {
const confirm = window.confirm('发现新版本,立即刷新体验?')
if (confirm) {
localStorage.setItem('app_version', version)
window.location.reload()
}
}
} catch (e) {
console.error('版本检查失败:', e)
}
}
- 4、全局检测逻辑
- 在入口文件
main.js添加定时检查:
- 在入口文件
// main.js
import { createApp } from 'vue'
import App from './App.vue'
import { checkVersion } from './utils/version'
const app = createApp(App)
app.mount('#app')
// 每5分钟检查一次版本
setInterval(checkVersion, 300000)
- 5、路由跳转时检测
在路由守卫中添加检查:
// router.js
import { createRouter } from 'vue-router'
import { checkVersion } from './utils/version'
const router = createRouter({...})
router.afterEach(() => {
checkVersion() // 每次路由跳转后检查 [[1]]
})
缓存问题
- 服务器端配置,禁止缓存 version.json、index.html
本地持久化存储版本号
-
页面刷新后会丢失,导致重复检测
-
避免重复提示(用户已刷新后不再提示)
-
首次访问,一般来说,不需要通知用户刷新页面,首次访问就是最新的页面
- 增加判断,如果本地没有版本号,就不需要提示用户
// 首次访问初始化
if (!localVersion) {
localStorage.setItem('app_version', newInfo.hash)
return
}
版本号生成
- 构建时间与文件内容无直接关联,比如有些情况构建了,但是文件没有发生变化,其实不需要提示用户更新,这个时候就有问题
- 服务器时间与本地时间可能存在偏差的时候
正确版本号生产方案:
- git commit hash
- 使用文件内容生成哈希
考虑注意问题
- 需要处理生产环境的判断,避免在开发环境触发检测
- 可通过import.meta.env判断
- 定时器的清理,避免内存泄漏
- 应用页面卸载时,清除定时器,如在App.vue
- 版本号生成,通过时间戳方式一定准确吗,可考虑git commit hash
- 缓存问题
- 使用随机查询参数避免缓存
- 添加本地持久化存储
- 使用 localStorage 记录版本号