Ho consultato un sacco di risorse sul Operai:Come aggiornare la pagina dopo un aggiornamento di ServiceWorker?
- Updating your ServiceWorker
- ServiceWorker: Revolution of the Web Platform
- Jake bella SVGOMG Archibald.
Tuttavia, non posso per la vita di me capire come aggiornare la pagina dopo che è stato installato un nuovo ServiceWorker. Non importa quello che faccio, la mia pagina è bloccata su una vecchia versione, e solo un duro aggiornamento (Cmd-Shift-R) lo risolverà. Nessuna combinazione di 1) chiusura della scheda, 2) chiusura di Chrome o 3) location.reload(true)
servirà il nuovo contenuto.
Ho un super simple example app basato principalmente su SVGOMG. Al momento dell'installazione, ho Caché un po 'di risorse utilizzando cache.addAll()
, e faccio anche skipWaiting()
se numero di versione principale della versione corrente non corrisponde al numero della versione attiva (sulla base di una ricerca di IndexedDB):
self.addEventListener('install', function install(event) {
event.waitUntil((async() => {
var activeVersionPromise = localForage.getItem('active-version');
var cache = await caches.open('cache-' + version);
await cache.addAll(staticContent);
var activeVersion = await activeVersionPromise;
if (!activeVersion ||
semver.parse(activeVersion).major === semver.parse(version).major) {
if (self.skipWaiting) { // wrapping in an if while Chrome 40 is still around
self.skipWaiting();
}
}
})());
});
I Sto usando un sistema ispirato a Semver dove il numero di versione principale indica che il nuovo ServiceWorker non può essere sostituito a caldo per quello vecchio. Funziona sul lato ServiceWorker - un bump dalla v1.0.0 alla v1.0.1 fa sì che il worker sia immediatamente installato su un refresh, mentre dalla v1.0.0 alla v2.0.0, attende che la scheda venga chiusa e riaperta prima di essere installato.
Indietro nel thread principale, sto aggiornando manualmente il ServiceWorker dopo la registrazione – altrimenti la pagina non riceve nemmeno il memo che c'è una nuova versione di ServiceWorker disponibile (stranamente ho trovato poche menzioni di questo ovunque nel ServiceWorker letteratura):
navigator.serviceWorker.register('/sw-bundle.js', {
scope: './'
}).then(registration => {
if (typeof registration.update == 'function') {
registration.update();
}
});
Tuttavia, il contenuto che viene servita al thread principale è sempre bloccato su una vecchia versione della pagina ("la mia versione è 1.0.0"), indipendentemente dal fatto che incrementare il versione a 1.0.1 o 2.0.0.
Sono un po 'stonato qui. Speravo di trovare un'elegante soluzione semiper-y per il versioning di ServiceWorker (da qui il mio uso di require('./package.json').version
), ma nella mia attuale implementazione, l'utente è perennemente bloccato su una vecchia versione della pagina, a meno che non si aggiorni o si svuoti manualmente tutti i loro dati. :/
Non riesco a trovare i passaggi che hai eseguito per garantire che il nuovo Service Worker sia stato installato. Reclami ma non ti sei assicurato che sia stato davvero installato. –