【问题标题】:Service Worker is grabbing everythingService Worker 正在抓住一切
【发布时间】:2020-02-16 05:37:27
【问题描述】:

我最近刚刚开始摆弄服务人员,并且遇到一种情况,无论我告诉它添加什么文件到缓存中,它都会添加所有内容。现在,这通常意味着我对离线应用程序的工作更少,但我有点困惑。所以缓存似乎有两种添加请求的方法,.add().addAll(),后者能够接收请求数组,但即使只有.add() 带有硬编码的请求,绝对是所有请求似乎最终在缓存中。

我的代码如下:

    if ('serviceWorker' in navigator) {
        //console.log('CLIENT: service worker registration in progress.');
        navigator.serviceWorker.register('/sw.js').then(function() {
            //console.log('CLIENT: service worker registration complete.');
        }, function() {
            //console.log('CLIENT: service worker registration failure.');
    });
    } else {
        console.log('CLIENT: service worker is not supported.');
    }

...这是在调用服务工作者的实际页面中,以及服务工作者本身:

var cacheName = 'cache';

self.addEventListener('install', (e) => {
    console.log('[Service Worker] Install');
var appShellFiles = [
];

e.waitUntil(
    caches.open(cacheName).then((cache) => {
          console.log('[Service Worker] Caching all: app shell and content');
      return cache.add('assets/images/boy.svg').then(function() {
        // requests have been added to the cache
        console.log('added')
      });
    })
  );
});

self.addEventListener('fetch', (e) => {
    e.respondWith(
      caches.match(e.request).then((r) => {
            console.log('[Service Worker] Fetching resource: '+e.request.url);
        return r || fetch(e.request).then((response) => {
                  return caches.open(cacheName).then((cache) => {
            console.log('[Service Worker] Caching new resource: '+e.request.url);
            cache.put(e.request, response.clone());
            return response;
          });
        });
      })
    );
  });

self.addEventListener('activate', (e) => {
    e.waitUntil(
      caches.keys().then((keyList) => {
            return Promise.all(keyList.map((key) => {
          if(key !== cacheName) {
            return caches.delete(key);
          }
        }));
      })
    );
  });

...但是这里的.add('assets/images/boy.svg') 曾经是.addAll(appShellFiles),它本身曾经包含单个文件,但似乎忽略了列表并仍然缓存所有内容。我错过了什么?

【问题讨论】:

    标签: javascript service-worker


    【解决方案1】:

    这很简单。看这段代码:

    self.addEventListener('fetch', (e) => {
        e.respondWith(
          caches.match(e.request).then((r) => {
                console.log('[Service Worker] Fetching resource: '+e.request.url);
            return r || fetch(e.request).then((response) => {
                      return caches.open(cacheName).then((cache) => {
                console.log('[Service Worker] Caching new resource: '+e.request.url);
                cache.put(e.request, response.clone());
                return response;
              });
            });
          })
        );
      });
    

    它将所有内容动态/动态/自动保存在缓存中。您的代码是正确的 - 最初它只缓存您提到的一个文件。但当应用启动时,软件会立即缓存所有内容。

    另一种看待“缓存一切”问题的方式:缓存一切甚至不意味着任何东西。浏览器无法知道“一切”对特定站点意味着什么。它可以是 4 或 4000 个资产。一旦实现了这一点,只需找到正确的代码段即可。

    【讨论】:

    • 好吧,首先我认为 fetch 事件是从缓存中返回现有元素的事件,所以可能是我的错误。不过谢谢,会努力解决的!
    • 不,不是这样 =) fetch 事件的事件监听器会干扰 all fetch 事件。它不一定与缓存有关 - 这完全取决于您。 fetch 事件侦听器是响应缓存结果的侦听器是正确的,但本质上并非如此。没有任何自动的东西,只有当你编写代码时(就像你所做的那样)。我强烈建议您阅读 Google 的介绍和所有其他软件材料:developers.google.com/web/fundamentals/primers/service-workers
    • “我做了”是夸大其词,我只是复制和改编代码。但是,是的,我同意我需要更多地研究它!感谢您为我指明正确的方向!
    • @AndreiS。那挺好的。尤其是对于 Service Workers,真正阅读文档和指南是非常明智的,因为它们很容易让您的网站以各种方式完全无法使用。我会说它们在某种意义上是危险的。
    猜你喜欢
    • 2010-09-13
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 2018-06-25
    • 1970-01-01
    相关资源
    最近更新 更多