当我们发布了新版本,例如后端接口有破坏性更新,若用户页面没有刷新,可能导致访问到旧接口,此时我们就需要在前端项目中实现版本更新检测主动引导用户进行更新
先看效果
一、配置vite
1. vite配置开启manifest
1 2 3 4 5
| export default { plugins:[Vue()], build: { manifest: true }, }
|
2. 构建项目
执行 pnpm build
命令后可以在 dist
目录中发现多出了文件 dist/.vite/manifest.json
,记录着项目文件映射,之后我们可以利用此文件来判断前端项目是否更新了。
当然也可以通过其他方式比如后端增加一个版本接口,手动控制是否需要更新等等。
二、编写更新文件
例如创建 src/hooks/version.ts
文件,并填入以下内容,其中注释部分可依据自己情况修改。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| import dayjs from 'dayjs' import { NButton } from 'naive-ui'
let timer: number | undefined
export const useVersionUpdateListener = (time = 5 * 60) => { if (timer !== undefined) { return } if (import.meta.env.PROD) { let indexJs: string timer = setInterval(() => { window.axios .request({ baseURL: '', url: `/.vite/manifest.json?t=${dayjs().valueOf()}`, }) .then(res => { let file try { file = res['index.html'].file } catch (_) { return } if (!indexJs) { indexJs = file } if (indexJs !== file) { clearInterval(timer) window.$notification.create({ content: '发现新版本,点击获取最新版本。', meta: ' ', action: () => h( NButton, { size: 'small', text: true, type: 'primary', onClick: () => { window.location.reload() }, }, { default: () => h('span', '刷新') }, ), }) } }) .catch(() => {}) }, time * 1000) } }
|
三、引用
在 App.vue
中引用即可
1 2 3 4 5
| onMounted(() => { useVersionUpdateListener()
})
|