it-swarm-pt.tech

Caixa de trabalho: o perigo de self.skipWaiting ()

Uso a Caixa de trabalho para pré-armazenar em cache os recursos necessários para renderizar o aplicativo Shell, incluindo uma versão básica de index.html. A caixa de trabalho assume que index.html Está disponível no cache; caso contrário, a navegação da página falha porque eu tenho isso registrado no meu Service Worker:

workbox.routing.registerNavigationRoute('/index.html');

Eu também tenho a instrução self.skipWaiting() no ouvinte de instalação:

self.addEventListener('install', e => {
  self.skipWaiting();
});

Pelo que entendi, existem 2 install ouvintes agora:

  • Um que é registrado pela Workbox para recursos de pré-armazenamento em cache (incluindo index.html)
  • Um que eu registrei manualmente no meu Service Worker

É possível que self.skipWaiting() tenha êxito enquanto o ouvinte de instalação da Workbox falha? Isso levaria a um estado problemático em que os ativos não são pré-armazenados em cache, mas o responsável pelo serviço está ativado. Esse cenário é possível e devo protegê-lo?

7
Johnny Oshika

Eu recomendo " O Ciclo de Vida do Trabalhador de Serviço " como uma fonte autorizada de informações sobre os diferentes estágios da instalação e atualização de um trabalhador de serviço.

Para resumir algumas informações desse artigo, como se aplica à sua pergunta:

  • O responsável pelo serviço entra na fase installing e, mesmo que muitos ouvintes install que você registrou, todos terão a chance de executar. Como você sugere, a Caixa de Trabalho cria seu próprio ouvinte install para lidar com o precaching.

  • Somente se todo ouvinte install for concluído sem erro o trabalhador do serviço passará para o estágio seguinte, que pode ser waiting (se já houver um cliente aberto usando a versão anterior do trabalhador do serviço ) ou activating (se não houver clientes usando a versão anterior do trabalhador do serviço).

  • skipWaiting() , se você optar por usá-lo, ele ignorará o estágio waiting, independentemente de haver ou não clientes abertos usando a versão anterior do serviço trabalhador.

  • Chamar skipWaiting() não realizará nada se algum dos ouvintes install falhar, porque o responsável pelo serviço nunca sairá da fase installing. É basicamente um não-op.

A única coisa com a qual você deve ter cuidado é usar skipWaiting() quando você também estiver usando o carregamento lento de ativos com versão pré-armazenada em cache. Como o artigo adverte:

Cuidado: skipWaiting() significa que seu novo operador de serviço provavelmente está controlando páginas que foram carregadas com uma versão mais antiga. Isso significa que algumas das buscas da sua página foram tratadas pelo seu técnico de serviço antigo, mas seu novo técnico de serviço manipulará as buscas subsequentes. Se isso pode quebrar as coisas, não use skipWaiting().

Como os ativos com versão em cache preguiçoso de carregamento lento são uma coisa muito mais comum em 2018, a Workbox não chama skipWaiting() para você por padrão. Cabe a você optar por usá-lo.

17
Jeff Posnick