Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

【更新提醒】Web 实现更新提醒 #23

Closed
z0ffy opened this issue Nov 26, 2024 · 0 comments
Closed

【更新提醒】Web 实现更新提醒 #23

z0ffy opened this issue Nov 26, 2024 · 0 comments

Comments

@z0ffy
Copy link
Owner

z0ffy commented Nov 26, 2024

在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) -> 服务器。
      • 方案一无问题
      • 方案二则会发生:触发了更新提醒,但是刷新后依旧显示旧页面的问题。原因是因为静态资源更新时入口文件并为更新,此时如果刷新页面,则还是旧版本入口文件。因此需要增加逻辑判断,当入口文件中的标识与更新标记文件中的标识一致时才会触发更新。
@z0ffy z0ffy closed this as completed Nov 26, 2024
@z0ffy z0ffy changed the title 【更新提醒】Web实现更新提醒 【更新提醒】Web 实现更新提醒 Jan 1, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant