How to clear cache of service worker?

前端 未结 4 839
伪装坚强ぢ
伪装坚强ぢ 2020-11-28 05:43

So, I have an HTML page with service worker, the service worker cache the index.html and my JS files.

The problem is when I change the JS, the change doesn\'t show u

相关标签:
4条回答
  • 2020-11-28 05:54

    This is the only code that worked for me. It is my adaptation of Mozilla documentation :

    //Delete all caches and keep only one
    const cachNameToKeep = 'myCache';
    
    //Deletion should only occur at the activate event
    self.addEventListener('activate', event => {
        var cacheKeeplist = [cacheName];
        event.waitUntil(
            caches.keys().then( keyList => {
                return Promise.all(keyList.map( key => {
                    if (cacheKeeplist.indexOf(key) === -1) {
                        return caches.delete(key);
                    }
                }));
            })
    .then(self.clients.claim())); //this line is important in some contexts
    });
    
    0 讨论(0)
  • 2020-11-28 06:06

    Typically you update the CACHE_NAME in your service workers JS file so your worker installs again:

    self.addEventListener('install', evt => {
      evt.waitUntil(
        caches.open(CACHE_NAME).then(cache => cache.addAll(inputs))
      )
    })
    

    Alternatively, to clear the cache for a PWA find the cache name:

    self.caches.keys().then(keys => { keys.forEach(key => console.log(key)) })
    

    then run the following to delete it:

    self.caches.delete('my-site-cache')
    

    Then refresh the page.

    If you see any worker-related errors in the console after refreshing, you may also need to unregister the registered workers:

    navigator.serviceWorker.getRegistrations()
      .then(registrations => {
        registrations.forEach(registration => {
          registration.unregister()
        }) 
      })
    
    0 讨论(0)
  • 2020-11-28 06:07

    If you know the cache name you can simply call caches.delete() from anywhere you like in the worker:

    caches.delete(/*name*/);
    

    And if you wanted to wipe all caches (and not wait for them, say this is a background task) you only need to add this:

    caches.keys().then(function(names) {
        for (let name of names)
            caches.delete(name);
    });
    
    0 讨论(0)
  • 2020-11-28 06:19

    Use this to delete outdated caches:

    self.addEventListener('activate', function(event) {
      event.waitUntil(
        caches.keys().then(function(cacheNames) {
          return Promise.all(
            cacheNames.filter(function(cacheName) {
              // Return true if you want to remove this cache,
              // but remember that caches are shared across
              // the whole origin
            }).map(function(cacheName) {
              return caches.delete(cacheName);
            })
          );
        })
      );
    });
    
    0 讨论(0)
提交回复
热议问题