如果有新版本,如何强制SPA客户端进行硬刷新?

时间:2019-05-30 00:38:42

标签: javascript single-page-application progressive-web-apps

我只有一个页面应用程序,需要客户端使用最新版本。缓存具有攻击性,因此等待它们失效是不可行的。

是否有一种方法可以告诉客户端查看资源(例如build.txt之类的内容),并且如果该资源包含的内部版本号大于当前加载的内部版本号,则使缓存无效并刷新?

2 个答案:

答案 0 :(得分:1)

这个问题被标记为progressive-web-apps,我将假设它正在安装服务工人,这是在积极地缓存资源。

This post运行,尽管显示了PWA的“可用的新版本”弹出窗口-即使这不是您想要的特定行为,它还是说明了如何更新服务人员。

This question/answer还介绍了检查服务人员更新的频率。

This question/answer总是使用skipWaiting来使客户保持最新状态的利弊。

编辑:如果您只是在处理常规HTTP缓存,请在发现有较新的版本时尝试使用location.reload(true)(使用forcedReload标志重新加载)在服务器上。过去,我是通过在构建/发布时将发布号放入js代码中,然后让服务器将其发布号添加到每个响应中作为标头来实现的。简单地比较ajax调用后的值,可以确认ui和服务器发行版号是否匹配并在不匹配时采取措施。

答案 1 :(得分:0)

感谢Jono Job帮助我实现此解决方案。

我最终要做的是以下事情:

在我的构建管道中,我在客户端构建之前添加了以下两行

- sed -i -e "s/{{build-number}}/${CI_COMMIT_SHORT_SHA}/g" ./src/environments/environment.prod.ts
- echo $CI_COMMIT_SHORT_SHA > ./src/assets/build.txt

第一行将提交哈希推送到已编译的javascript包中,第二行创建一个以提交哈希为内容的文本文件。

然后我建立了一个Angular服务,该服务使用http客户端轮询包含提交哈希的文本文件。它会检查文本文件中的哈希值是否与从javascript捆绑包加载的哈希值不同。

这里的理论是可以缓存Javascript捆绑包,但是不会提取http请求来获取build.txt文件。请允许我检查存储在两者中的构建哈希值之间的差异。

如果该服务检测到内部版本有所不同,则会向用户投射一个提示,通知他们有关更新的信息,单击该更新将刷新页面。

使用window.location.reload(true)完成刷新。 TypeScript告诉我该参数已弃用,尽管它仍然可以使用。

以下是上述Angular服务的要点: https://gist.github.com/alshdavid/032ea535f222646dc74420e20b28faa1

在我的APM中,我可以看到在推送更新的几个小时内,每个客户端都已更新为最新版本。

所以它可能有用。