2017-08-02 59 views
8

Mam więc stronę HTML z robotnikiem serwisowym, robotem serwisowym buforuje plik index.html i moje pliki JS.Jak wyczyścić pamięć podręczną pracownika serwisu?

Problem polega na tym, że podczas zmiany JS zmiana nie pojawia się bezpośrednio w przeglądarce klienta. Oczywiście w chrome dev-tools mogę wyłączyć pamięć podręczną. Ale w chrome mobile, jak mam to zrobić?

Próbowałem uzyskać dostęp do ustawień strony i nacisnąć przycisk CLEAR% RESET. Ale nadal ładuje starą stronę/ładowanie z pamięci podręcznej. Próbowałem użyć innej przeglądarki lub Chrome incognito i załadowałem nową stronę.

Następnie próbuję wyczyścić dane przeglądarki (tylko pamięć podręczną) i to działa.

Domyślam się, że to nie tak powinno działać poprawnie? mój użytkownik nie będzie wiedział, czy strona jest aktualizowana bez czyszczenia pamięci podręcznej przeglądarki Chrome.

Odpowiedz

10

Służy do usuwania nieaktualnych buforuje:

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

Co to jest "self" tutaj? Obiekt okna lub serviceworker? – loopmode

+2

To dobra praktyka w przepełnieniu stosu, aby dodać wyjaśnienie, dlaczego twoje rozwiązanie powinno działać. Aby uzyskać więcej informacji przeczytaj [How To Answer] (// stackoverflow.com/help/how-to-answer). –

13

other answer jest nieco rozwlekły i robi dużo więcej niż potrzeb pytanie, biorąc pod uwagę jej całkowity brak wyjaśnienia wymaga trochę parsowania w imieniu użytkownika, aby zmienić go w coś, co działa na ich korzyść. A więc jest to prostsze;

Jeśli znasz nazwę cache można po prostu zadzwonić caches.delete() z gdziekolwiek chcesz w pracownika:

caches.delete(/*name*/); 

A jeśli chciał wytrzeć wszystkie bufory (a nie czekać na nich, to powiedzieć jest zadaniem w tle), musisz tylko add this:

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

Dzięki za to. To jest o wiele prostsze, wyraźniejsze. Po prostu napisałem szybko, żeby odpowiedzieć na pytanie: –

+1

Nie martw się. Twój byłby idealny, gdyby ktoś chciał usunąć określony zestaw pamięci podręcznych w obrębie 'aktywatora'; Właśnie zrobiłem to na wypadek, gdyby ktoś chciał tylko zrzucić jeden/wszystko. – Hashbrown

+0

Najbardziej kompaktowy kod to prawdopodobnie 'caches.keys(). Then (cs => cs.forEach (c => caches.delete (c)))' lub dla funkcji asynchronicznych '(oczekuj caches.keys()). ForEach (c => caches.delete (c))' –