前端项目部署自动检测更新后通知用户刷新页面(前端实现,技术框架vue、js、webpack)——方案一:编译项目时动态生成一个记录版本号的文件

前言

当我们重新部署前端项目的时候,如果用户一直停留在页面上并未刷新使用,会存在功能使用差异性的问题,因此,当前端部署项目后,需要提醒用户有去重新加载页面。

技术框架

vue、js、webpack

解决方案

  • 编译项目时动态生成一个记录版本号的文件
  • 轮询(20s、自己设定时间)这个文件,判断版本号,有新版本则通知用户刷新页面
  • 通过监听visibilitychange事件,在页面隐藏时停止轮询,页面显示立马检测一次更新
  • 检测到更新后,停止轮询

(感兴趣的可去看方案二:根据打完包之后生成的script src 的hash值去判断,每次打包都会生成唯一的hash值,只要轮询去判断不一样了,那一定是重新部署了。) 

效果

页面右下角提示更新:

代码实现 

 Step1:在 vue.config.js 实现动态创建版本号文件

if (process.env.VUE_APP_ENV !== "production") {
// 这里我设置的是只在非生产环境自动检测更新(生成version);
// 想要所有环境都自动检测更新,只要写if(process.env.VUE_APP_ENV !== "production")内的内容就好const { writeFile, existsSync } = require('fs')// 动态生成版本号const createVersion = () => {//检测目录是否存在if (existsSync('./public')) {writeFile(`./public/version.json`, `{"version":"${Date.now()}"}`, (err) => {if (err) {console.log('写入version.json失败')console.log(err)} else {console.log('写入version.json成功')}})} else {setTimeout(createVersion, 1000)}}setTimeout(createVersion, 10000)
}

 Step2:在src目录下封装 auto-update.js

