关于版本迭代后用户停留在之前版本页面,导致某些功能无法使用的解决方案

Abaqus 2026安装避坑指南:Java/TomEE/VC++兼容性实战 Abaqus作为工业级有限元仿真平台,其安装本质是跨年代技术栈的协同工程——涉及Java运行时兼容性、Web容器(TomEE)集成、C++运行库(VC++)ABI稳定性等核心概念。原理上,它依赖特定版本Java(如8u291)的字节码签名与SSL类加载机制,通过TomEE实现许可服务的HTTPS通信网关功能,并强绑定VC++ 2010运行库以保障Fortran求解器二进制兼容。技术价值在于确保许可服务稳定启动、GUI正常渲染、作业成功提交;典型应用场景包括高校CAE中心部署、汽车主机厂仿真部离线安装及航天院 阅读详情
1、问题发现

某天发布测试版本后,测试小伙伴,反馈部分按钮点击后没有相关的交互动作,需要刷新后才能正常使用,经常在刚发版本后出现。刚收到问题的时候,第一反应就是缓存问题造成的,那就刷新一下就好了,但经常在发布版本后出现,无论对测试和用户都不能接受该处理方式,所以来研究一下

2、问题分析

项目采用vue(全家桶)+element-ui+webpack+axios搭建,使用vue-router的懒加载,实现按需加载,发版本后无法访问,应该和webpack打包与vue-router懒加载有关。在webpack配置文件webpack.prod.conf.js,查看相关的输出配置

output: {
    path: config.build.assetsRoot,
    filename: utils.assetsPath('js/[name].[hash].js'),
    chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
},

filename是对应于entry里面生成出来的文件名,chunkFilename未被列在entry中,但有些场景需要被打包出来的文件命名配置。比如按需加载(异步)模块的时候,这样的文件是没有被列在entry中的使用CommonJS的方式异步加载模块。

由于项目是异步加载,打包导出问文件也是chunkFilename,从webpack配置文件可以看出,当修改某个文件的时候会修改该chunkhash的值,相关的js修改,用户点击按钮的时候,通过按需加载请求不到上一个版本的js文件,导致页面卡死,无法应答

3、问题解决
1、监听相关js资源请求

使用addEventListener,实现错误监听

    window.addEventListener('error', handleListenerError, true);

* 该监听应放在index.html或项目打包页面的最上面,否则可能无法监听到相关的js请求失败的情况

2、判断相关错误相关信息

1)、判断相关的标签是否是script,eventErr.srcElement.localName == ‘script’

2)、判断是否是自己的按需加载模块的js,eventErr.srcElement.src.indexOf(’/* 域名*/.com/static/js/’);

3)、剔除.js.map的报错,fileName.indexOf(’.js.map’) < 0

