服务人员打额外电话

Service worker making extra call

我正在尝试与服务工作者合作进行缓存,并 运行 解决经过身份验证的调用的问题。我目前正在使用 https://css-tricks.com/serviceworker-for-offline/ (https://raw.githubusercontent.com/chriscoyier/Simple-Offline-Site/master/js/service-worker.js) 作为模板,尽管我已经看到使用 Google 的 sw-toolbox.

的相同行为

当发出依赖特定 header 参数进行身份验证的请求时,浏览器似乎发出了一个失败的初始请求,然后是一个成功的请求(见图)。有没有想过为什么会这样?还有其他可能有用的详细信息吗?

提前致谢, 旦

"Service Worker Fallback Required" 消息是 an internal error message,应该随 Chrome 46 一起消失。编辑:看起来可能但是,未修复,这可能会导致所描述的问题。我们正在跟进该错误。

一个更普遍的回应是,在处理对经过身份验证的请求的响应时,您需要非常小心地处理服务工作者缓存。以下通用示例代码可能会反过来咬你,我建议你在继续之前回答以下问题:

  • 肯定想要缓存来自经过身份验证的请求的响应吗?
  • 如果是这样,您要对 所有 已验证 request/responses 使用相同的缓存方法,还是仅对特定 API 端点使用其中的一些?请记住,可能有 API 调用仅对 "fresh" 响应数据有意义。
  • 一旦当前用户登录 out/switches 到不同的登录帐户,您有什么机制来处理过期的缓存响应? (如果您继续使用之前缓存的响应进行响应,用户可能会觉得他们仍然以第一个帐户登录。)

如果您对一种方法感兴趣,可以通读使用 sw-toolbox(以前称为 shed)的 relevant section of the case study related to the Google I/O 2015 web app, which takes an approach that made sense to us for the type of data we were dealing with. There's some additional code,这也是相关的。但所有这些问题的答案都取决于您的具体用例,因此请在实施任何事情之前考虑清楚。

编辑:根据对此答案的评论,目的是完全避免服务工作者与经过身份验证的请求进行交互。如果是这种情况(并且这肯定会简化其他问题的答案),那么您应该能够做一些简单的事情,例如:

self.addEventListener('fetch', event => {
  // Only call event.respondWith() if the request doesn't include an
  // Authorization header. You can swap in your own header name.
  if (!event.request.headers.has('Authorization')) {
    event.respondWith(
      // Your standard fetch(), caches.match(), etc. logic goes here.
    );
  }
});

这种方法利用了这样一个事实,即如果 service worker 的 fetch 事件处理程序不调用 event.respondWith(),网络请求将最终继续进行,就好像没有任何 service worker完全参与。