前端项目部署自动检测更新后通知用户刷新页面(前端实现,技术框架vue、js、webpack)——方案二:轮询去判断服务端的index.html是否跟当前的index.html的脚本hash值一样

这篇具有很好参考价值的文章主要介绍了前端项目部署自动检测更新后通知用户刷新页面(前端实现,技术框架vue、js、webpack)——方案二:轮询去判断服务端的index.html是否跟当前的index.html的脚本hash值一样。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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

技术框架

vue、js、webpack

解决方案

  • 根据打完包之后生成的script src 的hash值去判断,每次打包都会生成唯一的hash值,只要轮询去判断不一样了,那一定是重新部署了
    vue生成环境中监测服务器代码发生更新之后刷新页面,javascript,前端,html,vue
  • 轮询(20s、自己设定时间)服务器的index.html 文件,将新的script数组与旧script数组比较数组内容是否一致(可以将新旧数组拼接后去重,若去重后的数组长度,与旧数组长度不一样,则说明重新部署了),若新旧数组不一致则通知用户刷新页面
  • 通过监听visibilitychange事件,在页面隐藏时停止轮询,页面显示立马检测一次更新
  • 检测到更新后,停止轮询

vue生成环境中监测服务器代码发生更新之后刷新页面,javascript,前端,html,vue

(感兴趣的还可去看方案一:编译项目时动态生成一个记录版本号的文件,轮询请求该文件。)

效果

页面右下角提示更新:

vue生成环境中监测服务器代码发生更新之后刷新页面,javascript,前端,html,vue

代码实现 

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

/*
 * @Description: 自动更新
 */

// const timeData = 60 * 1000 // 检查间隔时间
const timeData = 20 * 1000 // 检查间隔时间
let hidden = false // 页面是否隐藏
let setTimeoutId
let needTip = true // 默认开启提示

let oldScript = []
let newScript  = []

const getHtml = async () => {
  const html = await fetch('/').then(res => res.text()) //读取index html
  return html
}

// const scriptReg = /<script.*src=["'](?<src>[^"']+)/gm

const parserScript = (html) => {
  const reg = new RegExp(/<script(?:\s+[^>]*)?>(.*?)<\/script\s*>/ig) //script正则
  return html.match(reg) //匹配script标签
}


const init = async () =>{
  const html = await getHtml()
  // console.log("🚀 ~ file: auto-update.js:31 ~ init ~ html:", html)
  oldScript = parserScript(html)
  console.log("🚀 ~ file: auto-update.js:30 ~ init ~ oldScript:", oldScript)
}

const compareScript = async (oldArr, newArr) => {
  console.log('***************compareScript**************')
  console.log("🚀 ~ file: auto-update.js:37 ~ compareScript ~ oldArr, newArr:", oldArr, newArr)
  const base = oldArr.length
  console.log("🚀 ~ file: auto-update.js:36 ~ compareScript ~ base:", base)
  // 去重
  const arr = Array.from(new Set(oldArr.concat(newArr)))
  console.log("🚀 ~ file: auto-update.js:39 ~ compareScript ~ arr:", arr, arr.length)
  let needRefresh = false
  // 如果新旧length 一样无更新
  // 否则通知更新
  if (arr.length !== base) {
    console.warn('更新了!!!!!!, arr.length !== base', arr.length !== base)
    needRefresh = true
  }
  // for (let i = 0; i < oldArr.length; i++) {
  //   if (oldArr[i] !== arr[i]) {
  //     needRefresh = true
  //     console.warn('更新了!!!!!!, 值不等')
  //     break
  //   }
  // }
  return needRefresh
}


