场景
新的需求上线了,怎么用户看到的还是老的页面
开发:让用户刷新一下页面,或者清一下缓存
老板:那我得告诉用户,刷新一下页面,或者清一下缓存,才能看到新的页面,感觉用户体验不好
开发:可以解决
产生问题
1、如果后端接口有更新,重新部署后,用户访问老的页面,可能会导致接口报错。
2、如果部署后,用户访问老的页面,可能无法看到新的页面,需要用户刷新页面,用户体验不好。
3、出现线上bug,修复完后,用户依旧访问老的页面,仍会遇到bug。
实现麻烦
效果好,性能好,又简单的解决方案
使用版本号控制
后端接口维护前端版本号
:后端接口可以维护一个前端发布的版本号,前端在每次请求时带上当前版本号作为请求头(header)。后端识别请求头中的版本号与当前版本是否一致,如果不一致,则重定向刷新页面或返回一个特定状态码,前端拦截该状态码后处理刷新。
动态生成版本号文件
:在编译项目时动态生成一个包含版本号的文件(如version.json),前端通过轮询该文件来检查版本号是否有更新。一旦检测到新版本,就通知用户刷新页面。这种方法可以与前端框架(如Vue、React)结合使用,实现自动化和定制化。
通过自定义响应字段来判断
每次上线新版本,后端加
一下自定义响应字段
比如: X-App-Version “2.0.0”;,然后前端每次请求都会带上,如果某次带的和返回的不一致就是有更新,提示用户刷新。 这种方案简单,性能又好,又不容易出错
具体的操作方法
1、后端实现后端在响应头中添加了自定义字段X-App-Version。add_header X-App-Version “2.0.0”;
2、前端实现拦截器设置
首先前端设置一个版本号
,并在 Axios 的请求拦截器
里面,在每次发送请求时都带上当前前端应用的版本号作为请求头
,并且设置响应拦截器以处理返回的 X-App-Version(版本)。
比较前端设置的版本号与后端返回的版本号是否相同
版本号不一致就弹出弹框,比如模态框、Toast 通知或者其他 UI 组件,同时提供“立即刷新”
按钮让用户主动点击触发刷新
动作。
import axios from 'axios';
// 设置默认请求头,包括应用版本号const appVersion = '1.0.0';
// 应该从环境变量或构建过程中获取实际版本号
axios.defaults.headers.common['X-App-Version'] = appVersion;
// 创建一个响应拦截器
axios.interceptors.response.use( response => { const serverVersion = response.headers['x-app-version']; if (serverVersion && serverVersion !== appVersion) {
// 版本不一致,触发更新提示逻辑
promptUserToUpdate(); } return response; }, error => Promise.reject(error));function promptUserToUpdate() {
// 实现提示用户的逻辑,比如弹出一个对话框或通知,或者显示一个弹窗组件让用户点击刷新 alert('有新的版本可用,请刷新页面以应用最新更新!');}