O ciclo de vida do service worker de extensão

Os service workers de extensão respondem aos eventos padrão do service worker e aos eventos nos namespaces da extensão. Eles são apresentados juntos porque muitas vezes 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 acionado durante a instalação é o evento install de um service worker da Web.

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 uma 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

Por fim, o evento activate do service worker é acionado. Diferentemente dos web service workers, esse evento é acionado imediatamente após a instalação de uma extensão porque não há nada comparável ao recarregamento de uma página em uma extensão.

Inicialização da extensão

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

Inativo e encerramento

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

  • Após 30 segundos de inatividade. O recebimento de um evento ou a chamada de uma API de extensão redefine esse timer.
  • Quando uma única solicitação, como um evento ou 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 e, se o service worker ficou inativo, um evento recebido os reativará. No entanto, é necessário projetar o service worker para ser resiliente em caso de 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 está fazendo isso acidentalmente.

Mantenha os dados em vez de usar variáveis globais

Todas as variáveis globais definidas serão perdidas se o service worker for desligado. Em vez de usar variáveis globais, salve os valores no armazenamento. As 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, sessão, gerenciado (domínio) e sincronização. 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 os primitivos para criar armazenamento e recuperação de dados transacionais. Embora essa API geralmente seja 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 permanente para pares de objetos de solicitação e resposta. Essa API foi projetada especificamente para service workers da Web e é usada para recuperar dados de um endpoint. Há várias maneiras de usar essa API, dependendo da importância e da relevância dos dados atualizados para os usuários. Para mais informações, consulte o Manual off-line. A menos que você esteja enviando proxy especificamente de solicitações de rede pelo gerenciador de busca, use chrome.storage.

Escolha uma versão mínima do Chrome

Desde o lançamento do Manifest V3, fizemos várias melhorias no ciclo de vida do service worker. Isso significa que, se a extensão Manifest V3 for compatível com versões anteriores do Chrome, há condições que você vai precisar conhecer. Se essas condições não afetarem sua extensão, você poderá seguir em frente nesta seção. Se houver, especifique uma versão mínima do Chrome no manifesto.

Google 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 ver 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 as chamadas para essa API.

Chrome 116

O Chrome 116 introduziu as seguintes melhorias no ciclo de vida do service worker:

  • As conexões ativas do WebSocket agora estendem a vida útil do service worker de extensão. O envio ou o recebimento de mensagens por um WebSocket em um service worker de extensão redefine o timer de inatividade do service worker.

  • Outras APIs de extensão podem ultrapassar o tempo limite de cinco minutos para os service workers de extensão. Essas APIs exibem um prompt do usuário e, portanto, podem levar mais de cinco minutos para serem resolvidas. incluindo desktopCapture.chooseDesktopMedia(), identity.launchWebAuthFlow(), management.uninstall() e permissions.request().

Chrome 114

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

Chrome 110

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

Chrome 109

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

Chrome 105

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