记录一次老平台改造通知用户刷新页面,纯前端实现

记录一次老平台改造通知用户刷新页面,纯前端实现

  • 方案概述
    • 背景
    • 现状
    • 问题本质
  • 方案设计
    • 前提
    • 设计
    • 实现
  • 其他补充
  • 写在最后的话
  • 抛出一个问题

方案概述

背景

前端构建完上线,用户还停留还在老页面,用户不知道网页重新部署了,跳转页面的时候有时候js连接hash变了导致报错跳不过去,并且用户体验不到新功能。

客户打网页后,长时间不关闭对应标签页,也不刷新页面(在中后台管理项目挺常见的),且期间服务器页面有更新,经常出现

现状

目前我们或者合作商情况有如下几种情况:

  1. 目前路由hash模式,也就是锚点的形式,造成缓存问题;
  2. 在用户无感知的情况下升级平台,而用户因历史访问,无法获取最新的资源,造成用户体验差;
  3. 升级平台后,可能出现资源访问不到情况;

在现有的平台体系中,由于现在平台架构趋于一个成熟的阶段,基于改动最小、影响最小的原则的情况下,来设计适合目前平台的一套合理的方案解决这些问题;

问题本质

目前平台采用的hash的模式处理,也就是我们常说的锚点的形式,改方式的和history的不同是,histroy 的每次url变化都会像后端服务器请求,会重载页面index.html,这就是单页面history 需要在服务器上配置重定向到index.html的原因;而我们平台使用hash的形式,这种形式,只有在首次加载或者刷新页面的时候会重新请求服务器的index.html,相应的资源在这种情况下才会加载新的资源,url 地址变换并不会向history一样请求服务器,而是前端自主完成,所以在第一次访问完成之后,主要的js已经加载啦,后面操作都是根据主js的相关解析,请求相应的资源!所以在这种情况更新系统 造成资源是旧的或者资源请求不到的情况!

方案设计

前提

基于目前的平台框架,一切改动不能脱离现有的框架,对现有的入侵最小,其他的项目直接复用。

设计

  1. 打包生成的目录生成相应的项目指纹信息,也就是表示,可以是版本号、时间戳、哈希值等等;
    在这里插入图片描述

  2. 路由钩子触发检测当前版本或者资源是否最新状态,来处理相应的逻辑,流程图如下
    在这里插入图片描述
    tips:上面流程有点改动,改成点击菜单触发,这个在生产环境上大量测试上的改动。

实现

  1. 编写rollup(vite)插件
    在这里插入图片描述

  2. vite打包改造,下面可以根据项目需要是否考虑加入,viite本身的打包模式,文件发生变动,打出来的文件名hash 会发生变化,未改动的文件还是之前的文件名格式
    在这里插入图片描述
    tips: 上面为了好看,当然也可以不改,默认输出的就是带hash的js文件;

  3. 路由钩子处理 菜单上点击菜单处理
    在这里插入图片描述

tips: 为啥没有放到钩子里面处理,是因为点击菜单会有请求资源直接报错啦,不会走钩子,所以无法触发更新的接口,当然可以放到离开的钩子上处理,目前用的保守做法,点击前置触发。

  1. 服务器Nginx上配置,红色部分是为了重载index.html禁止缓存这个html信息

通过 nginx ,禁用缓存:
在这里插入图片描述

