Como atualizar a página após uma atualização do ServiceWorker?
Consultei muitos recursos sobre trabalhadores de serviço:
Atualizando o ServiceWorkerServiceWorker: Revolução da plataforma WebA adorável Jake ArchibaldSVGOMG.No entanto, não consigo descobrir como atualizar a página após a instalação de um novo ServiceWorker. Não importa o que eu faça, minha página está presa em uma versão antiga e apenas uma atualização (Cmd-Shift-R) a corrigirá. Nenhuma combinação de 1) fechar a guia, 2) fechar o Chrome ou 3)location.reload(true)
servirá o novo conteúdo.
eu tenho umaplicativo de exemplo super simples principalmente baseado em SVGOMG. Na instalação, eu cache muitos recursos usandocache.addAll()
e eu também façoskipWaiting()
se o número da versão principal da versão atual não corresponder ao número da versão ativa (com base em uma pesquisa do 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();
}
}
})());
});
Estou usando um sistema semver-inspirado em que o número da versão principal indica que o novo ServiceWorker não pode ser trocado a quente pelo antigo. Isso funciona no lado do ServiceWorker - um aumento da v1.0.0 para a v1.0.1 faz com que o trabalhador seja instalado imediatamente em uma atualização, enquanto da v1.0.0 para a v2.0.0, ele espera que a guia seja fechada e reaberta antes de ser instalado.
De volta ao thread principal, estou atualizando manualmente o ServiceWorker após o registro - caso contrário, a página nunca recebe o memorando de que há uma nova versão do ServiceWorker disponível (estranhamente, encontrei muito poucas menções sobre isso em qualquer lugar na literatura do ServiceWorker):
navigator.serviceWorker.register('/sw-bundle.js', {
scope: './'
}).then(registration => {
if (typeof registration.update == 'function') {
registration.update();
}
});
No entanto, o conteúdo que é veiculado no segmento principal sempre fica parado em uma versão antiga da página ("Minha versão é 1.0.0"), independentemente de eu incrementar a versão para 1.0.1 ou 2.0.0.
Estou meio perplexo aqui. Eu esperava encontrar uma solução sempre elegante para o versionamento do ServiceWorker (daí o uso derequire('./package.json').version
), mas, na minha implementação atual, o usuário fica perpetuamente preso em uma versão antiga da página, a menos que atualize manualmente ou limpe manualmente todos os dados. : /