vue项目发版,前端页面自动提示用户刷新页面

背景:由于前端发版用户不及时刷新页面就会造成你看到的页面其实是发版之前的页面,需要每次手动刷新,现在封装2个方法,当有前端代码更新,自动提示用户手动刷新

首先,根目录下创建两个js文件,比如version-update.js这是更新用的,version.js这个是将特定标识写入项目中,以此来区分项目是否更新

version代码如下:
 

// npm build version
const vueconfig = require('./vue.config.js')
const packageConfig = require('./package.json')

const VERSION_NO = packageConfig.version || ''

const dist_path = `./${vueconfig.outputDir}/homepage.html`

// 获取dist中homepage页面,并在其中写入版本号
const fs = require('fs')
const path = require('path')
const distPath = path.join(__dirname, dist_path)
let htmlContent = fs.readFileSync(distPath, 'utf8')
htmlContent = htmlContent.replace('<head>', `<head><meta name="version_no" content="${VERSION_NO}" >`)
fs.writeFileSync(distPath, htmlContent, 'utf8')

// eslint-disable-next-line no-console
console.log('[ 版本打包成功 ] >', VERSION_NO)

module.exports = VERSION_NO

version-update.js代码如下:

// 版本升级校验

import { MessageBox } from 'element-ui'

// 缓存版本号
let version_no = void 0
// 请求html地址
const fetchUrl = process.env.VUE_APP_PUBLIC_PATH || '/'

const WAIT_TIME = 60 * 1000 // 版本获取间隔时间,每WAIT_TIME请求一次
// message弹窗
let isMessage = false

const setVersionNo = (versionNo) => {
  version_no = versionNo
}

const getVersionNo = () => {
  return version_no
}

/**
 * 清空缓存,重新请求
 * @param {string} newVersion
 */
const refreshCache = (newVersion) => {
  // 先请求一次页面,设置不缓存,获取最新的html
  fetch(`${fetchUrl}?time=${new Date().getTime()}`, { cache: 'no-store' }).finally(() => {
    isMessage = false
    setVersionNo(newVersion)
    // 刷新页面
    window.location.reload()
  })
}

/**
 * 请求页面,获取版本并比对
 */
const fetchNewVersion = () => {
  // 在 js 中请求首页地址不会更新页面
  fetch(`${fetchUrl}?time=${new Date().getTime()}`, { cache: 'no-store' })
    .then((res) => res.text())
    .then((text) => {
      const oldVersion = getVersionNo()
      const el = document.createElement('html')
      el.innerHTML = text
      const htmlMeta = el.querySelector('meta[name="version_no"]')
      if (!htmlMeta) return
      const newVersion = htmlMeta.getAttribute('content')
      if (newVersion !== oldVersion && !isMessage) {
        isMessage = true
        MessageBox.alert('发现新版本,请刷新页面后使用', {
          type: 'warning',
          showClose: false,
          confirmButtonText: '立即刷新',
          customClass: 'token-massage-alert',
          callback: () => {
            refreshCache(newVersion)
          }
        })
      }
    })
    .catch((err) => {
      // eslint-disable-next-line no-console
      console.log('[ err ] >', err)
    })
}
fetchNewVersion()

setInterval(() => {
  fetchNewVersion()
}, WAIT_TIME)

/**
 * 设置当前版本号
 */
const getCurrentVersionNo = () => {
  const htmlMeta = document.querySelector("meta[name='version_no']")
  // 获取content的版本号
  const versionNo = htmlMeta?.getAttribute('content')
  setVersionNo(versionNo)
}

getCurrentVersionNo()

然后在main.js中引用即可

import '../version-update'

最后效果如图:

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue项目前端页面模板是指在Vue框架中,用于展示用户界面的模板文件。Vue采用了基于组件的开发模式,通过将一个页面拆分成多个组件,并在模板中使用这些组件来构建整个页面。 在Vue中,我们可以使用两种不同的方式来创建前端页面模板,即基于Vue单文件组件的方式和基于传统HTML文件的方式。 基于Vue单文件组件的方式,我们可以将页面的HTML、CSS和Javascript代码写在一个.vue文件中。这种方式能够提高代码的可维护性和复用性,同时还支持对应用进行细粒度的模块化管理。 基于传统HTML文件的方式,我们可以在HTML文件中直接嵌入Vue的模板语法,并将相关的逻辑代码写在对应的Javascript文件中。这种方式更加简单直接,适用于一些简单的页面项目。 无论使用哪种方式,我们都可以在模板中使用Vue的指令和插值表达式来实现动态数据绑定、事件绑定和条件渲染等功能。通过Vue的响应式机制,数据的改变会自动反应到页面上,保持页面与数据的实时同步。 此外,Vue还提供了丰富的UI组件库,例如Element UI和Vuetify,可以方便地引入和使用这些组件来加速页面开发。 总之,Vue项目前端页面模板是用于展示用户界面的文件,可以使用基于Vue单文件组件或传统HTML文件的方式来创建,通过Vue的指令和插值表达式实现动态数据绑定和事件绑定,以及通过UI组件库来快速搭建页面

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值