我们如何检查请求的响应是否来自 Service Worker

How can we check if response for the request came from Service Worker

在 Google Chrome HTTP 状态代码旁边的控制台 Request 我们有信息 (from ServiceWorker).

可以 Request 以某种方式意识到 Response 来自 ServiceWorker?比较 dateResponse Headers 也许吧?

根据设计,通过 FetchEvent#respondWith() 编辑的响应 return 与没有服务人员参与的响应无法区分。无论我们讨论的响应是通过 XMLHttpRequestwindow.fetch() 还是在某些元素上设置 src= 属性获得的,这都适用。

如果区分哪些响应是由 service worker 参与发起的对您很重要,我能想到的最干净的方法是显式添加 HTTP header 到 Response object 被送入 FetchEvent#respondWith()。然后,您可以从受控页面检查 header。

但是,根据您的 service worker 获取其 Response 的方式,这可能有点 tricky/hacky,除非您有强大的用例,否则我不能说我推荐它.以下是(同样,不推荐)方法的样子:

event.respondWith(
  return fetch(event.request).then(function(response) {
    if (response.type === 'opaque') {
      return response;
    }

    var headersCopy = new Headers(response.headers);
    headersCopy.set('X-Service-Worker', 'true');

    return response.arrayBuffer().then(function(buffer) {
      return new Response(buffer, {
        status: response.status,
        statusText: response.statusText,
        headers: headersCopy
      });
    });
  })
)

如果您返回一个不透明的 Response,除了直接 return 将其直接添加到页面之外,您不能对它做太多事情。否则,它将把一堆东西复制到一个新的 Response 中,其中 X-Service-Worker header 设置为 true。 (这是绕过一个事实的迂回方式,即您不能直接修改由 fetch() 编辑的 Response return 的 headers。)