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

2022-11-27 21:12:24 +08:00
 karott7
比如用户正在访问我的项目,然后我发布代码更新版本,想知道如何在用户不点击刷新或者不重开网页的情况下让用户获取最新版本代码?
4950 次点击
所在节点    程序员
54 条回复
poembre
2022-11-28 17:30:46 +08:00
客户端 websocket 做个 断线重连, 服务端直接重启进程
Finnn
2022-11-28 17:39:45 +08:00
完成这个需求其实用 websocket 并不常见, 多的是 service worker
Finnn
2022-11-28 17:41:09 +08:00
@Finnn 像 Vue 文档官网这些之前有更新提示, 最新版也砍掉了
star7th
2022-11-28 20:37:49 +08:00
本质是个假需求。web 项目不需要那么实时的自动更新。跑一个五分钟轮询一遍的任务即可。也不用上 websocket ,免得带来太大的并发成本
weixiangzhe
2022-11-29 09:15:15 +08:00
我们只处理了 import('./page/a.js') 失败的情况,加载失败进入错误页,错误页上有个刷新按钮,点击 location.reload()
shengchao
2022-11-29 10:05:16 +08:00
问题是你这个售货机的浏览器带 service worker 吗?
karott7
2022-11-29 10:59:31 +08:00
@shengchao 不需要用 service worker ,我就用 fetch('/') 方法每五分钟请求一次,拿到响应头 etag 对比一下,不一样的话就表示版本更新,然后我在适当的时机 location.reload() 就更新版本了
karott7
2022-11-29 11:00:17 +08:00
@star7th 也不能说是假需求,只能说场景有限,自动售货机是一个场景
janus77
2022-11-29 14:43:28 +08:00
既然你的场景是自动售货机,那么售货机在无人使用的时候都是有个类似屏保的页面吧,有人使用的时候点一下才会进入正常的业务页面,你在点一下进入的时候每次都 load 最新版的就行了
karott7
2022-11-29 15:24:05 +08:00
@janus77 你这么做完全没考虑资源加载速度的问题,万一刚好网络波动呢?万一更新的 js 资源过大呢?还有 load 的时候屏幕会闪烁吧,这体验也不好。
再说我从头到尾都没说一定要实时更新。
janus77
2022-11-29 15:53:47 +08:00
@karott7 #50 第一如果网络波动那就进入没更新的老版页面,下一次在进入的时候再尝试更新。第二资源过大那是你们项目架构设计的问题,我这个方案并不设计 js 怎么分割这种细节。
janus77
2022-11-29 15:55:25 +08:00
@karott7 #50 还有,既然你不要求实时更新,那么就更简单了,每次进入的时候尝试请求是否有新版本,但是并不下载新资源。等结果返回有新版本时,后台自己在空闲的时候下载新资源,那么就能保证无缝体验了
xxxbin
2022-11-30 01:12:59 +08:00
听起来好像可以用 h2 的服务去推送
Finnn
2022-11-30 02:11:04 +08:00
虽然略奇葩的需求,
但是我觉得从在线文档可以找到灵感,多人协作文档更新的时候是自动更新的

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

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

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

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

© 2021 V2EX