3、存储并记录相关信息(防止页面重复刷新)
let reloadObj = {
    hash: hash,
    time: new Date().getTime()
}
let reloadObjlocalStorage = window.localStorage.getItem('reloadObj');
if(reloadObjlocalStorage == null){
    //第一次进来刷新页面
    //存储相关信息
    window.localStorage.setItem('reloadObj',JSON.stringify(reloadObj));
    //刷新界面
    window.location.reload();
}else{
    //第二次进来,判断上一次信息(理论上不应该进来,除非某些特殊情况,例如因某些原因导致部分js文件丢失),防止页面无休止的刷新
    let preReloadObj = JSON.parse(reloadObjlocalStorage);
    let time = new Date().getTime();
    //两次js文件加载报错时间间隔600毫秒才刷新
    if(time > Number(preReloadObj.time) + 600){
        window.localStorage.setItem('reloadObj',JSON.stringify(reloadObj))
        window.location.reload();
    }
}
4、防止中途断网导致页面刷新问题
if(navigator.onLine){ //返回Boolean类型,在线:true,离线:false
    window.addEventListener('error', handleListenerError, true);
}
5、完整代码
if(navigator.onLine){
    window.addEventListener('error', handleListenerError, true);
}
//监听事件
function handleListenerError (eventErr){
    if (eventErr.srcElement.localName == 'script' && 
    eventErr.srcElement.src.indexOf('/*域名*//static/js/')) {
            let arr = eventErr.srcElement.src.split('/static/js/');
            let fileName = arr[1];
            let hash = fileName.split('.')[1]; //获取hash
            if(fileName.indexOf('.js.map')<0){
                let reloadObj = {
                    hash: hash,
                    time: new Date().getTime()
                }
                let reloadObjlocalStorage = window.localStorage.getItem('reloadObj');
                if(reloadObjlocalStorage == null){
                    window.localStorage.setItem('reloadObj',JSON.stringify(reloadObj))
                    //刷新界面,获取新的html文件
                    window.location.reload();
                }else{
                    let preReloadObj = JSON.parse(reloadObjlocalStorage);
                    let time = new Date().getTime();
                    if(time > Number(preReloadObj.time) + 60){
                    window.localStorage.setItem('reloadObj',JSON.stringify(reloadObj))
                    window.location.reload();
                    }
                }
            }
    }
    eventErr.preventDefault()
}
6.刷新页面的作用

html文件中主要有三个js文件:

manifest.[chunkhash].js:在vendor的基础上,再抽取出要经常变动的部分,比如关于异步加载js模块部分的内容。

vendor.[chunkhash].js:通过提取公共模块插件来提取的代码块(webpack本身带的模块化代码部分)

app.[chunkhash].js: 入口js

刷新页面获取新的html,新的html请求上面新的js文件,在新的manifest.[chunkhash].js中包含了最新的异步加载模块的新地址(即js的新路径);

新的html也会包含新的app.[chunkhash].css以便更新新的样式

Docker容器回顾之运维篇 背景 接上一篇《Docker复习之部署篇》,本文继续对Docker之日常维护常用操作做回顾总结。 操作命令 2.1 Docker 容器查看 首先,管理员对docker做日常维护,需要了解现有环境有多少docker实例,并连接进入docker实例虚拟机进行对应的管理维护; 我们执行 docker ps 命令来查看容器名称:docker ps -a或docker ps //显示当前正在运行的容器,输出如下: 参数概览: 示例: 1)显示最后被创建的容器:docker ps -l //相当于 dock 阅读详情

相关推荐

AOSP -- 第一章 概述

在 AOSP 开源底层与面向消费者的设备之间,还存在一层厂商定制层。厂商定制界面品牌核心修改内容三星一体界面自定义系统界面、多窗口增强、桌面模式、诺克斯安全体系、S Pen 手写笔适配、自研相机架构小米MIUI / 澎湃 OS重度定制界面、自研桌面、控制中心、安全应用、应用双开功能OPPO / 一加色彩 OS / 氧 OS自定义息屏显示、桌面负一屏、禅定模式、定制图库与相机谷歌像素原生体验材质你动态取色主题、像素专属桌面、张量芯片专属优化、像素独占功能华为EMUI / 鸿蒙。

dengfuma的专栏 288

浅谈敏捷开发中迭代和旧版本维护

在所谓敏捷开发中会出现一个经常遇到的问题就是旧版本已经发布出去 , 新版本正在开发之中,这期间发现旧版本bug需要修改的情况? 通常的解决方法是需要新旧版本的统一修改,如果这期间涉及的新旧版本代码已经 变化很大就需要评估这个bug在新版本是否还要存在是否修改的问题。 进过评估之后,修正新版本的情况。 这种尴尬的原因需要我们先看敏捷开发基本流程 软件开发的过程是,需求-〉

Sur的工作日子 3848

【信息科学与工程学】【产品体系】第二十七篇 存储系统系列一 01

存储系统是一个横跨单机引擎 → 分布式系统 → 硬件指令集 → 云上多地域的四层技术栈。下面按你给的格式,用一组相互关联的表把"各类特性组合"一次性铺开。版本号以各厂商当前 GA 版本为准,功能清单为生产级能力摘要。编号存储系统(厂商 / 内核 / 引擎 / 版本 / 功能清单)S01Ceph(Red Hat / 自研内核模块 / RADOS + BlueStore + RocksDB / Squid 19.x)/ 功能:RBD 块、RGW 对象(S3/Swift)、CephFS POSIX、副本+EC 混

weixin_49199313的博客 366

前端发版本,页面白屏报错,微信缓存不更新资源

前端发版本,页面白屏报错,微信缓存不更新资源

qq_35430000的博客 2537

【信息科学与工程学】计算机科学与自动化——第一百五十五篇 缓存系统设计01 基础知识

CPU:拥有 L1/L2/L3 多级缓存,用于暂存即将执行的指令和频繁访问的数据。GPU:包含显存、纹理缓存、常量缓存、指令缓存等,加速图形渲染和通用计算。RAID 卡 / 存储控制器:自带缓存(通常带电池保护),用于合并写操作、加速读写。打印机:内置内存缓存,用于暂存待打印的页面数据,避免反复从电脑传输。光驱 / 蓝光播放器:内部缓存用于平滑读取光盘数据,防止因寻道延迟导致卡顿。操作系统:页缓存(Page Cache):缓存文件系统数据,减少磁盘 I/O。目录缓存(dentry cache):加速路径查找

weixin_49199313的博客 290

手把手教你为STM32设备生成自定义MAC地址(基于芯片ID的5种算法对比)

本文详细介绍了基于STM32芯片ID生成自定义MAC地址的5种算法,包括直接截取、异或折叠、CRC32哈希、自定义混合运算及SHA-256摘要。通过对比分析各算法的计算复杂度、唯一性及适用场景,帮助嵌入式开发者根据项目规模与资源,选择最合适的方案,确保设备MAC地址的唯一性与合规性。

weixin_29170327的博客 527

前端vue应用打包部署后缓存问题,导致显示的还是旧的页面

这个缓存机制原理还不是很清楚,有时会出现有时不会出现,综合网上的多种方法尝试了一下: 方法一:前端打包时js和css文件加上版本号,如果版本号不同浏览器就会去拿新的文件: 在 vue.config.js 文件加入如下代码: const Version = new Date().getTime().toString().match(/.*(.{8})/)[1] // 截取时间戳后八位 module.exports = { configureWebpack:{ output: {

weixin_45531945的博客 1万+

PaddleOCR实战:如何在CentOS 8.5上搭建高性能OCR识别环境

本文详细介绍了在CentOS 8.5系统上搭建高性能PaddleOCR识别环境的完整指南。从系统环境准备、PaddlePaddle框架部署到PaddleOCR的定制化安装与性能优化,提供了针对生产环境的解决方案,包括GPU/CPU环境配置、内核参数调优及常见问题排查,帮助用户实现高效OCR识别。

weixin_29223603的博客 349

发版后前端页面更新问题

2、在打开的页面跳转之前未打开过的页面(之前打开过的资源会缓存,如果是spa则js等已在内存中)会因为服务器资源不存在而报错。3、加入版本校验功能(解决第二类问题),具体操作可以前后端统一维护一个版本号,每次发版都新增,接口通过判断版本号是否一致来返回相应信息,前端获取到不一致标识之后主动刷新页面。2、对于spa页面,则可以在index.html加入不缓存的meta标签,确保每次打开都是最新的html文件(解决第一类问题)1、服务器将强缓存改为协商缓存或者不缓存(解决第一类问题)

weixin_53000437的博客 1518

嵌入式开发面试题全解析:指针、内存、数据类型关键问题总结

本文对嵌入式开发典型面试题进行深度解析,涵盖多方面关键知识。题目 19 揭示字符指针修改字符串常量的错误操作;题目 20 展现strcpy引发的缓冲区溢出风险;题目 21 体现未初始化数组与strlen结合的不可预测性;题目 22 通过位域与对齐规则计算结构体大小;题目 23 因unsigned char溢出导致循环异常。这些题目全面覆盖指针操作、内存管理、数据类型特性等核心内容,精准指出开发中易疏忽的陷阱,有助于理解编程规范,规避风险,提升代码质量与稳定性,是深入掌握嵌入式开发要点的实用指南。

嵌入式中手 1364

从零搭建医疗化验单识别系统:深度学习+OCR实战教程(附数据集)

本文详细介绍了如何从零开始构建一个医疗化验单智能识别系统。通过融合深度学习和OCR技术,系统能够应对版式多样、内容专业的医疗单据,实现从文本检测、识别到关键信息结构化抽取的全流程。文章提供了数据集处理、模型选型、训练微调及工程化部署的实战指南,并分享了避坑经验与性能优化策略,为开发者解决医疗信息化痛点提供了完整的技术方案。

k9l0m1的博客 492

在solaris8 下安装apache2.26成功报告[原创]

接到通知需要构建solaris8下的apache2 http server , version是2.26 于是就去了 http://www.sunfreeware.com/indexsparc8.html,找需要的相关软件, 一开始我晕了,去下了`SOLARIS10的软件安装,不过居然可以装?。。。 汗死!最后还得删。 apache-2.2.6-sol8-sparc-local....

weixin_30587025的博客 137

遥感大模型核心技术之自监督预训练技术研究(2025年9月版)

本文系统探讨了自监督预训练技术在遥感大模型构建中的核心作用。随着遥感数据进入"大数据"时代,传统监督学习面临"数据丰富、标签贫乏"的瓶颈,而自监督预训练通过设计代理任务从无标签数据中学习特征表示,成为驱动大模型发展的关键引擎。文章分析了遥感领域对自监督预训练的三大独特挑战:多源异构性、地理空间约束和时空动态性,并提出了针对性解决方案:掩码自编码(MAE)技术及其演进、地理对比学习与多模态融合、位置感知预训练与多任务学习。

panshengwu的博客 842

CentOS 7 Minimal 下构建可审计的 Tomcat 7 RPM 仓库

Tomcat 是 Java Web 应用的核心 Servlet 容器,其运行依赖于稳定的 Java 环境、系统服务管理(如 systemd)和强制访问控制(如 SELinux)。在 CentOS 7 这类长期支持的 Linux 发行版中,官方 yum 源已移除 tomcat7,导致直接安装失败;而手动解压部署又面临二进制可信度低、依赖缺失、SELinux 上下文错配、安全策略不兼容等工程风险。本文聚焦于重建可控的 yum 安装链:基于 Apache 官方归档源验证下载、使用 rpmbuild 打包为标准 R

culi4814的博客 1266

Chapter 4 Ripple-Based Control Technique Part I

本文介绍了DC-DC转换器的纹波控制技术,重点分析了迟滞控制、恒定开通时间控制、恒定关断时间控制等方案的工作原理及优缺点。纹波控制无需补偿网络,具有快速瞬态响应和结构简单的优势,特别适合电池供电应用。其中,恒定开通时间控制在轻载时能自动延长关断时间,实现伪定频工作;而恒定关断时间控制轻载效率较低。文章还讨论了纹波注入技术解决Boost转换器右半平面零点问题,并比较了不同控制方案在负载瞬态下的性能表现。最后指出基于纹波的控制技术在提高调节精度和降低EMI方面的改进方向。

2304_76736886的博客 1302

嵌入式STM32F407CET6移植OpenHarmony系统方法

