Ajustes em cache.addAll() e importScripts() serão lançados no Chrome 71

Os desenvolvedores que usam service workers e a API Cache Storage devem procurar dois estão sendo lançadas no Chrome 71. Ambas as mudanças deixam a implementação do Chrome mais alinhada com os specifications e outros navegadores.

Proibição de importScripts() assíncrono

importScripts() instrui o script do service worker principal a pausar a execução atual, faz o download de código adicional determinado URL e executá-lo até a conclusão no escopo global atual. Depois de fazer isso, o script do service worker principal retoma a execução. importScripts() é útil quando você quer dividir o script do service worker principal em partes menores por motivos organizacionais, ou extrair código de terceiros para adicionar funcionalidade ao seu service worker.

Os navegadores tentam reduzir os possíveis problemas de desempenho de "baixar e executar ” armazenando automaticamente em cache qualquer coisa extraída por meio de importScripts(), o que significa que após o download inicial, há muito pouca sobrecarga envolvida na execução do código importado.

Para que isso funcione, no entanto, o navegador precisa saber que não haverá nenhuma "surpresa" código importado para o service worker após o instalação. De acordo com a especificação do service worker, importScripts() deve funcionar apenas durante a execução síncrona do script do service worker ou, se necessário, de forma assíncrona dentro do gerenciador install.

Antes do Chrome 71, chamar importScripts() de forma assíncrona fora do gerenciador install funcionam. A partir do Chrome 71, essas chamadas gerar uma exceção de execução (a menos que o mesmo URL tenha sido importado anteriormente em um gerenciador install), correspondendo ao comportamento em outros navegadores.

Em vez de um código assim:

// This only works in Chrome 70 and below.
self.addEventListener('fetch', event => {
  importScripts('my-fetch-logic.js');
  event.respondWith(self.customFetchLogic(event));
});

O código do seu service worker será semelhante a este:

// Move the importScripts() to the top-level scope.
// (Alternatively, import the same URL in the install handler.)
importScripts('my-fetch-logic.js');
self.addEventListener('fetch', event => {
  event.respondWith(self.customFetchLogic(event));
});

Suspensão do uso de URLs repetidos transmitidos para cache.addAll()

Se você estiver usando a API Cache Storage junto com um service worker, há outra pequena mudança Chrome 71 para se alinhar à especificação relevante. Quando o mesmo URL é passados várias vezes para uma única chamada para cache.addAll(), o especifica que a promessa retornada pela chamada deve ser rejeitada.

Antes do Chrome 71, isso não era detectado, e os URLs duplicados eram ignorados.

Uma captura de tela da mensagem de aviso no console do Chrome
A partir do Chrome 71, você verá uma mensagem de aviso registrada no console.

Essa geração de registros é uma introdução ao Chrome 72, em que, em vez de apenas um aviso registrado, URLs duplicados levar à rejeição de cache.addAll(). Se você estiver chamando cache.addAll() como parte de uma cadeia de promessas passado para InstallEvent.waitUntil(), como é prática comum, essa rejeição pode fazer com que o service worker falhe.

Veja como você pode ter problemas:

const urlsToCache = [
  '/index.html',
  '/main.css',
  '/app.js',
  '/index.html', // Oops! This is listed twice and should be removed.
];

self.addEventListener('install', event => {
  event.waitUntil(
    caches.open('my-cache').then(cache => cache.addAll(urlsToCache))
  );
});

Essa restrição se aplica apenas aos URLs reais que estão sendo transmitidos para o cache.addAll() e armazenados em cache acabar sendo duas respostas equivalentes com URLs diferentes, como '/' e '/index.html', uma rejeição.

Testar amplamente a implementação do service worker

Os service workers são amplamente implementados em todas as principais ferramentas "permanentes" navegadores em a este ponto. Se você testa regularmente seu App Web Progressivo em vários navegadores ou se tiver um número significativo de usuários que não usam o Chrome, é provável que você já tenha detectado a inconsistência e atualizou seu código. Mas, caso você não tenha notado isso, em outros navegadores, queríamos chamar a atenção para a mudança antes de mudar o comportamento do Chrome.