云哥说一下这个问题怎么回答好
场景
新的需求不是上线了,怎么用户看到的还是老的页面呀
开发:让用户刷新一下页面,或者清一下缓存
老板:那我得告诉用户,刷新一下页面,或者清一下缓存,才能看到新的页面,感觉用户体验不好
开发:可以解决
思考问题为什么产生
项目一般都是基于vue 或 react的spa应用,通过nginx代理静态资源,配置了index.html协商缓存,js、css等静态文件Cache-Control,按正常重新部署后, 用户重新访问系统,已经是最新的页面。
但是绝大部份用户都是访问页面之后一直停留在此页面,这时候部署后,用户就无法看到新的页面,需要用户刷新页面。
产生问题
- 如果后端接口有更新,重新部署后,用户访问老的页面,可能会导致接口报错。
- 如果部署后,用户访问老的页面,可能无法看到新的页面,需要用户刷新页面,用户体验不好。
- 出现线上bug,修复完后,用户依旧访问老的页面,仍会遇到bug。
常见的解决方案(性能问题很大,并且容易出错,实际并不好用)
- 前后端配合解决
- WebSocket (持久连接)
- SSE(Server-Send-Event) (持久连接)
- 纯前端方案;
- 轮询html Etag/Last-Modified
效果好,性能好,又简单的解决方案
通过自定义响应字段来判断
每次上线新版本,后端加一下自定义响应字段比如: X-App-Version "1.0.0";,然后前端每次请求都会带上,如果某次带的和返回的不一致就是有更新,提示用户刷新。
这种方案简单,性能又好,又不容易出错
具体的操作方法
1.后端实现
后端在响应头中添加了自定义字段 X-App-Version。
add_header X-App-Version "1.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('有新的版本可用,请刷新页面以应用最新更新!');
}
这样就好了,就这么简单好用,还不容易出错。
海云前端 提供1对1简历面试辅导,前端私教课(0基础培训),语音咨询,模拟面试,前端项目难点笔记