# nginx.conf
location / {root html;root /Volumes/wanglaibin/work/vite-project/distindex index.html index.htm;if ( $uri = '/index.html' ) { # disabled index.html cacheadd_header Cache-Control "no-cache, no-store, must-revalidate";}try_files $uri $uri/ /index.html;
}

直接通过 html meta 标签禁用缓存:

<!DOCTYPE html>
<html lang="en">
<head><meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /><meta http-equiv="Pragma" content="no-cache" /><meta http-equiv="Expires" content="0" /></head>
</html>

其他补充

浏览器放大缩小,tab页激活触发

	document.addEventListener('visibilitychange', async () => {if (document.visibilityState === 'visible') {console.log('当前会话被激活')await versionCheck()console.log('当前会话被激活-end')}})

浏览器聚焦触发

  window.addEventListener('focus', async() => {console.log('当前会话成为焦点')await versionCheck()console.log('当前会话成为焦点-end')})

浏览器js资源加载失败

	window.addEventListener('error', async (err) => {const errTagName = (err?.target as any)?.tagNameif (errTagName === 'SCRIPT'){console.log('js 资源加载失败')await versionCheck()console.log('js 资源加载失败-end')}},true)

写在最后的话

其实具体到项目场景更为复杂,所以我们都是从问题入手、排查、方案等处理方式,不同的项目不同的处理方式,当然目前的对于当前来说更好的!当然可能过几个月就不一定啦!

抛出一个问题

其他我们平台还有比较棘手,目前已经处理,在测试过程中。我可以跟你们描述下问题就是可以一个浏览器多个tab可以登陆不同的账号,也可以登陆相同的账号,不同的账号不同的token,相同的账号也是不同的token 但是这些token写到session里面,页面内部也可以新开tab,内部新开的tab是相同的token,系统也要有一个token续期的功能,系统内部新开的tab 保证token同步不能失效,系统内部两个token ,一个接口token,一个刷新token,要用刷新token在失效前换取新的token之后同步到系统内部新开的tab中,但是但不能影响其他的账号登陆以及相同账号登陆的token。

或许为啥这样设计,没办法历史原因,现在就是后端不动,前端做token续期。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/63371.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【WRF理论第十三期】详细介绍 Registry 的作用、结构和内容

目录 1. Introduction&#xff1a;介绍 Registry 的作用和功能。2. Registry Contents&#xff1a;详细描述 Registry 的结构和内容&#xff0c;包括各个部分的条目类型。2.1. DIMSPEC ENTRIES&#xff08;维度规格条目&#xff09;2.2. STATE ENTRIES&#xff08;状态变量条目…

微信小程序提交测试版,但是扫描体验版的二维码 显示 页面不存在

检查路径首页是否和我们微信小程序中的首页路径一致。 显然我的不一致。 {"pagePath": "pages/index/index","text": "产品","iconPath": "icons/Group 450.png","selectedIconPath": "/icons/组 …

GitToolBox插件:让IntelliJ IDEA的Git操作如虎添翼

GitToolBox插件介绍 GitToolBox是一款针对IntelliJ IDEA的插件&#xff0c;旨在增强IDE内置的Git功能&#xff0c;使Git操作更加便捷和高效。无论是单独开发者还是团队中的一员&#xff0c;这个插件都能帮助更好地管理代码和协作流程。 功能特点 分支管理&#xff1a;GitToolBo…

聚合支付系统/官方个人免签系统/三方支付系统稳定安全高并发 附教程

聚合支付系统/官方个人免签系统/三方支付系统稳定安全高并发 附教程 系统采用FastAdmin框架独立全新开发&#xff0c;安全稳定,系统支持代理、商户、码商等业务逻辑。 针对最近一些JD&#xff0c;TB等业务定制&#xff0c;子账号业务逻辑API 非常详细&#xff0c;方便内置…

Artec Leo 3D扫描仪 革新家具行业的数字化展示【沪敖3D】

随着科技的飞速进步&#xff0c;三维扫描技术已被广泛应用于包括家居行业在内的多个行业。面对现代消费者对家居产品日益增长的个性化和多样化需求&#xff0c;传统的家居设计和展示方法已难以满足市场需求。三维扫描技术的出现&#xff0c;为家居行业带来了新的发展机遇&#…

解决el-select数据量过大的3种方法

在准备上线的后台管理系统中&#xff0c;我们发现有两个下拉框&#xff08;select&#xff09;&#xff0c;其选项数据量超过 1 万条&#xff0c;而在测试环境中这些数据量只有几百条。这导致在页面加载时&#xff0c;浏览器性能出现瓶颈&#xff0c;页面卡顿甚至崩溃。 想了一…

人大金仓(KingBaseEs)数据库操作手册

人大金仓数据库&#xff08;KingbaseES&#xff09;是由北京人大金仓信息技术股份有限公司&#xff08;简称人大金仓&#xff09;自主研发的、具有自主知识产权的通用关系型数据库管理系统。 官方下载地址&#xff1a;KingbaseES 人大金仓数据库 KES技术文档在线手册&#xf…

MATLAB 最小二乘平面拟合(90)

MATLAB 最小二乘平面拟合(90) 一、算法介绍二、算法实现1.代码2.结果:一、算法介绍 平面方程: ax+by+cz+d = 0 执行任务:读取一组点云(这里用自定义生成的平面模拟点云代替,在其中添加了噪声来模拟真实的数据),使用最小二乘拟合平面,来输出平面参数,并可视化显示拟…

使用Java将PDF文件解析成Excel文件

安装pom依赖 <!-- 解析pdf--><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.27</version> <!-- 请检查并使用最新版本 --></dependency>测试读取pdf文件…

新书速览|循序渐进Node.js企业级开发实践

《循序渐进Node.js企业级开发实践》 1 本书内容 《循序渐进Node.js企业级开发实践》结合作者多年一线开发实践&#xff0c;系统地介绍了Node.js技术栈及其在企业级开发中的应用。全书共分5部分&#xff0c;第1部分基础知识&#xff08;第1&#xff5e;3章&#xff09;&#xf…

CDC YAML 在阿里云的最佳实践

摘要&#xff1a;本文投稿自阿里云开源大数据平台数据通道团队&#xff0c;主要介绍了 Flink CDC YAML 在实时计算Flink版的最佳实践。内容分为以下五个部分&#xff1a; CDC YAML 简介CDC YAML 核心能力CDC YAML 应用场景阿里云 Flink CDC 企业级功能十分钟在阿里云免费实现一…

【教程】创建NVIDIA Docker共享使用主机的GPU

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 这套是我跑完整理的。直接上干货&#xff0c;复制粘贴即可&#xff01; # 先安装toolkit sudo apt-get update sudo apt-get install -y ca-certifica…

SpringMVC纯注解快速开发

此文章适合具有一定的java基础的同学看哦&#xff0c;如果有看不懂的基本代码还是先补补java基础哦。 此教程带您不使用xml文件而是纯注解开发&#xff0c;易懂、快捷、迅速&#xff0c;从0开始搭建&#xff0c;很快就能构建起一个SpringMVC项目&#xff0c;能学到两种使用tom…

【计算机网络】期末速成(2)

部分内容来源于网络&#xff0c;侵删~ 第五章 传输层 概述 传输层提供进程和进程之间的逻辑通信&#xff0c;靠**套接字Socket(主机IP地址&#xff0c;端口号)**找到应用进程。 传输层会对收到的报文进行差错检测。 比特流(物理层)-> 数据帧(数据链路层) -> 分组 / I…

多人聊天室 NIO模型实现

NIO编程模型 Selector监听客户端不同的zhuangtai不同客户端触发不同的状态后&#xff0c;交由相应的handles处理Selector和对应的处理handles都是在同一线程上实现的 I/O多路复用 在Java中&#xff0c;I/O多路复用是一种技术&#xff0c;它允许单个线程处理多个输入/输出&…

数据结构——有序二叉树的删除

在上一篇博客中&#xff0c;我们介绍了有序二叉树的构建、遍历、查找。 数据结构——有序二叉树的构建&遍历&查找-CSDN博客文章浏览阅读707次&#xff0c;点赞18次&#xff0c;收藏6次。因为数据的类型决定数据在内存中的存储形式。left right示意为左右节点其类型也为…

威联通-001 手机相册备份

文章目录 前言1.Qfile Pro2.Qsync Pro总结 前言 威联通有两种数据备份手段&#xff1a;1.Qfile Pro和2.Qsync Pro&#xff0c;实践使用中存在一些区别&#xff0c;针对不同备份环境选择是不同。 1.Qfile Pro 用来备份制定目录内容的。 2.Qsync Pro 主要用来查看和操作文…

线性代数中的谱分解

一、谱分解的基本原理 谱分解&#xff08;Spectral Decomposition&#xff09;是线性代数中的一个重要概念&#xff0c;特别是在研究矩阵的特征值和特征向量时。它指的是将一个矩阵分解为其特征值和特征向量的组合&#xff0c;从而简化矩阵的运算和分析。谱分解通常适用于对称…

C语言学习:速通指针(2)

这里要学习的有以下内容 1. const修饰指针 2. 野指针 3. assert断⾔ 4. 指针的使⽤和传址调⽤ 那么从这里开始 1. const 修饰指针 const修饰变量 首先我们知道变量是可以修改的&#xff0c;如果把变量的地址交给⼀个指针变量&#xff0c;通过指针变量的也可以修改这个变…

dart类和对象

基本定义 类 类是一个包裹多个对象成员的一个整体&#xff0c;可以通过实例化获取类的对象&#xff0c;通过对象操纵内部对象 对象 对象具有由函数和数据&#xff08;分别为方法和 实例变量&#xff09;组成的成员。调用方法时&#xff0c;您会在对象上调用它&#xff1a;该…