是否可以像所有针对普通 HTTP 请求的示例一样在 Service Worker 中拦截和缓存 WebSocket 消息?

Is it possible to intercept and cache WebSocket messages in a Service Worker like all the examples do for normal HTTP requests?

我知道您可以从 Service Worker 本身内部创建 WebSocket 连接;我的问题更多的是,您是否可以像往常一样从您的应用程序使用 WebSocket,并让 Service Worker 拦截/缓存 WebSocket 请求,就像它对普通 HTTP 提取请求所做的那样?

这是一个拦截和缓存来自 Service Worker 的普通 HTTP 请求的示例。

self.addEventListener('fetch', function(event) {
  // If a match isn't found in the cache, the response
  // will look like a connection error
  event.respondWith(caches.match(event.request));
});

如果我的所有请求都通过 WebSockets,我将如何设置 Service Worker?

Service Worker 无法拦截 Web Socket 流量。

Service Worker 的 fetch 事件仅针对受控客户端的 HTTPS 请求触发,message 事件仅针对来自客户端的 postMessage() 请求触发。

虽然 there is an HTTP handshake 在启动 Web Socket 连接时,握手不会触发 fetch 处理程序,连接建立后发送的实际流量也不会。

我认为应该在第一次加载页面时使用 fetch,这样它的数据可以在您离线时由 service worker 缓存和返回。

因此,只有在线时才启动 websocket 连接。那就不用缓存数据了。

当无法通过套接字发送消息时,您会在应用程序端的缓存中保存消息。