请问线上 web 项目如何自动更新?

2022-11-27 21:12:24 +08:00
 karott7
比如用户正在访问我的项目,然后我发布代码更新版本,想知道如何在用户不点击刷新或者不重开网页的情况下让用户获取最新版本代码?
5193 次点击
所在节点    程序员
54 条回复
neoblackcap
2022-11-27 21:17:03 +08:00
使用 websocket 与服务器保持连接,然后监听版本变更。如果版本变动符合更新条件,那么就触发更新动作( js 主动刷新页面,或者 popup 告知用户,甚至你自己在代码做好热更新)
karott7
2022-11-27 21:21:04 +08:00
@neoblackcap 不至于用上 websocket 吧,这成本也太高了。
karott7
2022-11-27 21:23:13 +08:00
@neoblackcap 请问线上代码怎么做热更新?
Puteulanus
2022-11-27 21:31:22 +08:00
热更新也不是说客户端连重载都不用吧
karott7
2022-11-27 21:41:21 +08:00
@Puteulanus 应该要重载,我想不出怎么在不重载的情况下更新某个 js 或者 css 文件
kaneg
2022-11-27 21:55:15 +08:00
这毕竟是个 WEB 项目, 你们真的需要一发布所有用户立即就更新到最新版吗?
一般来说用户在各个链接跳转过程中就不知不觉到新的版本了,最差第二天重新登录。
karott7
2022-11-27 22:08:14 +08:00
@kaneg 这个方案的场景当然不是针对 toC 的,是针对后台管理以及自动售卖机等项目的,毕竟每次发布都通知别人刷新浏览器不太方便。
比如盒马的自动售卖机,一个城市有十几二十台机器,如果能做到自动更新,有两个好处:1. 不用担心白天用户使用的时候发布代码后用户还在使用老版本 2. 不用通知工作人员重启应用
blankmiss
2022-11-27 22:12:46 +08:00
用灰度发布去平滑更新?
dcsuibian
2022-11-27 22:14:40 +08:00
轮询,发现有新版本了就刷新一下呗。
如果是自动售货机的话,就等一段时间没有用户操作了再更新。
karott7
2022-11-27 22:15:36 +08:00
@dcsuibian 请求怎么做版本判断?
dcsuibian
2022-11-27 22:15:56 +08:00
还有你这更新过程会不会把系统自己搞崩掉啊
比如你直接用 js 做刷新,结果刷新那一会儿网不好,直接页面都没了
karott7
2022-11-27 22:19:32 +08:00
@blankmiss 我想过,其实不会,因为有 http 缓存配合,更新版本一般只更新几个文件,没更新的文件会走缓存。我不会也不想存任何文件在 storage 里;再说网络不好,那请求也走不通,那得不好页面也没事。
你的方案和我想的一样,轮训,然后等用户没操作了就主动刷新浏览器。但我想知道你是如何去知道有版本更新的?
dcsuibian
2022-11-27 22:20:00 +08:00
@karott7 留个链接,每次返回最新的版本号?我感觉跟现在的不一样就可以刷新了吧
或者跟 npm 那种语义化版本号,大版本更新?
qq976739120
2022-11-27 22:37:03 +08:00
git pull
kill
build
nohup xxxxx
啊哈哈哈哈哈哈哈
ryougifujino
2022-11-27 23:18:15 +08:00
如果是纯 SPA 的话,肯定就得刷新才能更新,因为得更新 index.html 上的引入 js 的那部分代码。要么客户自己刷新,要么就推送或轮询后检测到新版本自动刷新。至于检测方式,你可以在服务器上写一个函数,功能就是对比新旧 index 的内容 hash ,如果不一致的话就代表需要更新,都不需要版本号。
ixixi
2022-11-28 00:02:15 +08:00
不重启的,每天晚上强制刷新一次。
kingjpa
2022-11-28 00:22:47 +08:00
做过售货机项目。
用的是 mqtt ,设备开机后会订阅很多事件,发生了执行重启 刷新 出货 拉取广告等。

轮询的话 流量消耗成本太高,售货机都是物联网卡
Features
2022-11-28 00:39:04 +08:00
不明白,websocket 成本怎么会高呢?
websocket 应该是浏览器开销最低的连接了吧?
okakuyang
2022-11-28 00:53:23 +08:00
@Features websocket 是即时性非常高的,所以会一直发送心跳,服务端也要有一个线程来维持这个连接。
neoblackcap
2022-11-28 01:03:30 +08:00
@karott7 你只要确定模块并没有在使用的情况下,把所有的依赖全部更新,并在新的交互或者请求发生时,启用新的模块就可以了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/898339

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX