百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

前端如何优雅通知用户刷新页面?

myzbx 2025-03-13 18:16 9 浏览

前言

老板:新的需求不是上线了嘛,怎么用户看到的还是老的页面呀
窝囊废:让用户刷新一下页面,或者清一下缓存
老板:那我得告诉用户,刷新一下页面,或者清一下缓存,才能看到新的页面呀,感觉用户体验不好啊,不能直接刷新页面嘛?
窝囊废:可以解决(OS:一点改的必要没有,用户全是大聪明)

产品介绍

c端需要经常进行一些文案调整,一些老版的文字字眼可能会导致一些舆论问题,所以就需要更新之后刷新页面,让用户看到新的页面。

思考问题为什么产生

项目是基于vue的spa应用,通过nginx代理静态资源,配置了index.html协商缓存,js、css等静态文件Cache-Control,按正常前端重新部署后, 用户重新访问系统,已经是最新的页面。

但是绝大部份用户都是访问页面之后一直停留在此页面,这时候前端部署后,用户就无法看到新的页面,需要用户刷新页面。

产生问题

  • 如果后端接口有更新,前端重新部署后,用户访问老的页面,可能会导致接口报错。
  • 如果前端部署后,用户访问老的页面,可能无法看到新的页面,需要用户刷新页面,用户体验不好。
  • 出现线上bug,修复完后,用户依旧访问老的页面,仍会遇到bug。

解决方案

  1. 前后端配合解决
  • WebSocket
  • SSE(Server-Send-Event)
  1. 纯前端方案 以下示例均以vite+vue3为例;
  • 轮询html Etag/Last-Modified

在App.vue中添加如下代码

Bash
const oldHtmlEtag = ref();
const timer = ref();
const getHtmlEtag = async () => {
  const { protocol, host } = window.location;
  const res = await fetch(`${protocol}//${host}`, {
    headers: {
      "Cache-Control": "no-cache",
    },
  });
  return res.headers.get("Etag");
};

  oldHtmlEtag.value = await getHtmlEtag();
  clearInterval(timer.value);
  timer.value = setInterval(async () => {
    const newHtmlEtag = await getHtmlEtag();
    console.log("---new---", newHtmlEtag);
    if (newHtmlEtag !== oldHtmlEtag.value) {
      Modal.destroyAll();
      Modal.confirm({
        title: "检测到新版本,是否更新?",
        content: "新版本内容:",
        okText: "更新",
        cancelText: "取消",
        onOk: () => {
          window.location.reload();
        },
      });
    }
  }, 30000);
  • versionData.json

自定义plugin,项目根目录创建
/plugins/vitePluginCheckVersion.ts

Bash
import path from "path";
import fs from "fs";
export function checkVersion(version: string) {
  return {
    name: "vite-plugin-check-version",
    buildStart() {
      const now = new Date().getTime();
      const version = {
        version: now,
      };
      const versionPath = path.join(__dirname, "../public/versionData.json");
      fs.writeFileSync(versionPath, JSON.stringify(version), "utf8", (err) => {
        if (err) {
          console.log("写入失败");
        } else {
          console.log("写入成功");
        }
      });
    },
  };
}

在vite.config.ts中引入插件

import { checkVersion } from "./plugins/vitePluginCheckVersion";
plugins: [
  vue(),
  checkVersion(),
]

在App.vue中添加如下代码

const timer = ref()
const checkUpdate = async () => {
  let res = await fetch('/versionData.json', {
    headers: {
      'Cache-Control': 'no-cache',
    },
  }).then((r) => r.json())
  if (!localStorage.getItem('demo_version')) {
    localStorage.setItem('demo_version', res.version)
  } else {
    if (res.version !== localStorage.getItem('demo_version')) {
      localStorage.setItem('demo_version', res.version)
      Modal.confirm({
        title: '检测到新版本,是否更新?',
        content: '新版本内容:' + res.content,
        okText: '更新',
        cancelText: '取消',
        onOk: () => {
          window.location.reload()
        },
      })
    }
  }
}

onMounted(()=>{
  clearInterval(timer.value)
  timer.value = setInterval(async () => {
   checkUpdate()
  }, 30000)
})
  • plugin-web-update-notification

Use

// vite.config.ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { webUpdateNotice } from '@plugin-web-update-notification/vite'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    vue(),
    webUpdateNotice({
      logVersion: true,
    }),
  ]
})

附:前端面试资料分享(八股文及场景题)

有想要的朋友:点赞后,私信【前端】免费领取完整版

相关推荐

js实现一款简单踩白块小游戏(曾经很火)

