service-worker - Service Worker 应该在 list 中注册还是通过脚本注册?

标签 service-worker progressive-web-apps

大多数注册 Service worker 的示例都是通过 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 我应该使用哪种方法?有哪些权衡取舍?

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

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

2 缓存的含义是什么

由于 list 将保存在离线缓存中,并且该 list 将引用服务 worker 脚本,那么缓存有何影响?如果我不将脚本存储在离线缓存中,24 小时规则是否仍然适用? update_via_cache 成员在规范中不是一件容易阅读的东西。

最佳答案

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

我的解释是,用例提供服务 worker 引导元数据,这在通过非浏览器机制安装网络应用程序时是相关的,例如通过应用商店。我在 guidance 中没有看到该字段的任何提及不过,关于 Microsoft Store 摄取。

所以...截至目前,我不清楚是否有任何浏览器支持 Web 应用程序 list 中的 serviceworker 字段,如果您担心的是为“浏览器”注册功能性服务 worker "用例,使用 JavaScript 来完成。

跟进的最佳选择是在网络应用程序 list 的 GitHub issue tracker 上询问.

关于service-worker - Service Worker 应该在 list 中注册还是通过脚本注册?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50309263/

相关文章:

javascript - 使用后退按钮时停止服务人员表单重新提交表单

service-worker - ServiceWorkerRegistration.update() 是否跳过等待阶段并激活新的 Service Worker?

javascript - 如何从 Service Worker 中删除多个打开的缓存

javascript - 渐进式网络应用程序中的重定向

javascript - Firebase Web 实时数据库是否具有 PWA 离线功能

webpack - 如何在基于 Create-React-App 的应用程序中配置 Workbox?

google-chrome-devtools - 如何注销和删除旧的 Service Worker?

javascript - 使用 Service Worker 缓存文件时显示进度

javascript - vue-cli 使用官方 pwa 插件创建的网站无法在离线模式下工作

node.js - 网络推送未知问题,WebPushError "Received unexpected response code"400