服务工作者是应该在清单中还是通过脚本注册?

时间:2018-05-12 18:06:23

标签: service-worker progressive-web-apps

注册服务工作者的大多数示例都是通过JavaScript完成的。例如(来自MDN):

if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('service-worker.js', {
    scope: './'
  }).then(function (registration) {
    var serviceWorker;
    if (registration.installing) {
      serviceWorker = registration.installing;
      document.querySelector('#kind').textContent = 'installing';
    } else if (registration.waiting) {
      serviceWorker = registration.waiting;
      document.querySelector('#kind').textContent = 'waiting';
    } else if (registration.active) {
      serviceWorker = registration.active;
      document.querySelector('#kind').textContent = 'active';
    }
    if (serviceWorker) {
      // logState(serviceWorker.state);
      serviceWorker.addEventListener('statechange', function (e) {
        // logState(e.target.state);
      });
    }
  }).catch (function (error) {
    // Something went wrong during registration. The service-worker.js file
    // might be unavailable or contain a syntax error.
  });
} else {
  // The current browser doesn't support service workers.
}

但我在Web App Manifest standard注意到有一个serviceworker成员:

"serviceworker": {
  "src": "sw.js",
  "scope": "/",
  "update_via_cache": "none"
}

这是我所见过的唯一这个地方。

这为我提出了两个问题:

1我应该使用哪种方法?有什么权衡取舍?

清单方法的声明性好处是显而易见的,但如果我使用该方法,如何引用注册对象以跟踪类似于脚本方法的事件? (安装 | 等待 | 有效 | 失败)。

假设可以适当地引用注册对象,它是否会错过事件?比如在我可以注册事件监听器之前完成安装。

2缓存含义是什么

由于清单将保存在脱机缓存中,并且此清单将引用service-worker脚本,缓存含义是什么?假设我不将脚本存储在脱机缓存中,24小时规则是否仍然适用? update_via_cache成员在规范中读取并不是一件简单的事。

1 个答案:

答案 0 :(得分:1)

它看起来已添加到规范back in October of 2016中,issue tracker中有一些背景讨论。

我的解释是该用例提供了服务工作者引导元数据,该元数据在通过非浏览器机制安装Web应用程序时是相关的,例如,通过应用商店。但是,我在guidance中没有看到关于Microsoft Store提取的那个字段。

所以...截至目前,我不清楚任何浏览器是否尊重Web应用程序清单中的serviceworker字段,以及您是否关注“浏览器”用例的功能服务工作者注册,使用JavaScript。

您跟进的最佳选择是在网络应用清单上GitHub issue tracker询问。