前端部署后自动检测更新

每当前端部署到服务器后,用户如果不刷新页面总会遇到点击卡住或者点不动的问题,相信很多搞前端的同学都会遇到这种情况,本人也遇到过很多次这种情况,于是就想了个办法,让项目在线上自动检测版本更新,话不多说直接上代码:

第一种办法:定时请求版本文件与本地版本标识对比,如果不想等就自动刷新页面

  1. 在打包工具中每次打包自动写入一个版本文件(我这里用的是vite)
javascript 复制代码
 writeBundle() {
      const timestamp = new Date().toLocaleString() + Math.random().toString(36).substring(2, 7)
      fs.writeFileSync('dist/build-timestamp.txt', timestamp)
      console.log('✅ dist/build-timestamp.txt 写入成功,用于部署后检测更新')
    },
  1. 新建checkVersion.ts文件,定时请求这个文件,如果本地没有版本就自动存到本地
javascript 复制代码
let versionUpdateTimer: number | null = null
let pollingActive = false

async function fetchVersionAndUpdate() {
  try {
    const oldTimestamp = localStorage.getItem('build-timestamp')
    const res = await fetch('/build-timestamp.txt', { cache: 'no-cache' })

    if (!res.ok) {
      throw new Error(`HTTP error! status: ${res.status}`)
    }

    const newTimestamp = await res.text()
    console.log('当前版本时间戳:', newTimestamp)

    if (!oldTimestamp) {
      localStorage.setItem('build-timestamp', newTimestamp)
    }

    if (oldTimestamp !== newTimestamp) {
      localStorage.setItem('build-timestamp', newTimestamp)
      window.location.reload()
    }

    // 请求完成且版本没变,延迟10秒后继续轮询(仅当轮询状态激活时)
    if (pollingActive) {
      versionUpdateTimer = window.setTimeout(fetchVersionAndUpdate, 10 * 1000)
    }
  }
  catch (err) {
    console.error('获取版本失败:', err)
    // 请求失败时延迟15秒重试
    if (pollingActive) {
      versionUpdateTimer = window.setTimeout(fetchVersionAndUpdate, 15 * 1000)
    }
  }
}

function startPolling() {
  if (!pollingActive) {
    pollingActive = true
    console.log('轮询开始')
    fetchVersionAndUpdate() // 立即执行一次
  }
}

function stopPolling() {
  pollingActive = false
  if (versionUpdateTimer !== null) {
    clearTimeout(versionUpdateTimer)
    versionUpdateTimer = null
    console.log('轮询停止')
  }
}

// 根据页面当前状态决定是否开启轮询
if (document.visibilityState === 'visible' && location.hostname !== 'localhost') {
  startPolling()
}

// 监听页面显示/隐藏,动态开启/关闭轮询
document.addEventListener('visibilitychange', () => {
  if (document.visibilityState === 'visible' && location.hostname !== 'localhost') {
    startPolling()
  }
  else {
    stopPolling()
  }
})
  1. 入口文件中导入 checkVersion.ts 文件(如果是vue就是main.ts中)
javascript 复制代码
import '@/utils/checkVersion'

至此就大功告成了,亲测可用哦,相信一定不止这一个方法可以实现,有想法的小伙伴欢迎一起来讨论

相关推荐
愚公移码2 分钟前
蓝凌EKP18产品:流程虚拟机(PVM)
java·开发语言·前端
promiseThen20 分钟前
5 分钟上手 Markdown:标题到表格、代码块与简历实战
前端
web66liang23 分钟前
webpack4+vue2项目使用 sass-embedded 导致的 DockerfIle 构建失败的问题
前端
Larcher24 分钟前
LangChain RAG 排错实录:.env 为什么没有生效
vue.js·后端
Strayer25 分钟前
拓扑管网 3D 可视化大屏demo:科技感(地图 + 拓扑 + 3D 空间)
前端·three.js·数据可视化
葬送的代码人生27 分钟前
从 Vue 到 React:Tailwind CSS 布局 + BFF 代理实战
前端·react.js·架构
摸鱼老王不带833 分钟前
不用后端,纯前端读出"网站眼里你的真实出口 IP"——聊聊 Cloudflare 的 cdn-cgi/trace
前端
程序员黑豆44 分钟前
鸿蒙开发入门:Row 和 Column 布局组件详解
前端·harmonyos
hoLzwEge1 小时前
前端环境变量配置指南:.env 文件详解
前端·前端框架
猫头_1 小时前
AI 流式传输工程指南:有了 EventSource 为何还要 Fetch?
javascript·http·llm