vue部署之后提示用户更新的两种方式(http请求和worker线程请求)

const { writeFile, mkdir, existsSync } = require('fs')
// 动态生成版本号
const createVersion = () => {// mkdir('./dist', { recursive: true }, (err) => {//检测dist目录是否存在if (existsSync('./dist')) {writeFile(`./dist/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)

以下两种方式都需要在vue.config.js里加上上面这段代码

第一种

// auto-update.js
/** @Description: 自动更新*/import Vue from 'vue'
import Modal from './updateModal.vue'let currentVersion // 当前版本
let hidden = false // 页面是否隐藏
let setTimeoutId// 获取版本号
const getVersion = async () => {return fetch(process.env.VUE_APP_BASE_URL + 'version.json?timestep=' + Date.now()).then(res => res.json())
}// 检查更新
const checkUpdate = async () => {const version = (await getVersion()).versionif (Number(version) > Number(currentVersion)) {const result = confirm('发现新版本,点击确定更新')if (result) {location.reload() // 刷新当前页}}
}// 自动更新
const autoUpdate = async () => {setTimeoutId = setTimeout(async () => {console.log(setTimeoutId, '这是个检查自动更新的定时器')// 页面隐藏了就不检查更新if (!hidden) {checkUpdate()}autoUpdate()}, 10 * 1000)
}// 停止检测更新
const stop = () => {if (setTimeoutId) {clearTimeout(setTimeoutId)setTimeoutId = ''}
}// 开始检查更新
const start = async () => {currentVersion = (await getVersion()).versionautoUpdate()// 监听页面是否隐藏document.addEventListener('visibilitychange', () => {console.log(document.hidden, '能监听到啥')hidden = document.hiddenif (hidden) {stop()} else {checkUpdate()autoUpdate()}})
}export default { start }

第二种

// update.worker.js, 我放在了public下let currentVersion // 当前版本
let hidden = false // 页面是否隐藏
let setIntervalId// 获取版本号
const getVersion = async () => {// return fetch('http://localhost:8080/version.json?timestep=' + Date.now()).then(res => res.json())// const url = window.location.origin // 无法读取windowreturn fetch('https://xxxx.com/version.json?timestep=' + Date.now()).then(res => res.json(), { cache: 'no-store' })
}// 检查更新
const checkUpdate = async () => {let isUpdate = falseconst version = (await getVersion()).versionif (Number(version) > Number(currentVersion)) {console.log('发现新版本,点击确定更新--update.worker.js')return (isUpdate = true)} else {return (isUpdate = false)}
}// 停止检测更新
const stop = () => {if (setIntervalId) {clearInterval(setIntervalId)setIntervalId = ''}
}self.onmessage = async event => {var data = event.datacurrentVersion = (await getVersion()).versionif (data.pageVisibility) {stop()return}setIntervalId = setInterval(async () => {const isUpdate = await checkUpdate()if (isUpdate) {stop()self.postMessage({isUpdate: true})}}, 5 * 1000)console.log(data, '子线程worker.js')
}

随便一个全局文件里使用下面代码

var worker = new Worker('http://localhost:8080/update.worker.js')const url = window.location.originvar worker = new Worker(url + 'update.worker.js')// var worker = new Worker('/update.worker.js')let data = { pageVisibility: false }worker.postMessage(data)worker.onmessage = function(event) {console.log(event.data, 'worker主线程1')if (event.data?.isUpdate) {// const result = confirm('发现新版本,点击确定更新')// if (result) {//   // location.reload(true) // 刷新当前页//   // window.location.reload(true)//   window.location.replace(window.location.href)// }Notification({title: '页面更新提示',message: '网页内容有更新,请按shift+F5刷新页面',duration: 0,type: 'success',onClose: () => {}})worker.terminate()}}worker.onerror = function(event) {console.log(event)// console.error(event.filename + ':' + event.message)//如果发生错误,立即终止代码worker.terminate()}// 监听页面是否隐藏document.addEventListener('visibilitychange', () => {console.log(document.hidden, '能监听到啥-html')let hidden = document.hiddendata.pageVisibility = hidden})

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

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

相关文章

数据结构【DS】栈

共享栈 共享栈的目的是什么? 目的:有效利用存储空间。 共享栈的存取数据时间复杂度为? 存取数据时间复杂度为O(1) 共享栈如何判空?如何判满? 两个栈的栈顶指针都指向栈顶元素,𝑡𝑜𝑝…

Ultipa Transporter V4.3.22 即将发布,解锁更多易用功能!

Ultipa Graph 作为一款领先的实时图数据库分析平台,即将发布最新版的数据导入/导出工具Ultipa Transporter V4.3.22 以实现对 Neo4j数据源的导入支持。自今年以来,Ultipa Transporter不断增加新功能,除原本支持本地CSV文件导入导出外&#xf…

【汇编】数据在哪里?有多长、div指令实现除法、dup设置内存空间

文章目录 前言一、汇编语言中数据位置的表达1.1 汇编中有哪几种数1.立即数(idata):2.寄存器(Register):3.内存(Memory):4.段地址(Segment Address&#xff0c…

微信小程序 官方文档使用指南

官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/ 触发事件 在wxml页面写逻辑代码js文件的调用 微信内部api

Git-概念与架构

GIT-概念与架构 一、背景和起源二、版本控制系统1.版本控制分类1.1 集中式版本控制1.2 分布式版本控制 2.Git和SVN对比2.1 SVN2.2 GIT 三、GIT框架1.工作区(working directory)2.暂存区(staging area)3.本地仓库(local…

nvm:轻松管理多个 Node 版本 | 开源日报 No.80

nvm-sh/nvm Stars: 67.6k License: MIT Node Version Manager,是一个 POSIX 兼容的 bash 脚本,用于管理多个活动 node.js 版本。nvm 可以让你通过命令行快速安装和使用不同版本的 Node。它可以在任何符合 POSIX 标准的 shell(sh、dash、ksh…

QFile文件读写操作QFileInFo文件信息读取

点击按钮选择路径,路径显示在lineEdit中 将路径下的文件的内容放在textEdit中 最后显示出来 !file.atend()//没有读到文件尾就一直读 file.readline表示按行进行读 追加的方式进行写 要是重新写的话用file.open(QIODevice::write) 用QFileInFo来读取…

这8个Wireshark使用技巧,一看就会!

今天就给你分享8个常用的Wireshark使用技巧,一看就会。如果是处理 HTTP,HTTPS 大家还是用还是用 Fiddler,但如果是其他协议比如 TCP,UDP,还是用wireshark。 今天给你准备了wireshark和Fiddler的安装包给你&#xff0c…

22. 深度学习 - 自动求导

Hi,你好。我是茶桁。 咱们接着上节课内容继续讲,我们上节课已经了解了拓朴排序的原理,并且简单的模拟实现了。我们这节课就来开始将其中的内容变成具体的计算过程。 linear, sigmoid和loss这三个函数的值具体该如何计算呢? 我们…

基于springboot实现电子招投标系统【项目源码】

基于springboot实现电子招投标系统演示 SpringBoot框架 SpringBoot是一个全新开源的轻量级框架。基于Spring4.0设计,其不仅继承了Spring框架原来有的优秀特性,而且还通过简化配置文件来进一步简化了Spring应用的整个搭建以及开发过程。另外在原本的Spri…

​分享mfc140u.dll丢失的解决方法,针对原因解决mfc140u.dll丢失的问题

作为电脑小白,如果电脑中出现了mfc140u.dll丢失的问题,肯定会比较的慌乱。但是出现mfc140u.dll丢失的问题,其实也有很简单的办法,所以大家不用慌张,接下来就教大家解决办法,能够有效的解决mfc140u.dll丢失的…

2023年中国中端连锁酒店分类、市场规模及主要企业市占率[图]

中端连锁酒店行业是指定位于中档酒店市场、具有全国统一的品牌形象识别系统、全国统一的运营体系、会员体系和营销体系的酒店。中端酒店通常提供舒适、标准化的房间设施和服务,价格较为合理,符合广大消费者的需求。其价格略高于经济型酒店,但…

html实现图片裁剪处理(附源码)

文章目录 1.设计来源1.1 主界面1.2 裁剪界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/134455169 html实现图片裁剪处理(附源码),支持图片放大缩小&#…

uniapp的/绝对定位/相对定位/固定定位/粘滞定位

【[html5]你还分不清楚绝对定位和相对定位......】 相对定位一般配合绝对定位使用 <template><view class"content"><view style"background-color: black;width: 100%;height: 300px;position:relative;"><view class"one"…

比科奇推出5G小基站开放式RAN射频单元的高性能低功耗SoC

全新的PC805作为业界首款支持25Gbps速率eCPRI和CPRI前传接口的系统级芯片&#xff08;SoC&#xff09;&#xff0c;消除了实现低成本开放式射频单元的障碍 中国北京&#xff0c;2023年11月 - 5G开放式RAN基带芯片和电信级软件提供商比科奇&#xff08;Picocom&#xff09;今日…

开源vs闭源大模型如何塑造技术的未来?开源模型的优劣势未来发展方向

开源vs闭源大模型如何塑造技术的未来&#xff1f;开源模型的优劣势&未来发展方向 写在最前面一、开源与闭源&#xff1a;定义与历史背景开源和闭源的定义开源大模型&#xff1a;社区驱动的创新 二、开源和闭源的优劣势比较开源大模型&#xff08;瓶颈&#xff09;数据&…

搭建 AI 图像生成器 (SAAS) php laravel

今天来搭一套&#xff0c;AI 图像生成器 是基于 Openai DALLE 2 和 Openai DALLE 3 以及 Stability AI 和稳定扩散 API 构建的脚本&#xff0c;为用户提供了使用简单的提示和大小生成独特自定义图像的可能性。在这个平台上&#xff0c;创意得以快速、高效地实现&#xff0c;借助…

基于 FFmpeg 的跨平台视频播放器简明教程(十一):一种简易播放器的架构介绍

系列文章目录 基于 FFmpeg 的跨平台视频播放器简明教程&#xff08;一&#xff09;&#xff1a;FFMPEG Conan 环境集成基于 FFmpeg 的跨平台视频播放器简明教程&#xff08;二&#xff09;&#xff1a;基础知识和解封装&#xff08;demux&#xff09;基于 FFmpeg 的跨平台视频…

面试其他注意事项

面试其他注意事项 一、面试反问 这个岗位的日常工作和主要职责是什么&#xff1f;咱们这边主要负责什么业务&#xff0c;用到了哪些技术呢&#xff1f;对于我们校招生有没有培养体系呢&#xff1f;脱产培训&#xff0c;还是边工作边熟悉&#xff1f;会有导师带嘛&#xff1f;…

滚动更新和回滚部署在 Kubernetes 中的工作原理

公众号「架构成长指南」&#xff0c;专注于生产实践、云原生、分布式系统、大数据技术分享。 在过去的几年中&#xff0c;Kubernetes 在生产环境中被广泛使用&#xff0c;它通过其声明式 API 提供了大量解决方案&#xff0c;用于编排容器。 Kubernetes 的一个显著特性是其具有…