O ciclo de vida do service worker de extensão

Os service workers de extensão respondem tanto aos eventos padrão do service worker quanto aos eventos em namespaces da extensão. Eles são apresentados juntos porque, geralmente, um tipo segue o outro durante o uso de uma extensão.

Instalação

A instalação ocorre quando o usuário instala ou atualiza um service worker pela Chrome Web Store ou quando ele carrega ou atualiza uma extensão descompactada usando a página chrome://extensions. Três eventos ocorrem na ordem abaixo.

ServiceWorkerRegistration.install

O primeiro evento disparado durante a instalação é o evento install de um web service worker.

chrome.runtime.onInstalled

Em seguida, o evento onInstalled da extensão, que é acionado quando a extensão (não o Service Worker) é instalada pela primeira vez, quando a extensão é atualizada para uma nova versão e quando o Chrome é atualizado para uma nova versão. Use esse evento para definir um estado ou para inicialização única, como um menu de contexto.

chrome.runtime.onInstalled.addListener((details) => {
  if(details.reason !== "install" && details.reason !== "update") return;
  chrome.contextMenus.create({
    "id": "sampleContextMenu",
    "title": "Sample Context Menu",
    "contexts": ["selection"]
  });
});

ServiceWorkerRegistration.active

Finalmente, o evento activate do service worker é disparado. Observe que, ao contrário dos web service workers, esse evento é disparado imediatamente após a instalação de uma extensão, pois não há nada comparável ao recarregamento de uma página.

Inicialização da extensão

Quando um perfil de usuário é iniciado, o evento chrome.runtime.onStartup é acionado, mas nenhum evento do service worker é invocado.

Inatividade e desligamento

Normalmente, o Chrome encerra um worker de serviço quando uma das seguintes condições é atendida:

  • Após 30 segundos de inatividade. Receber um evento ou chamar uma API de extensão redefine esse cronômetro.
  • Quando uma única solicitação, como um evento ou uma chamada de API, leva mais de cinco minutos para ser processada.
  • Quando uma resposta fetch() leva mais de 30 segundos para chegar.

Eventos e chamadas para APIs de extensão redefinem esses timers. Se o service worker estiver inativo, um evento recebido vai reativá-los. No entanto, você precisa projetar seu worker de serviço para que ele seja resiliente contra encerramentos inesperados.

Para otimizar o consumo de recursos da sua extensão, evite manter o service worker ativo indefinidamente, se possível. Teste suas extensões para garantir que você não esteja fazendo isso acidentalmente.

Manter dados em vez de usar variáveis globais

Todas as variáveis globais definidas serão perdidas se o service worker for encerrado. Em vez de usar variáveis globais, salve os valores no armazenamento. Suas opções estão listadas abaixo. A API Web Storage não está disponível para service workers de extensão.

API chrome.storage
Uma API de extensão que oferece vários tipos de armazenamento: local, de sessão, gerenciado (domínio) e sincronizado. Essa API armazena objetos JSON identificados e recuperados com chaves definidas pelo desenvolvedor. Esse tipo de armazenamento não é removido quando um usuário limpa o cache da Web.
API IndexedDB
Uma API de baixo nível para armazenamento de dados estruturados do lado do cliente, incluindo arquivos e blobs. Essa API fornece primitivas para criar armazenamento e recuperação de dados transacionais. Embora essa API seja geralmente muito complicada para casos de uso simples, várias soluções de armazenamento de terceiros são criadas com base nela.
API CacheStorage
Um mecanismo de armazenamento persistente para pares de objetos de solicitação e resposta. Essa API foi projetada especificamente para workers de serviços da Web e é usada para recuperar dados de um endpoint. Há várias maneiras de usar essa API, dependendo de como e de quão importante é que os usuários tenham dados atualizados. Para mais informações, consulte O guia de receitas off-line. A menos que você esteja usando um proxy específico para solicitações de rede pelo gerenciador de busca, use chrome.storage.

Escolher uma versão mínima do Chrome

Desde o lançamento do Manifest V3, fizemos várias melhorias na vida útil dos service workers. Isso significa que, se a extensão Manifest V3 oferecer suporte a versões anteriores do Chrome, você precisará conhecer algumas condições. Se essas condições não afetarem sua extensão, você pode passar para a próxima seção. Se esse for o caso, especifique uma versão mínima do Chrome no manifesto.

Chrome 120

Agora, os alarmes podem ser definidos para um período mínimo de 30 segundos para corresponder ao ciclo de vida do service worker. Consulte chrome.alarms para mais detalhes.

Chrome 118

As sessões ativas do depurador criadas usando a API chrome.debugger agora mantêm o service worker ativo. Isso evita que os service workers atinjam o tempo limite durante chamadas para essa API.

Chrome 116

O Chrome 116 introduziu as seguintes melhorias na vida útil do service worker:

  • As conexões ativas de WebSocket agora estendem a duração dos workers de serviço de extensão. O envio ou recebimento de mensagens em um WebSocket em um worker de serviço de extensão redefine o timer inativo do worker de serviço.

  • Outras APIs de extensão podem ultrapassar o período de tempo limite de cinco minutos para workers de serviço de extensão. Essas APIs mostram uma solicitação ao usuário e, portanto, podem levar mais de cinco minutos para serem resolvidas. Eles incluem desktopCapture.chooseDesktopMedia(), identity.launchWebAuthFlow(), management.uninstall() e permissions.request().

Chrome 114

Enviar uma mensagem usando mensagens de longa duração mantém o service worker ativo. Antes, a abertura de uma porta redefinia os timers, mas o envio de uma mensagem não. Abrir uma porta não redefine mais os timers.

Chrome 110

As chamadas de API de extensão redefinem os timers. Antes disso, somente a execução de manipuladores de eventos manteria um service worker ativo. Os eventos que estavam na fila, mas para os quais um gerenciador não foi chamado, não causariam uma redefinição.

Chrome 109

As mensagens enviadas de um documento fora da tela redefiniram os timers.

Chrome 105

A conexão com um host de mensagens nativas usando chrome.runtime.connectNative() mantém um service worker ativo. Se o processo do host falhar ou for encerrado, a porta será fechada e o worker de serviço será encerrado após a conclusão dos timers. Para evitar isso, chame chrome.runtime.connectNative() no manipulador de eventos onDisconnect da porta.