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

news2024/11/28 21:35:42
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.coloradmin.cn/o/1216070.html

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

相关文章

【vue】0到1的常规vue3项目起步

创建项目并整理目录 npm init vuelatestjsconfig.json配置别名路径 配置别名路径可以在写代码时联想提示路径 {"compilerOptions" : {"baseUrl" : "./","paths" : {"/*":["src/*"]}} }elementPlus引入 1. 安装e…

新增文件收藏夹、回收站、终端等功能,1Panel开源面板v1.8.0发布

2023年11月13日,现代化、开源的Linux服务器运维管理面板1Panel正式发布v1.8.0版本。 在这一版本中,1Panel新增文件收藏夹、回收站、终端功能,面板设置时支持设置面板监听地址。此外,1Panel开源项目组还进行了60多项功能更新和问题…

ICCV 23丨3D-VisTA:用于 3D 视觉和文本对齐的预训练Transformer

来源:投稿 作者:橡皮 编辑:学姐 论文链接:https://arxiv.org/abs/2308.04352 开源代码:http://3d-vista.github.io 摘要: 3D视觉语言标定(3D-VL)是一个新兴领域,旨在将…

《C++避坑神器·十八》运算符重载,小白也能看懂

对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型 1、对于号运算符没有类 类 类,现在要给号赋予对象可以相加的功能 (1)成员函数重载号运算符 (2)全局函数重载号运算符 …

行情分析——加密货币市场大盘走势(11.16)

大饼昨日突然回调诱多上涨到38000附近,现在又重新跌回到37500,现在仓位小的可以加仓入场,而已经有仓位的不要动即可。 空单策略:入场37500附近 止盈34000-32000 止损39000 以太今日可以入场空单2060附近即可 策略:入…

Databend 源码阅读: Storage 概况和 Read Partitions

作者:zhyass | Databend Labs 成员,数据库研发工程师 ❤️ 友情提示:代码演进较快,请注意文档的时效性哦! 引言 Databend 将存储引擎抽象成一个名为 Table 的接口,源码位于 query/catalog/src/table.rs。…

2023年9月 少儿编程 中国电子学会图形化编程等级考试Scratch编程一级真题解析(选择题)

2023年9月scratch编程等级考试一级真题 选择题(共25题,每题2分,共50分) 1、下列哪项内容是不可以修改的 A、角色名称 B、造型名称 C、背景名称 D、舞台名称 答案:D 考点分析:考查scratch相关知识&am…

centos搭建docker镜像Harbor仓库的简明方法

在kubernetes集群中如果要部署springcloud这样的应用,就必须有一个自建的docker镜像中心仓库。 它的目的有两点: 1. 镜像拉取速度快 2. 开发好维护 而Harbor是一个非常好用的docker本地仓库 所以本篇文章来讲讲如何在部署Harbor仓库 首先系统版本最…

tegra nvidia agx xaiver 系统开机自动启动风扇配置方法

确保系统可以连接到互联网!!!!!! 1.更新系统软件源: sudo apt-get update2.安装pip工具 sudo apt-get install python-pip3.安装nvidia对应工具 sudo -H pip install jetson-stats4.打开NVI…

华为eNSP综合实验考试

VLAN信息表 设备名称 端口 链路类型 VLAN 参数 HZ-HZCampus-Agg01-S5731 GE0/0/1 Trunk PVID:1 Allow-pass:10 20 Eth-trunk1(GE0/0/2,0/0/3,0/0/23) Trunk PVID:1 Allow-pass:10 20 GE0/0/24 Access PVID&#xf…

Leetcode 33 搜索旋转排序数组

class Solution {//旋转数组从中间分开&#xff0c;总有一侧是有序的&#xff0c;一侧是无序的//只需要判断是否在有序区间就可以进行二分查找public int search(int[] nums, int target) {int left 0, right nums.length - 1;while(left < right){int mid (left right)…

小红书直播开启新纪元,拓世法宝AI直播一体机助您轻松成为行业标杆!

2023年&#xff0c;小红书终于成功坐上了电商牌桌。 今年3月的“董洁效应”带动了一批品牌商家、博主入驻小红书试水&#xff0c;其直播业务积蓄了巨大势能。10月15日&#xff0c;“初代名媛”章小蕙完成了在小红书的第二场直播&#xff0c;以销售额破亿的成绩打响了小红书双1…

Chrome开发者模式去除时间轴

经常用chrome调试&#xff0c;发现时间轴用的不多&#xff0c;想屏蔽掉。 参考&#xff1a;滑动验证页面 我做了截图记录下

众安保险面试题

文章目录 1.说一下Java内存模型?2.List、Set、Map的区别?3.介绍一下设计模式?4.MySQL存储结构?5.索引失效的场景?6.为什么使用函数索引会失效?7.Spring事务有哪两种?7.1 编程式事务@RestController7.2 声明式事务8.@Transactional实现原理?9.事务如何合并@Transactiona…

卡码网语言基础课 | 12. 位置互换

通过本次练习&#xff0c;将要学习到以下C知识点&#xff1a; 位置互换交换变量字符串 题目&#xff1a;给定一个长度为偶数位的字符串&#xff0c;请编程实现字符串的奇偶位互换。 奇偶位互换是指字符串的奇数位和偶数位相互交换位置 即&#xff1a;第一位和第二位交换&…

服装供应链管理的革新利器—超高频RFID技术

一、行业概述 服装行业一直被视为低技术含量的劳动密集型产业&#xff0c;但实际上&#xff0c;科学技术在整个行业的发展中起着至关重要的作用&#xff0c;从服装面料的制作到服装设计、生产制作、物流到终端销售&#xff0c;科技力量贯穿于每一个环节。然而&#xff0c;传统…

城市生命线丨城市燃气管网监测系统功能效果

11月6日&#xff0c;福建泉州某小区发生煤气闪爆导致1死三伤&#xff0c;这起事故再次为我们敲响了城市燃气管网安全监测的警钟。在城市生命线的建设中&#xff0c;城市燃气管网监测系统以其独特的作用和价值&#xff0c;成为保障城市安全的重要一环。 根据应急管理部《全国城镇…

Flex布局---看一篇就够了

1. flex布局是什么&#xff1f; flex是flexible Box的缩写&#xff0c;用来为盒装模型提供的最大的灵活性&#xff0c;任何一个容器都可以指定为flex布局。Flex布局称为flex容器&#xff0c;所有的子元素为容器成员Flex项目&#xff08;flex item&#xff09;&#xff1b; 当为…

ES7升级、jar包升级、工具类封装,代码改造

一、spring-data-elasticsearch 引入es版本适配 二、jar升级 在项目工程根pom.xml文件中增加maven依赖管理在这里插入图片描述 <properties><elasticsearch.spring.version>4.2.0</elasticsearch.spring.version><elasticsearch.version>7.12.0</e…

JS-项目实战-更新水果单价更新小计更新总计

1、fruit.js //当页面加载完成后执行后面的匿名函数 window.onload function () {//get:获取 Element:元素 By:通过...方式//getElementById()根据id值获取某元素let fruitTbl document.getElementById("fruit_tbl");//table.rows:获取这个表格的所有的行&a…