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()).version
  if (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()).version
  autoUpdate()
  // 监听页面是否隐藏
  document.addEventListener('visibilitychange', () => {
    console.log(document.hidden, '能监听到啥')
    hidden = document.hidden
    if (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 // 无法读取window
  return fetch('https://xxxx.com/version.json?timestep=' + Date.now()).then(res => res.json(), { cache: 'no-store' })
}

// 检查更新
const checkUpdate = async () => {
  let isUpdate = false
  const version = (await getVersion()).version
  if (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.data
  currentVersion = (await getVersion()).version

  if (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.origin
    var 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.hidden
      data.pageVisibility = hidden
    })

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MatrixOne 支持多样化生态工具,持续提升开发者体验

概述 在选择一款数据库产品时,对数据库上下游生态组件的打通是大数据开发工程师需要面对的一致难题。 MatrixOne提出了“One Size Fits Most”理念,旨在用全新HSTAP技术架构打破数据孤岛,其中,与各生态组件的“无缝衔接”也是Ma…

二维码智慧门牌管理系统升级解决方案:高效服务审核流程

文章目录 前言一、服务审核流程优化二、创新性解决方案 前言 随着科技的不断发展,智能化管理已经广泛渗透到社会各个领域。在这一趋势下,二维码智慧门牌管理系统成为服务行业中应用广泛的工具。为了更好地满足用户需求、提升服务质量和效率,…

【数据下载】FileZilla安装及使用说明:以全球NCEP 再分析数据集为例

1 简介# 1 简介 FileZilla是一个免费开源的FTP软件,分为客户端版本和服务器版本,具备所有的FTP软件功能。 1.1 下载地址 File Zilla官网下载 1.2 安装过程 下载完成后,界面如下: 2 使用 2.1 主机设置 2.2 下载数据 全球N…

Git相关: 拉取、git push提交 过程遇到的错误

目录 解决git push报错error: RPC failed; HTTP 413 curl 22 关于这个问题,其实千万别用gitlab,因为你怎么推送 也不可能把几G的文件推上去。 error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 se 解决git push报错error: RPC failed;…

腾讯云服务器可用区是什么?随机可用区选择方法

腾讯云服务器可用区是什么意思?云服务器可用区如何选择?可用区是指在同一个地域内电力和网络相互独立的区域,可用区可以做到故障隔离,所以可用区存在的意义在于构建高可用、高容灾应用,将应用部署在不同可用区内&#…

TCP协议通讯流程

文章目录: 通讯流程全过程浏览建立连接过程数据传输过程断开连接问题 通讯流程全过程浏览 下图是基于TCP协议的客户端/服务器程序的一般流程: 上图就是TCP协议的通信流程,接下来认识初步认识以下TCP建立连接(三次握手&#xff0…

React函数组件状态Hook—useState《进阶-对象数组》

React函数组件状态-state 对象 state state 中可以保存任意类型的 JavaScript 值,包括对象。但是,你不应该直接修改存放在 React state 中的对象。相反,当你想要更新⼀个对象时,你需要创建⼀个新的对象(或者将其拷⻉⼀…

(C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)

链栈是运算受限的单链表、只能在链表头部进行操作 1.链表的头指针就是栈顶,链头为栈顶,链尾为栈底 2.栈的链式存储不需要附设头节点 3.基本不存在栈满的情况,不需要判断栈满,但要判空 4.空栈相当于头指针指向空 5.插入和删除仅在栈顶处执行 6.因为是动态…

ncbi-datasets-cli-高效便捷下载NCBI数据

文章目录 简介安装datasets download下载基因组/基因序列按照GCA list文件编号下载下载大基因组genome完整参数gene参数 datasets summary下载元数据dataformat将json转换成表格格式通过json文件解析其他字段问题 简介 NCBI Datasets 可以轻松从 NCBI 数据库中收集数据。使用命…

牛客 —— 链表中倒数第k个结点(C语言,快慢指针,配图)

目录 1. 思路1:倒数第K个节点,就是整数第N-K1的节点 2. 思路2:快慢指针 1. 思路1:倒数第K个节点,就是整数第N-K1的节点 链表中,一共有N个节点,如果我们想要得出倒数第K个节点,我们…

windows server 华夏ERP部署手册

软件包准备: .安装MySql 找到mysql程序双击进行安装,进入这个页面 选择Server only点击Next 进入到下图,点击execute,等待完成,点击下一步 点击install安装插件 安装完插件点击下一步 等待程序加载完成,点击下一步 继续下一步 进行下一步 进行…

不加家长好友,如何私密发成绩?

身为老师的你,是否经常收到家长们的询问,要求你告知他们孩子的成绩?而你却因为规定,不能直接将成绩公布?那么,如何解决这个问题呢? 成绩查询系统。是专门为学生和家长提供成绩查询服务的系统。可…

智慧农业新篇章:拓世法宝AI智能直播一体机助力乡村振兴与农业可持续发展

随着乡村振兴战略的深入推进,农业发展日益成为国家关注的焦点。在这一大背景下,助农项目的兴起成为支持乡村振兴的一项重要举措。 乡村振兴战略的实施,得益于《关于推动文化产业赋能乡村振兴的意见》、《关于全面推进乡村振兴加快农业农村现…

vscode Prettier配置

常用配置项: .prettierrc.json 是 Prettier 格式化工具的配置文件 {"printWidth": 200, // 指定行的最大长度"tabWidth": 2, // 指定缩进的空格数"useTabs": false, // 是否使用制表符进行缩进,默认为 false"singl…

Behave介绍和快速示例

Behave是一个用于行为驱动开发 (Behavior-Driven Development, BDD) 的 Python 库。使用 Behave,可以编写自然语言格式的使用场景来描述软件的行为,然后用 Python 实现这些场景下的步骤,形成可直接运行的测试。 Behave的目标是帮助用户、开发…

RT-DETR算法优化改进:自研独家创新BSAM注意力 ,基于CBAM升级 | 注意力机制大作战

💡💡💡本文全网首发独家改进:提出新颖的注意力BSAM(BiLevel Spatial Attention Module),创新度极佳,适合科研创新,效果秒杀CBAM,Channel Attention+Spartial Attention升级为新颖的 BiLevel Attention+Spartial Attention 1)作为注意力BSAM使用; 推荐指数:…

B/S麻醉临床信息系统(手麻系统)源码

手术麻醉系统是一套以数字形式与医院信息系统(如HIS、EMR、LIS、PACS等)和医疗设备等软、硬件集成并获取围手术期相关信息的计算机系统,其核心是对围手术期患者信息自动采集、储存、分析并呈现。该系统通过整合围手术期中病人信息、人员信息、…

DBeaver还原mysql数据库

DBeaver还原mysql数据库 DBEaver还原mysql数据库新建一个要还原的数据库选择工具》恢复数据库 DBEaver还原mysql数据库 新建一个要还原的数据库 选中数据库,右键新建一个数据库,字符集和排序规则默认的即可 选择工具》恢复数据库 选中刚刚创建好的数据库&#x…

springboot326校园体育场馆(设施)使用管理网站

交流学习: 更多项目: 全网最全的Java成品项目列表 https://docs.qq.com/doc/DUXdsVlhIdVlsemdX 演示 项目功能演示: ————————————————

Garmin佳明发布quatix 7 Pro航海商务智能腕表,于陆地之外乘风破浪

全新航海商务智能腕表,专为水上活动爱好者设计 搭载1.3英寸AMOLED屏幕,内置LED手电筒,长达16天电池续航 【2023年11月16日】今日,专业运动智能可穿戴设备及创新航海设备品牌佳明(纽交所代码:GRMN&#xff…