如何访问客户端服务工作者中的缓存网络存储?

How to access cache web storage in service worker in the client?

我正在研究如何访问存储在 Service Worker 网络缓存中的数据。我的服务人员看起来像这样:

self.addEventListener('install',(e) => {
    e.waitUntil(
        caches.open(astroCacheName).then(c => {
            return Promise.resolve(c.addAll([
                    './',
                    './css/normalize.css',
                    './css/main.css',
                    './js/index.js',
                    './js/discovery.js',
                    'http://localhost:4050/planets',
                    'http://localhost:4050/stars',
                    'http://localhost:4050/galaxies'
                ]))
        }))
})
self.addEventListener('fetch',(e) => {
    e.respondWith(
        caches.match(e.request).then(r => {
            return r || fetch(e.request)
        }))
})

self.addEventListener('activate', function (e) {
    console.log('activate event')
  e.waitUntil(caches.keys().then(function (cacheNames) {
    return Promise.all(cacheNames.map(cache => {
      if (cache !== astroCacheName) {
        console.log('Service Worker: Clearing Old Cache')
        return caches.delete(cache)
      }
    }))
  }))
})

其中事件 'install' 中的三个 las ones URLS 是对我的服务器的请求,该服务器响应 JSON 我需要在客户端访问。它们正确存储在缓存中。那么,我如何才能在客户端访问这些数据呢?

您可以通过两种不同的方式“访问”由 window 客户端中的 Service Worker 缓存的响应。其中一个比另一个更直接,您使用的具体方法应该适合您的用例。

间接缓存访问,通过 fetch()

如果特定 window 客户端(即网页)的 control 中有服务工作者,则任何网络请求都会触发该服务工作者的 fetch 事件处理程序,并让您的服务人员有机会生成响应。您提供的服务工作者代码中的 fetch 事件处理程序使用 caches.match(e.request) 尝试首先查找缓存的响应,如果不可能则回退到网络。因此,在您的网页中,如果您调用 fetch('/planets'),您从 Service Worker 返回的响应最终将来自缓存。

如果存在缓存未命中(给定您当前服务工作者中的 fetch 事件处理程序),或者如果请求是在服务工作者控制 window 客户端之前发出的,则fetch('/planets') 请求最终将由网络完成。这样会更有弹性。

直接缓存访问,通过 caches.match()

暴露在 service worker 全局范围内的相同 Cache Storage APIwindow 全局范围内也可用。这意味着,如果您已经安装了一个 service worker,并且该 service worker 已经填充了您的缓存,您可以直接从网页的上下文中使用 caches.match('/planets') 来获取缓存的 Response 对象。

如果您希望保证您获得的响应来自缓存(而不是由于缓存未命中而来自网络的响应),则此方法可能很有用。不利的一面是,如果服务工作者已经完成安装,您只会得到回复,如果还没有完成,则没有回退。

但有时这是合适的,例如,如果您试图仅显示已缓存的数据。