/** @Description: 自动更新*/let currentVersion // 当前版本
let version // 新版本
// const timeData = 60 * 1000 // 检查间隔时间
const timeData = 20 * 1000 // 检查间隔时间
let hidden = false // 页面是否隐藏
let setTimeoutId
let needTip = true // 默认开启提示// 获取版本号
const getVersion = async () => {return fetch('/version.json?timestep=' + Date.now()).then((res) => res.json())
}// 检查更新
const checkUpdate = async () => {console.log('***************checkUpdate**************')const currentVersion = sessionStorage.getItem("version")version = (await getVersion()).version// 本地没有 version,表示刚进入系统,直接塞值if (!currentVersion) return sessionStorage.setItem("version", version)console.log("🚀 ~ file: auto-update.js:19 ~ version:", version)console.log("🚀 ~ file: auto-update.js:21 ~ currentVersion:", currentVersion)console.log("🚀 ~ file: auto-update.js:23 ~ Number(version) !== Number(currentVersion):", Number(version) !== Number(currentVersion))let needRefresh = falseif (Number(version) !== Number(currentVersion)) {console.log('%c 发现新版本~~~~~~', 'color: red')needRefresh = true}return needRefresh
}// 自动更新
const autoUpdate = async () => {setTimeoutId = setTimeout(async () => {// 页面隐藏了就不检查更新if (!hidden) {const willUpdate = await checkUpdate()console.log("🚀 ~ file: auto-update.js:71 ~ setTimeoutId=setTimeout ~ willUpdate, version:", willUpdate, version)if (willUpdate && needTip) {// 延时更新,防止部署未完成用户就刷新空白setTimeout(()=>{// ----弹框确认---先简单点弹框确认,可以用注释内的,跳过右下角通知的内容(Step3、4)// const result = confirm('发现新版本,点击确定更新')// if (result) {//   sessionStorage.setItem('version', version)//   location.reload() // 刷新当前页// }// --------------//*****右下角通知提示 */window.dispatchEvent(new CustomEvent("onmessageUpdate", {detail: {msg: "发现系统版本更新,请刷新页面~",version: version},}))//******************* */}, 10000)needTip = false // 关闭更新提示,防止重复提醒}}console.log("🚀 ~ file: auto-update.js:90 ~ autoUpdate ~ needTip: ", needTip)if (needTip) {console.warn('needTip autoUpdate');autoUpdate()}}, timeData)
}// 停止检测更新
const stop = () => {if (setTimeoutId) {clearTimeout(setTimeoutId)setTimeoutId = ''}
}// 开始检查更新
const start = async () => {// currentVersion = (await getVersion()).versionautoUpdate()// 监听页面是否隐藏document.addEventListener('visibilitychange', () => {hidden = document.hiddenconsole.log("🚀 ~ file: auto-update.js:64 ~ document.addEventListener ~ hidden, needTip:", hidden, needTip)// 页面隐藏了就不检查更新。或者已经有一个提示框了,防止重复提示。if (!hidden && needTip) {autoUpdate()} else {stop()}})
}export default { start }

Step3:编写模板 CnNotify.vue 文件

<template><div class="cn_notify"><div class="content"><i class="el-icon-message-solid"></i>{{ msg }}</div><div class="footer"><el-row class="btnBox"><el-button type="primary" @click="onSubmit">确认刷新</el-button><el-button @click="cancle">我知道了</el-button></el-row></div></div>
</template>
<script>
export default {props: {msg: {type: String,default: '',},version: {type: String,default: '',},},data() {return {};},created() {},methods: {// 点击确定更新onSubmit() {sessionStorage.setItem('version', this.version) // 存入版本versionlocation.reload() // 刷新},// 关闭cancle() {this.$parent.close();},},
};
</script>
<style lang='scss' scoped>
.cn_notify {.content {padding: 20px 0;}.footer {display: flex;justify-content: center;}
}
</style>
<style lang='scss'>
.versionNotifyStyle {.el-notification__content {width: 280px !important;}
}
</style>

Step4:app.vue 使用组件CnNotify

<template><div id="app"><router-view /></div>
</template><script>
// 引入CnNotify组件
import CnNotify from "@/components/common/CnNotify/index.vue"
export default  {name:  'App',components: {CnNotify, // 注册组件},mounted() {this.watchUpdate()},methods: {watchUpdate() {window.addEventListener("onmessageUpdate", (res) => {console.log("🚀 ~ file: App.vue:20 ~ window.addEventListener ~ res:", res)let msg = res.detail.msg,version = res.detail.versionthis.$notify({title: "版本更新提示",duration: 0,position: "bottom-right",dangerouslyUseHTMLString: true,message: this.$createElement("CnNotify", {// 使用自定义组件ref: "CnNotify",props: {msg: msg,version: version},}),customClass:'versionNotifyStyle', //自定义类名})})},},
}
</script>

 Step5:在 main.js 内使用

// 引入自动更新提醒
import autoUpdate from './auto-update'
// 非生产环境使用
process.env.VUE_APP_ENV !== 'production' && autoUpdate.start()

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

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

相关文章

GPS北斗对时服务(时间同步系统)电力变电站应用方案

GPS北斗对时服务&#xff08;时间同步系统&#xff09;电力变电站应用方案 GPS北斗对时服务&#xff08;时间同步系统&#xff09;电力变电站应用方案 1.概述 在现代电网中&#xff0c;统一的时间系统对于电力系统的故障分析、监视控制及运行管理具有重要意义。变电站的对时是指…

GEE——利用Landsat C02 T1_L2数据进行某研究区的长时序(1985-2023年)NDVI和FVC计算

本教程的主要目的是在2022年底GEE已经不提供LandsatC01数据,所以这里给大家提供数据质量更高的C02数据集,这样我们就可以更快的切换过来。本教程主要目的就是实现NDVI和FVC长时序的计算,从而看某个区域的时空变化特特征。 数据介绍 Landsat C02 T1_L2数据是Landsat 8卫星(…

内网隧道学习

默认密码&#xff1a;hongrisec2019 一.环境搭建 网卡学习 一个网卡一个分段&#xff0c;想象成一个管道 192.168.52一段 192.168.150一段 仅主机模式保证不予外界连通&#xff0c;保证恶意操作不会跑到真实机之上 52段是内部通信&#xff0c;150段属于服务器&#xff08;…

数据结构 / 结构体指针

1. 格式 struct 结构体名{数据类型 成员1;数据类型 成员2; .... };struct 结构体名 *指针变量名 2. 结构体指针指向普通变量的地址 struct CAR{char name[10];int price; };struct CAR car{"byd",160}; struct CAR *p&car; //p是指向结构体变量car的指针// p…

使用重试和回退机制确保 Spring 微服务中的 API 弹性

在当今的数字环境中&#xff0c;应用程序严重依赖外部 HTTP/REST API来实现各种功能。这些 API 通常会编排复杂的内部和外部 API 调用网络。这创建了一个依赖网络。因此&#xff0c;当依赖的 API 发生故障或停机时&#xff0c;面向主要应用程序的 API 需要熟练、优雅地处理这些…

实验五 键盘按键与数码管显示(汇编与微机原理)

键盘按键与数码管显示 实验目的&#xff1a; 熟悉星研集成开发环境&#xff0c;掌握微机接口程序编写调试的基本方法。 掌握矩阵式键盘的工作原理及识别键盘按键的方法。 掌握8段数码管显示数字或字符的工作原理和它的使用方法。 掌握用8255扫描键盘及用8255刷新数码管显示…

优秀的员工成为公司的管理者之后,为何表现平庸?因为他们缺乏这些思维

在企业的实践中&#xff0c;我们发现平时能力最强的员工&#xff0c;在被提拔到管理层之后就慢慢变得平庸了&#xff0c;再也不是以前那个无所不能的“企业能人”了&#xff0c;甚至在一些事情的处理上还会有些笨拙。面对这种情况&#xff0c;我们一定会感觉很疑惑&#xff0c;…

Eclipse和Intellij IDEA的格式化代码快捷键

Eclipse和Intellij IDEA的格式化代码快捷键 eclipse的格式化快捷键是 Windows/Linux: Ctrl Shift F Mac: Cmd Shift F 按下这个组合键将会对当前编辑的代码进行格式化&#xff0c;使其符合你在Eclipse配置中定义的代码样式规范。你可以在Eclipse的偏好设置中配置代码格式化…

PC8231(CC/CV)5V/2.4A同步降压芯片 频率可调 限流欠压补偿

一&#xff0e;概述 PC8231 是一款同步降压转换器&#xff0c; 该转换器可驱动输出 2.4A 负载电流。 设计允许 PC8231 在 9V 到40V 宽输入电压范围内工作。通过将 COMP/EN 引脚逻辑电平拉低来实现外部关断功能&#xff0c;并进入待机模式。外部补偿使反馈控制环路具有良好的线…

JavaScript 原型,原型链的特点

JavaScript 的原型&#xff08;Prototype&#xff09;和原型链&#xff08;Prototype chain&#xff09;是 JavaScript 面向对象编程中的重要概念。 原型&#xff08;Prototype&#xff09; 在 JavaScript 中&#xff0c;每个对象都有一个原型对象&#xff0c;而这个原型对象…

CRM的智能招投标对企业有什么意义?

如今CRM系统的生态系统越来越壮大&#xff0c;这些工具的集成极大地丰富了CRM系统的应用场景&#xff0c;例如CRM系统集成企业微信等社交媒体为获客提供便利&#xff1b;再比如CRM集成ChatGPT提高邮件内容质量&#xff0c;对于经常接触招投标项目的业务人员来说&#xff0c;在C…

英特尔工作站:助力专业用户实现高效创作

原创 | 文 BFT机器人 英特尔工作站是由全球知名的英特尔公司设计和开发的一款计算平台。英特尔在工作站处理器领域将其产品分为性能型和移动型两类&#xff0c;它的诞生旨在满足专业用户在科学、工程、设计等领域对高性能计算的需求。英特尔工作站配备了最新的英特尔处理器、大…

EI期刊论文复现:考虑电动汽车可调度潜力的充电站两阶段市场投标策略程序代码!

本程序代码参考EI期刊论文《考虑电动汽车可调度潜力的充电站两阶段市场投标策略》&#xff0c;程序中基于历史数据评估可调度潜力&#xff0c;由联合报价模型确定节点边际电价&#xff0c;作为报价的参考&#xff0c;包含个体竞价模式&#xff0c;纳什博弈竞价&#xff0c;算例…

docker (简介、dcoker详细安装步骤)- day01

一、 为什么出现 Docker是基于Go语言实现的云开源项目。 Docker的主要目标是“Build&#xff0c;Ship and Run Any App,Anywhere”&#xff0c;也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理&#xff0c;使用户的APP&#xff08;可以是一个WEB应用或数据库应…

Git远程仓库常用开发命令和理解

远程仓库 创建与合并分支 每次提交&#xff0c;Git都把它们串成一条时间线&#xff0c;这条时间线就是一个分支。截止到目前&#xff0c;只有一条时间线&#xff0c;在Git里&#xff0c;这个分支叫主分支&#xff0c;即master分支。 HEAD严格来说不是指向提交&#xff0c;而…

01.vue3大事件——项目初始化、技术介绍

后台数据管理系统 - 项目架构设计 在线演示&#xff1a;https://fe-bigevent-web.itheima.net/login 接口文档: https://apifox.com/apidoc/shared-26c67aee-0233-4d23-aab7-08448fdf95ff/api-93850835 接口根路径&#xff1a; http://big-event-vue-api-t.itheima.net 本项…

不能打电话的流量卡真的合法?一篇文章让你读懂这个问题!

不能打电话的流量卡合法吗&#xff1f;主要还是看你选择的流量卡类型了。 ​  市面上不能打电话的流量卡大致分为两种&#xff1a; 一种是不带手机号码的物联卡&#xff0c;企业设备采购的话是合法的&#xff0c;一般运营商在将物联卡发售给企业法人后&#xff0c;为每个企业…

工作流能实现自动化吗?应该用什么工具?

研究显示&#xff0c;CRM系统工作流自动化软件不仅能简化冗余的工作且不需要监控和指导就能提高员工的工作效率。企业需要工作流自动化软件吗&#xff1f;答案是肯定的&#xff0c;工作流自动化的好处有哪些&#xff1f; 为什么企业需要工作流自动化软件 每家企业都希望降本增…

项目启动出现白屏问题需要刷新后才能显示解决方案

Vue项目起始时出现白屏问题需要刷新后才能显示解决方案 项目加\<div>为什么页面会出现加载过慢问题&#xff1f;如何让页面变得更快懒加载静态资源缓存 Webpack解决方案减少Js冗余操作 项目加<div> 在vue中,我们常常会因为在template模板中没有加div标签而使得页面…

企业营销管理能够实现自动化吗?怎么做?

当今企业面临着越来越多的营销难题&#xff1a;如何有效培育潜在客户、如何提高营销活动的效果、如何优化营销资源的分配......企业的营销管理怎么做&#xff1f;或许CRM系统营销自动化会起到作用。 客户细分&#xff1a; 企业可以通过CRM的客户细分功能&#xff0c;根据客户…