前端面试:项目更新版本,前端如何通知用户刷新页面?

438 阅读3分钟

云哥说一下这个问题怎么回答好

场景

新的需求不是上线了,怎么用户看到的还是老的页面呀
开发:让用户刷新一下页面,或者清一下缓存
老板:那我得告诉用户,刷新一下页面,或者清一下缓存,才能看到新的页面,感觉用户体验不好
开发:可以解决

思考问题为什么产生

项目一般都是基于vue 或 react的spa应用,通过nginx代理静态资源,配置了index.html协商缓存,js、css等静态文件Cache-Control,按正常重新部署后, 用户重新访问系统,已经是最新的页面。

但是绝大部份用户都是访问页面之后一直停留在此页面,这时候部署后,用户就无法看到新的页面,需要用户刷新页面。

产生问题

  • 如果后端接口有更新,重新部署后,用户访问老的页面,可能会导致接口报错。
  • 如果部署后,用户访问老的页面,可能无法看到新的页面,需要用户刷新页面,用户体验不好。
  • 出现线上bug,修复完后,用户依旧访问老的页面,仍会遇到bug。

常见的解决方案(性能问题很大,并且容易出错,实际并不好用)

  1. 前后端配合解决
  • WebSocket (持久连接)
  • SSE(Server-Send-Event) (持久连接)
  1. 纯前端方案;
  • 轮询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基础培训),语音咨询,模拟面试,前端项目难点笔记