82 votes

Comment vider le cache d'un prestataire de services ?

Donc, j'ai une page HTML avec un travailleur de service, le travailleur de service cache l'index.html et mes fichiers JS.

Le problème est que lorsque je modifie le JS, le changement ne s'affiche pas directement sur le navigateur du client. Bien sûr, dans chrome dev-tools, je peux désactiver le cache. Mais dans chrome mobile, comment faire ?

J'ai essayé d'accéder aux paramètres du site et d'appuyer sur le bouton CLEAR % RESET. Mais il charge toujours l'ancienne page/chargement à partir du cache. J'ai essayé d'utiliser un autre navigateur ou Chrome incognito et il charge la nouvelle page.

Ensuite, j'essaie d'effacer mes données de navigation (seulement le cache) et cela fonctionne.

Je suppose que ce n'est pas comme ça que ça devrait fonctionner, n'est-ce pas ? Mon utilisateur ne saura pas si la page est mise à jour sans vider le cache du navigateur Chrome.

0 votes

Merci beaucoup Hashbrown. J'utilise cette méthode pour mettre à jour mon application avec le système de vérification personnalisé que j'ai expliqué dans cette page : stackoverflow.com/questions/56972246/

123voto

Hashbrown Points 1888

Si vous connaissez le nom du cache, vous pouvez simplement appeler caches.delete() de n'importe où dans le travailleur :

caches.delete(/*name*/);

Et si vous voulez effacer tous les caches (et ne pas les attendre, car il s'agit d'une tâche d'arrière-plan), il vous suffit de ajouter ceci :

caches.keys().then(function(names) {
    for (let name of names)
        caches.delete(name);
});

2 votes

Merci pour cela. C'est beaucoup plus simple et plus clair. J'ai juste écrit le mien rapidement pour répondre à la question.

2 votes

Non, pas d'inquiétude. Le vôtre serait parfait si quelqu'un voulait supprimer un ensemble spécifique de caches au sein de la activate l'auditeur ; j'ai juste fait ça au cas où quelqu'un voudrait seulement jeter un/tout.

4 votes

Le code le plus compact est probablement caches.keys().then(cs=>cs.forEach(c=>caches.delete(c))) ou pour les fonctions asynchrones (await caches.keys()).forEach(c=>caches.delete(c))

44voto

Liam Healy Points 1129

Utilisez cette fonction pour supprimer les caches périmés :

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);
        })
      );
    })
  );
});

7 votes

Qu'est-ce que self ici ? L'objet fenêtre ou un ouvrier de service ?

64 votes

Sur Stack Overflow, il est de bon ton d'expliquer pourquoi votre solution doit fonctionner. Pour plus d'informations, lisez Comment répondre .

3 votes

Self signifie instance de serviceWorker :)

17voto

Josh H Points 115

En général, vous mettez à jour le CACHE_NAME dans le fichier JS de vos travailleurs de service pour que votre travailleur s'installe à nouveau :

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

Ou bien, pour clair le cache pour une PWA trouver le nom du cache :

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

puis exécutez ce qui suit pour le supprimer :

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

Ensuite, rafraîchissez la page.

Si vous voyez des erreurs liées aux travailleurs dans la console après le rafraîchissement, vous pouvez également avoir besoin de désenregistrer les travailleurs enregistrés :

navigator.serviceWorker.getRegistrations()
  .then(registrations => {
    registrations.forEach(registration => {
      registration.unregister()
    }) 
  })

1 votes

Dernier code : "navigator.serviceWorker....." m'a aidé après avoir supprimé le plugin wordpress superpwa, à supprimer tout le cache lié au service worker. Merci

1 votes

Les mots descriptifs au-dessus de vos blocs de code 2 et 3 sont-ils intervertis ?

1 votes

Merci, David. Réparé avec votre aide.

9voto

Esteban Ortega Points 64

La solution la plus élégante, avec async/await :

const cacheName = 'v2';

self.addEventListener('activate', event => {
// Remove old caches
  event.waitUntil(
    (async () => {
      const keys = await caches.keys();
      return keys.map(async (cache) => {
        if(cache !== cacheName) {
          console.log('Service Worker: Removing old cache: '+cache);
          return await caches.delete(cache);
        }
      })
    })()
  )
})

2voto

Shadi Namrouti Points 1453

C'est le seul code qui a fonctionné pour moi. Il s'agit de mon adaptation de Documentation Mozilla :

//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
});

4 votes

cacheNameToKeep ? ? [cacheName] ? ? Est-ce que c'est la même chose ? Que signifie self.clients.claim() faire ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X