【更新提醒】Web 实现更新提醒
2024年11月26日1月1日

在web项目日常更新中经常会遇到,代码更新后用户无感知。导致功能异常或者体验不到新功能。

因此需要更新提醒机制来主动告知用户,系统有更新需要重新加载。

以下方案暂不考虑轮询引起的压力问题。

基本原理:请求远端标记与当前标记做判断,不一致则更新。

方案一:请求静态文件

  • 在 vue,react 等项目打包完成之后会生成静态js文件。
  • js文件名称格式一般为 name+hash.ext,因此可以利用hash来进行判断是否有更新。
  • 轮询请求入口html文件。利用正则获取 例如app_hash.js中的hash值,与当前文件中的hash值做比对,如果一致说明无更新,如果不一致给出更新提醒。

优势

  • 纯依赖前端,快
  • 无需进行环境区分,直接请求当前环境文件即可

不足

  • 无法进行更精细化管理。只要hash不一致就会给出提醒
  • 更新后 hash 如果未发生变化,则会视为无更新

方案二:请求约定文件

  • 在打包完成后,在固定位置以及html中生成更新标记文件(更新标记的生成可由自动化脚本完成,更新标记可视情况决定是否需要),更新标记需包含以下内容
    • 标识:版本号、commit id或其他
    • 环境:dev、pro或其他
  • 轮询请求更新标记,按照环境获取对应的标识与入口html中的标识来进行判断是否需要触发更新。

优势

  • 解决方案一的不足
  • 不受项目限制,可按约定全项目通用

不足

  • 更新标记生成需要额外成本

注意

  • 在请求静态文件或者更新标记时 GET 请求会有缓存,导致文件内容不更新
    • 可在请求url后增加 _t 参数,参数值为时间戳
    • 更换 POST 请求
  • 部署方式不同可能会导致异常
    • 部署方式一:(入口html,静态资源)-> 服务器。一起更新则无问题。
    • 部署方式二:(静态资源)-> oss -> (入口html) -> 服务器。
      • 方案一无问题
      • 方案二则会发生:触发了更新提醒,但是刷新后依旧显示旧页面的问题。原因是因为静态资源更新时入口文件并为更新,此时如果刷新页面,则还是旧版本入口文件。因此需要增加逻辑判断,当入口文件中的标识与更新标记文件中的标识一致时才会触发更新。

cd ..
©2025All rights reserved by z0ffy.