让用户选择更新Service Worker

时间:2016-11-19 10:43:16

标签: service-worker

是否可以让用户选择何时更新Service Worker?

为什么呢?我想添加经济模式,这意味着用户可以选择节省大量带宽。当用户的限制几乎已满或他/她在国外使用昂贵的互联网时,这可能很有用。

那是因为如果服务工作者更新并且有新资产'版本,它将下载所有可能是几MB的版本。如果您距离新月份3天50MB,那么每MB都会计算在内。

我们可以说我可以从localStorage中检索设置:

const economy = localStorage.getItem(economy) || false

如何让服务工作者知道只有在经济实现的情况下它应该自行更新?

我有点意识到从长远来看这可能是一个问题(过时的版本),但我打算在他/她不想更新的情况下经常惹恼用户。我只想添加供用户选择的选项。

1 个答案:

答案 0 :(得分:2)

如果您愿意处理installactivate事件之外的缓存条目的更新/删除(可能只是其中一部分),您可以更灵活地确定何时应该触发。实际上,您根本不必在服务工作者中执行更新,如果它最终变得更容易。单个网页可以访问给定来源的服务工作者使用的完全相同的Cache Storage API个实例。您可以直接从页面修改缓存,以响应对您最有意义的操作,例如:

// Ensure we have access to the Cache Storage API.
if ('caches' in window) {
  // Swap this out for whatever UI element will trigger the update.
  const el = document.querySelector('#update-caches-button');
  el.addEventListener('click', () => {
    window.caches.open('my-cache').then(cache => {
      // Add or delete entries from cache.
    });
  });
}

您可以执行类似操作,但通过使用客户端页面中的postMessage()触发服务工作者的message事件,保留服务工作者中的所有逻辑,然后更新缓存在message事件处理程序中。

依靠install / activate事件执行缓存管理有一些优势。特别是,您可以依赖服务工作者"waiting" state,而其他活动客户端依赖于之前的缓存状态,并且不必担心丢弃所需的条目那些其他客户或在新版本仍在使用的情况下更换资源的预期版本。但作为开发人员,最终您有责任了解您的缓存资源的使用方式,以及您在这些缓存中管理的资产是否可能导致问题(如果有的话)版本不匹配,或者如果某个选项卡删除的内容需要稍后通过另一个选项卡从网络中检索,那么您可以自由地实施这种方法。

对于它的价值,我们在sw-precache中实施预先缓存/更新时考虑过类似的问题。在https://github.com/GoogleChrome/sw-precache/issues/145有一些关于尝试使用浏览器公开的标准信号的背景,表明用户更喜欢保存数据,而不是每个人都提出他们自己的启发式方法。