不确定这是否是潜在的错误或我做错了什么。
我正在使用基于cli的应用,@angular/serviceworker 5.1.0
@angular/cli 1.6.0
SW的实施完全由book
我将尝试描述正在发生的事情:
考虑使用正在运行的服务工作者的应用。 SW缓存来自ngsw.json
的数据。
现在,我将使用新的budle hash部署一个新的ng build --prod
文件。
目前正在运行应用程序的ServiceWorker将加载旧的缓存文件,除非明确要求由SwUpdate
服务进行更新。没关系。
但事情就是这样。打开新选项卡并加载应用程序的新实例后,它仍会加载旧文件。在网络日志中,无法获取新的ngsw.json
。
两个标签是否都使用相同的ServiceWorker?
ServiceWorker如何知道何时检查新的ngsw.json
?
最奇怪的事情: 有时在按F5时,ServiceWorker仍然会加载旧文件。有时它会加载新文件。有时它会尝试使用旧哈希获取文件并失败(404)!
到目前为止,我还没有找到任何模式。
浏览器缓存是否可能导致问题?我尝试将服务器响应标头添加到no-cache
并过期:0但没有区别。
答案 0 :(得分:0)
在回答此问题时,最新版本的ngsw(@ angular / service-worker)为8.2.13。
两个选项卡都使用相同的ServiceWorker吗?
是的,两个选项卡都激活同一服务人员。这样做是出于数据完整性的考虑,如果您在不同选项卡上让一个服务工作者与另一个服务工作者进行不同的处理,这将成为维护噩梦。
如您所知,ServiceWorker如何知道何时检查新的ngsw.json?
ngsw.json将在您调用生产版本时更新:ng build --prod
。服务工作者不会将对ngsw.json的更新视为对服务工作者的更新。这样,它可以在不创建服务工作者新版本的情况下更新服务工作者的缓存,并且无需关闭浏览器选项卡即可进行简单的刷新。
如果服务工作者已更新,则应安装 新服务工作者,但直到所有关联的浏览器客户端(选项卡)都已被安装,它才会激活。关闭,这样可以安全地进行更新。
有时,在按F5键时,ServiceWorker仍在加载旧文件。 有时它会加载新文件。有时它会尝试获取文件 带有旧哈希并失败(404)!
对于服务人员,刷新按钮通常不起作用。如果您要进行硬重装,则将绕过服务人员并请求新数据。此操作不一定会更新服务工作者的缓存。结果,您可能会发现下一次刷新将加载旧数据,该数据是从与旧服务工作程序关联的缓存中检索的。
浏览器缓存是否可能引起问题?
要手动使服务工作者的缓存无效,请进入DevTools > Application (tab) > Cache storage
并删除其内容。