// 自动更新
const autoUpdate = async () => {
  setTimeoutId = setTimeout(async () => {
    const newHtml = await getHtml()
    // console.log("🚀 ~ file: auto-update.js:89 ~ newHtml:", newHtml)
    newScript = parserScript(newHtml)
    console.log("🚀 ~ file: auto-update.js:79 ~ newScript:", newScript)

    // 页面隐藏了就不检查更新
    if (!hidden) {
      const willRefresh = await compareScript(oldScript, newScript)
      console.log("🚀 ~ file: auto-update.js:85 ~ setTimeoutId=setTimeout ~ willRefresh:", willRefresh)

      if (willRefresh && needTip) {
        // 延时更新,防止部署未完成用户就刷新空白
        setTimeout(()=>{

          // ----弹框确认---先简单点弹框确认,可以用注释内的,跳过右下角通知的内容(Step2、3)
          // 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 () => {
  init()
  console.log('start0000000000')
  autoUpdate()
  console.log('start1111111111')
  // 监听页面是否隐藏
  document.addEventListener('visibilitychange', () => {
    hidden = document.hidden
    console.log("🚀 ~ file: auto-update.js:64 ~ document.addEventListener ~ hidden, needTip:", hidden, needTip)
    // 页面隐藏了就不检查更新。或者已经有一个提示框了,防止重复提示。
    if (!hidden && needTip) {
      console.log('!!!checkupdate', '222222222');
      autoUpdate()
    } else {
      stop()
    }
  })
}

export default { start }

vue生成环境中监测服务器代码发生更新之后刷新页面,javascript,前端,html,vue

Step2:编写模板 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: '',
    },
  },
  data() {
    return {};
  },
  created() {},
  methods: {
    // 点击确定更新
    onSubmit() {
      location.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>

Step3: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.version
          this.$notify({
            title: "版本更新提示",
            duration: 0,
            position: "bottom-right",
            dangerouslyUseHTMLString: true,
            message: this.$createElement("CnNotify", {
              // 使用自定义组件
              ref: "CnNotify",
              props: {
                msg: msg,
                version: version
              },
            }),
            customClass:'versionNotifyStyle', //自定义类名
          })
        })
      },
  },
}
</script>

 Step4:在 main.js 内使用文章来源地址https://www.toymoban.com/news/detail-818126.html

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

到了这里,关于前端项目部署自动检测更新后通知用户刷新页面(前端实现,技术框架vue、js、webpack)——方案二:轮询去判断服务端的index.html是否跟当前的index.html的脚本hash值一样的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端线上部署,如何通知用户有新版本

    version-polling  是一个轻量级的  JavaScript  库,它可以实时检测  web  应用的  index.html  文件内容是否有变化。当服务端发布新版本后,前端会自动弹出更新提示,让用户刷新页面,以加载最新的资源和功能。这样可以提高用户体验和数据准确性。 为了解决后端部署之后,如

    2024年02月08日
    浏览(13)
  • nginx部署前端项目后刷新浏览器报错404

    问题: Vue项目打包部署Nginx服务器后,刷新页面后出现404的问题。 原因: 加载单页应用后路由改变均由浏览器处理,而刷新时将会请求当前的链接,而Nginx无法找到对应的页面。 解决:在Nginx配置文件nginx.conf中加入如下配置:  try_files $uri $uri/ /index.html; # 变量解释 try_fil

    2024年02月12日
    浏览(12)
  • 前端项目自动化部署

    一、Git仓库管理项目 二、购买云服务器 三、搭建服务器环境(重点) 四、Jenkins进行自动化部署(重点) 提示:本地项目自动化部署流程,如下图 一、Git仓库管理项目 Git的安装和配置在这里就不做说明了 1、首先在Git仓库中创建一个仓库,用来保存本地项目,这里使用Git

    2024年02月15日
    浏览(18)
  • 如何屏蔽 iOS 16 软件自动更新,去除更新通知和标记

    如何禁用 iPhone、iPad 和 Apple Watch 软件自动更新。适用于 iOS、iPadOS 和 watchOS,即 iPhone、iPad 和 Apple Watch 通用。 请访问原文链接:https://sysin.org/blog/disable-ios-update/,查看最新版。原创作品,转载请保留出处。 作者主页:www.sysin.org 2023.09.19,iOS 17/iPadOS 17/watchOS 10 发布了,同样适

    2024年02月05日
    浏览(17)
  • 如何屏蔽 iOS 17 软件自动更新,去除更新通知和标记

    如何屏蔽 iOS 软件自动更新,去除更新通知和标记 适用于 iOS、iPadOS 和 watchOS,即 iPhone、iPad 和 Apple Watch 通用。 请访问原文链接:https://sysin.org/blog/disable-ios-update/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org 2023.12.25 更新:描述文件暂时过期, 请查看 2.4

    2024年02月07日
    浏览(10)
  • WebSocket实现后端数据变化,通知前端实时更新数据

    背景 ​ 项目中需要做一个消息提示功能,当有用户处理相关待办信息后,别的用户需要实时更新处理后的待办信息。 解决方案: ​ 1、使用最原始的方法,写个定时器去查询待办信息。但这种方式在大多数情况是不被允许的,它会浪费系统中的许多资源,同时也并不是完全

    2024年04月15日
    浏览(12)
  • Jenkins自动化构建部署前端项目(Linux+gitee)

    本文讲述了Jenkins自动化构建部署前端项目,内容包括Linux系统安装Jenkins、如何配置构建项目并发布到目标服务器。 因公司系统项目众多,前端项目打包麻烦,项目代码管理混乱,因此需要gitee+Jenkins做自动化构建,优化项目打包流程及代码管理。 本次教程可实现最简单的自动

    2024年02月03日
    浏览(17)
  • Vite实现版本更新检查,实现页面自动刷新

    前端版本更新检查,实现页面自动刷新 使用 vite 对项目进行打包,对 js 和 css 文件使用了 chunkhash 进行了文件缓存控制,但是项目的 index.html 文件在版本频繁迭代更新时,会存在被浏览器缓存的情况。 在发版后,如果用户不强制刷新页面,浏览器会使用旧的 index.html 文件,在

    2024年02月09日
    浏览(12)
  • 前端项目打包和自动化部署(jenkins+gitee+nginx)

    1. 传统的开发模式 在传统的开发模式中,开发的整个过程是按部就班就行: 但是这种模式存在很大的弊端: 工作的不协调:开发人员在开发阶段,测试和运维人员其实是处于等待的状态。等到测试阶段,开发人员等待测试反馈bug,也会处于等待状态。 线上bug的隐患:项目准

    2024年02月01日
    浏览(15)
  • Gitlab CI/CD 自动化打包部署前端(vue)项目

    一、虚拟机安装 1.vmware下载 2.镜像下载 3.Ubuntu 4.新建虚拟机 一直点下一步,直到点击完成。 5.分配镜像 二、Gitlab CI/CD 自动化部署项目 1.配置GitLab CI/CD: 2.生成SSH密钥对: 如果尚未生成,请在本地机器上生成一个SSH密钥对: 3.将SSH私钥添加到GitLab: 4.更新GitLab CI/CD配置: 5

    2024年03月13日
    浏览(20)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包