之后每24小时左右下载一次。 可能 下载更频繁,但必须每24小时下载一次 防止坏脚本长时间烦恼。
Firefox和Chrome也是如此吗?或者更新到服务工作者javascript仅在用户导航到站点时发生?
答案 0 :(得分:141)
注意:As of Firefox 57和Chrome 68,以及支持服务工作者的Safari和Edge版本,默认行为已更改为updated service worker specification的帐户。在这些浏览器中,默认情况下,在检查服务工作者脚本以获取更新时,将忽略HTTP缓存指令。以下说明仍适用于早期版本的Chrome和Firefox。
每次时间导航到服务工作者范围内的新页面时,Chrome都会为传递到navigator.serviceWorker.register()
调用的JavaScript资源发出标准HTTP请求。我们假设它的名字是service-worker.js
。该请求仅与导航一起或当服务工作者通过例如push
事件被唤醒时进行。 不后台进程每24小时重新获取一个服务工作者脚本,或者像这样自动执行任何操作。
此HTTP请求将遵循标准HTTP cache directives,但有一个例外(将在下一段中介绍)。例如,如果您的服务器设置了适当的HTTP响应标头,表明缓存的响应应该使用1小时,那么在接下来的一小时内,浏览器的缓存将满足浏览器对service-worker.js
的请求。请注意,我们不谈论Cache Storage API,这与此情况无关,而是standard browser HTTP caching。
标准HTTP缓存规则的一个例外,就是24小时内出现的情况,如果HTTP缓存中service-worker.js
条目的年龄大于,则浏览器将始终进入网络24小时。因此,在功能上,使用1天或1周或1年的max-age
没有区别 - 他们都将被视为max-age
为1天。
浏览器供应商希望确保开发人员不会意外地推出服务时间为{1}} 1年的“已损坏”或错误service-worker.js
,从而使用户可能持久化,长时间破碎的网络体验。 (您不能依赖于您的用户知道清除他们的网站数据或转移重新加载网站。)
一些开发人员更喜欢使用响应标头显式提供他们的max-age
,从而导致禁用所有HTTP缓存,这意味着为每个导航创建了service-worker.js
的网络请求。另一种方法可能是使用一个非常非常短的service-worker.js
- 比如说一分钟 - 来提供一定程度的限制,以防单个用户进行大量快速导航。如果您真的想最大限度地减少请求并且相信您不会很快更新max-age
,那么您可以自由设置service-worker.js
24小时,但我建议您选择更短的时间你出乎意料地需要重新部署。
答案 1 :(得分:0)
一些开发者更喜欢使用响应标头显式地提供他们的 service-worker.js
,从而导致所有 HTTP 缓存被禁用,这意味着每次导航都会对 service-worker.js
进行网络请求。
这种无缓存策略可能会在快节奏的«敏捷»环境中发挥作用。
只需将以下隐藏的 .htaccess
文件放在包含 service-worker.js
的服务器目录中:
# DISABLE CACHING
<IfModule mod_headers.c>
Header set Cache-Control "no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires 0
</IfModule>
<FilesMatch "\.(html|js)$">
<IfModule mod_expires.c>
ExpiresActive Off
</IfModule>
<IfModule mod_headers.c>
FileETag None
Header unset ETag
Header unset Pragma
Header unset Cache-Control
Header unset Last-Modified
Header set Pragma "no-cache"
Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
Header set Expires "Thu, 1 Jan 1970 00:00:00 GMT"
</IfModule>
</FilesMatch>
这将禁用缓存此服务器目录中的所有 .js
和 .html
文件以及下面的文件;这不仅仅是service-worker.js
。
仅选择了这两种文件类型,因为这些是我的 PWA 的非静态文件,它们可能影响在浏览器窗口中运行应用程序的用户,而没有将其(尚未)安装为完整的- 成熟的自动更新 PWA。
有关 Service Worker 行为的更多详细信息,请访问 Google Web Fundamentals。