效果图如下所示:htmljscss总结以上所述是小编给大家介绍的js实现一款简单踩白块小游戏,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对小编的支持!...

腾讯游戏健康系统怎么解除 腾讯游戏健康系统解除解绑官网

[海峡网]腾讯游戏健康系统怎么解除?腾讯游戏健康系统解除解绑官网是多少?不少玩家都想解除腾讯游戏健康系统!那么是否有方法呢?下面,就来看看官方是怎么说的吧!腾讯游戏健康系统怎么解除?目前腾讯游戏健康系...

Grok 现在可以生成文档、代码和浏览器游戏

xAI宣布新增一款名为“GrokStudio”的新工具,该工具允许用户创建和编辑文档及代码,甚至可以生成基本的浏览器游戏。该公司在其官方X账号的一篇文章中表示,该功能可供Grok.com上的免...

世界首款程序猿专属游戏公布 地狱级难度让人抓狂!

似乎大家对于程序员的印象都很固定,如果硬要用一个词来形容这份工作,“苦逼”肯定可以入选,关于这些IT从业人员的段子也是一抓一大把,在这里就不再伤害那些网络工程师脆弱的小心灵了,近日一款专门为这些程序...

游戏开发之旅-JavaScript原型类构建

本节是第四讲的第十五小节,上一节我们为大家介绍了JavaScript面向对象编程(OOP)的基础概念,本节为大家介绍原型链的原理以及如何构造原型类。基于原型的语言(Prototype-BasedLa...

打游戏了!解锁编程学习新姿势,极空间部署『CodeCombat』

打游戏了!解锁编程学习新姿势,极空间部署『CodeCombat』哈喽小伙伴们好,我是Stark-C~这几年的AI大火,让大家再次看到了互联网科技的神奇与魅力。考虑到今后各大行业的发展方向,编程已成为许...

DeepSeek如何写在线游戏?附带提示词,直接拿去用!

想做一个属于自己的小游戏网站?不会写代码也没关系,现在你只需要一个工具:DeepSeek大模型!它不仅能帮你写网页,还能一口气搞定贪吃蛇、2048、飞机大战等小游戏!关键是:完全免费,还能中文交流!新...

微信小游戏的开发方式及特点

微信小游戏是基于微信小程序的一个新增类目,它结合了H5游戏和微信社交的优势,为开发者提供了一个快速、便捷的开发游戏平台。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。开发方式微信小游...

DeepSeek最新玩法,5分钟搭建html实用工具

大家好,我是程序员小灰。说起AI编程,早已不是一个新鲜的概念。早在2023年初,小灰就曾经尝试利用GPT-4帮我生成Python小游戏的代码。到了2024年,随着Cursor等AI编程工具的兴起,AI...

网页游戏的开发流程

网页游戏的开发流程可以根据项目的规模和复杂性而有所不同,但通常包括以下一般步骤,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。1.需求分析:确定游戏的概念、目标受...

最热的第三人称射击单机游戏分享

在这个快节奏的时代,第三人称射击游戏已经成为了许多玩家的最爱。而单机游戏更是其中的佼佼者,它们拥有着更加丰富的情节和精美的画面。今天我们要分享的是一款最热的第三人称射击单机游戏。这款游戏名为《使命召唤...

十款免费的第三人称射击单机游戏分享

本文将为大家推荐十款免费的第三人称射击单机游戏,这些游戏不仅免费,而且质量上乘,值得玩家们一试。从经典之作到新近大作,从PC端到移动平台,涵盖了各种类型和风格的游戏。无论你是喜欢动作射击还是喜欢策略战...

推荐一些有趣的在线编程游戏,让你学习编程事半功倍

▌Robocode让坦克们互相博弈的游戏,你可以看到它们飞奔,碾碎一切挡道的东西。机器人配有雷达与火炮,选手在躲避对手进攻的同时攻击对手,以此来较量得分的多少。这个游戏很有意思,曾经令我沉迷…你可以用...

用DEEPSEEK 写的小游戏,直接运行太牛了!~

由于DEEPSEEK服务器繁忙,通过OLLAMA来部署各种大模型都可以,电脑配置不够高,能用DEEPSEEKR114B,也只能在CMD下运行,AI可视化软件Chatbox跑不动,具体写内容如下&g...

2021年游戏项目的十大编程语言:C++、Java、Net均上榜

前两天在某平台刷到了大家讨论腾讯游戏相关开发是不是真的薪资很高,然后就看到了Analticslnsight发布关于2021年游戏项目的十大编程语言。C++C++的效率做游戏是一个很重要的原因,近年来...