文件末尾添加:export PATH=~/gcc-arm-none-eabi-10-2020-q4-major/bin:$PATH。编译完成文件输出在LiteOs源码目录下out/STM32F407_ATK_Explorer文件夹中。②点击connect to the target,下方会自动显示识别出来的芯片型号以及flash大小。⑤点击program verify并点击start,等待烧写并校验完成,你就能看到程序正在运行了。,在选择刚才我们说的Huawei_LiteOS.hex文件。

嵌入式技术开发 546

Ubuntu 12.04 Jenkins 部署实战:系统兼容性与Java运行时深度解析

Jenkins 是持续集成领域的核心自动化工具,其稳定运行高度依赖底层操作系统环境与 Java 运行时支持。理解 Jenkins 的启动原理,需从 Linux 发行版的包管理机制、内核版本约束、APT 源策略及 Java 版本兼容性出发——尤其当面对 Ubuntu 12.04 这类已终止维护的 LTS 系统时,OpenJDK 6/7 的类库差异、PermGen 内存模型、SSL 证书链失效等细节直接决定部署成败。这类‘老旧环境适配’能力,本质是 Linux 系统工程能力的试金石,广泛应用于信创OS迁移、工业

weixin_30706691的博客 395

一键熄火:在 SAP ABAP 平台停用 OAuth 2.0 Client 的正确姿势

本文是一篇面向SAP ABAP平台运维与开发团队的实战指南,重点讲解了OAuth 2.0客户端的停用操作。文章首先阐述了停用的必要性——当客户端存在泄漏风险或配置错误时,停用能在阻断访问的同时保留配置。随后详细介绍了通过SOAUTH2事务码执行停用的具体步骤,并区分了"停用"、"删除"和"撤销令牌"三个关键概念及其适用场景。 文章提供了两个真实案例:一个是怀疑客户端泄漏后的紧急处置流程,另一个是合规审计期间的冻结与恢复操作。最后总结了一份验证清单,

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 278

lvs,haproxy,keepalived,nginx,tomcat介绍和实验

lvs,haproxy,keepalived,nginx,tomcat介绍和实验

2301_81717288的博客 1057

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

详细Linux基础知识

SSH 远程连接解析,Vim 基础操作,用户管理.....

2301_81704123的博客 1248

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Kubernetes

habor,master,node1,node2都要做“1.安装docker” 1.安装docker 2.在harbor上生成key 3.编辑harbor配置文件 4.启动并验证 2.构建部署kubernetes所需主机 主机名 ip 配置 角色 harbor.timinglee.org 172.25.254.254 cpu1、mem 1G harbor仓库 master-node 172.25.254.100 cpu4、mem>4G master,k8s集群控制节点 node1 1

2301_81717288的博客 514

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

练功秘籍---A

常用整理

CarryBest的博客 1650

WEB项目部署发版-通知用户在线更新方案

由于是单页面应用,用户一进入网站,就会把HTML与相对应的资源利用浏览器的缓存机制,停留在本地,这样的好处,就是再次进入网站,可以利用缓存机制,可快速进入网站。这也就造成了我们项目版本迭代后,用户因缓存机制,会继续使用旧迭代版本,需要用户手动刷新去服务器请求获取新的HTML,来使用新迭代版本。用户手动刷新获取新版本html(需要在nginx 配置,在nginx.conf文件做设置,让 index.html 不缓存)需求项目迭代后,用户使用会有版本更新的提示或者自动刷新,实现版本升级用户有感知方案。

高灯GFE 1248

window.addEventListener('error')监听页面是否更新版本

因本司更新迭代的速度很快,有时候更改一个BUG就要马上更新版本,就会引起用户在应用当中,页面点击无反应,其实是打包的js和css的包名称更改,找不到以前的包的缘故。我现在用一个小方法,判断js或css报错时,强制刷新页面,就可以正常使用了。 window.addEventListener('error', handleListenerError, true); function handl...

weixin_30654419的博客 3421
上一篇: 关于Web Worker应用
下一篇: 关于webpack dll优化打包问题
cjvalue
博客等级 码龄8年 4粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值