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


    1. const { writeFile, mkdir, existsSync } = require('fs')
    2. // 动态生成版本号
    3. const createVersion = () => {
    4. // mkdir('./dist', { recursive: true }, (err) => {
    5. //检测dist目录是否存在
    6. if (existsSync('./dist')) {
    7. writeFile(`./dist/version.json`, `{"version":"${Date.now()}"}`, (err) => {
    8. if (err) {
    9. console.log('写入version.json失败')
    10. console.log(err)
    11. } else {
    12. console.log('写入version.json成功')
    13. }
    14. })
    15. } else {
    16. setTimeout(createVersion, 1000)
    17. }
    18. // })
    19. }
    20. setTimeout(createVersion, 10000)

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

    第一种

    1. // auto-update.js
    2. /*
    3. * @Description: 自动更新
    4. */
    5. import Vue from 'vue'
    6. import Modal from './updateModal.vue'
    7. let currentVersion // 当前版本
    8. let hidden = false // 页面是否隐藏
    9. let setTimeoutId
    10. // 获取版本号
    11. const getVersion = async () => {
    12. return fetch(process.env.VUE_APP_BASE_URL + 'version.json?timestep=' + Date.now()).then(res => res.json())
    13. }
    14. // 检查更新
    15. const checkUpdate = async () => {
    16. const version = (await getVersion()).version
    17. if (Number(version) > Number(currentVersion)) {
    18. const result = confirm('发现新版本,点击确定更新')
    19. if (result) {
    20. location.reload() // 刷新当前页
    21. }
    22. }
    23. }
    24. // 自动更新
    25. const autoUpdate = async () => {
    26. setTimeoutId = setTimeout(async () => {
    27. console.log(setTimeoutId, '这是个检查自动更新的定时器')
    28. // 页面隐藏了就不检查更新
    29. if (!hidden) {
    30. checkUpdate()
    31. }
    32. autoUpdate()
    33. }, 10 * 1000)
    34. }
    35. // 停止检测更新
    36. const stop = () => {
    37. if (setTimeoutId) {
    38. clearTimeout(setTimeoutId)
    39. setTimeoutId = ''
    40. }
    41. }
    42. // 开始检查更新
    43. const start = async () => {
    44. currentVersion = (await getVersion()).version
    45. autoUpdate()
    46. // 监听页面是否隐藏
    47. document.addEventListener('visibilitychange', () => {
    48. console.log(document.hidden, '能监听到啥')
    49. hidden = document.hidden
    50. if (hidden) {
    51. stop()
    52. } else {
    53. checkUpdate()
    54. autoUpdate()
    55. }
    56. })
    57. }
    58. export default { start }

    第二种

    1. // update.worker.js, 我放在了public下
    2. let currentVersion // 当前版本
    3. let hidden = false // 页面是否隐藏
    4. let setIntervalId
    5. // 获取版本号
    6. const getVersion = async () => {
    7. // return fetch('http://localhost:8080/version.json?timestep=' + Date.now()).then(res => res.json())
    8. // const url = window.location.origin // 无法读取window
    9. return fetch('https://xxxx.com/version.json?timestep=' + Date.now()).then(res => res.json(), { cache: 'no-store' })
    10. }
    11. // 检查更新
    12. const checkUpdate = async () => {
    13. let isUpdate = false
    14. const version = (await getVersion()).version
    15. if (Number(version) > Number(currentVersion)) {
    16. console.log('发现新版本,点击确定更新--update.worker.js')
    17. return (isUpdate = true)
    18. } else {
    19. return (isUpdate = false)
    20. }
    21. }
    22. // 停止检测更新
    23. const stop = () => {
    24. if (setIntervalId) {
    25. clearInterval(setIntervalId)
    26. setIntervalId = ''
    27. }
    28. }
    29. self.onmessage = async event => {
    30. var data = event.data
    31. currentVersion = (await getVersion()).version
    32. if (data.pageVisibility) {
    33. stop()
    34. return
    35. }
    36. setIntervalId = setInterval(async () => {
    37. const isUpdate = await checkUpdate()
    38. if (isUpdate) {
    39. stop()
    40. self.postMessage({
    41. isUpdate: true
    42. })
    43. }
    44. }, 5 * 1000)
    45. console.log(data, '子线程worker.js')
    46. }

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

    1. var worker = new Worker('http://localhost:8080/update.worker.js')
    2. const url = window.location.origin
    3. var worker = new Worker(url + 'update.worker.js')
    4. // var worker = new Worker('/update.worker.js')
    5. let data = { pageVisibility: false }
    6. worker.postMessage(data)
    7. worker.onmessage = function(event) {
    8. console.log(event.data, 'worker主线程1')
    9. if (event.data?.isUpdate) {
    10. // const result = confirm('发现新版本,点击确定更新')
    11. // if (result) {
    12. // // location.reload(true) // 刷新当前页
    13. // // window.location.reload(true)
    14. // window.location.replace(window.location.href)
    15. // }
    16. Notification({
    17. title: '页面更新提示',
    18. message: '网页内容有更新,请按shift+F5刷新页面',
    19. duration: 0,
    20. type: 'success',
    21. onClose: () => {}
    22. })
    23. worker.terminate()
    24. }
    25. }
    26. worker.onerror = function(event) {
    27. console.log(event)
    28. // console.error(event.filename + ':' + event.message)
    29. //如果发生错误,立即终止代码
    30. worker.terminate()
    31. }
    32. // 监听页面是否隐藏
    33. document.addEventListener('visibilitychange', () => {
    34. console.log(document.hidden, '能监听到啥-html')
    35. let hidden = document.hidden
    36. data.pageVisibility = hidden
    37. })

  • 相关阅读:
    第七章认识Express框架
    clickhouse--join操作汇总【semi、anti、any、asof、global、colocate、cross】
    SpringBoot设置动态定时任务
    烟花爆竹厂如何做到0风险0爆炸事故?AI+视频监控平台给出答案
    [蓝桥杯 2022 省 B] 刷题统计
    scala的schema函数(算子)
    基于Java汽车服务商城系统 设计实现(源码+lw+部署文档+讲解等)
    Java 与 Go:数字和字符串的相互转换
    CART 算法——决策树
    数据仓库理论篇
  • 原文地址:https://blog.csdn.net/jingruoannan/article/details/134447829