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. : /

questionAnswers(3)

yourAnswerToTheQuestion