Publicado em: 31 de julho de 2025
A partir do Chrome 139, participe de um novo teste de origem para trabalhadores compartilhados com tempo de vida estendido. O teste adiciona uma nova opção extendedLifetime: true
para permitir que os workers compartilhados continuem ativos após o descarregamento do último documento.
O caso de uso do recurso de ciclo de vida estendido
Muitos sites querem realizar algum trabalho quando o usuário sai da página. Por exemplo, gravar no armazenamento ou enviar dados de volta aos servidores para salvar o estado ou registrar análises.
A plataforma da Web oferece algumas APIs para lidar com alguns dos casos de uso mais simples, mas cada uma tem limitações:
- As APIs JavaScript síncronas, como as gravações
localStorage
, são executadas até a conclusão antes de descarregar a página atual. - O
fetch API
tem várias opções, comokeepalive
e, mais recentemente,fetchLater
, que permite que os pedidos enviados sobrevivam ao descarregamento do documento por um curto período.
No entanto, eles cobrem apenas o trabalho síncrono, exceto a solicitação fetch
final. Elas não permitem o uso de APIs assíncronas, como IndexedDB, Compression Streams ou Web Crypto, para gerar hash ou criptografar. Muitas APIs, principalmente as mais recentes, são assíncronas para evitar o bloqueio da linha de execução principal. Portanto, não poder usar essas APIs no descarregamento é restritivo.
A alternativa é usar service workers, que ficam fora dos ciclos de vida de páginas individuais. No entanto, essa é uma solução bastante pesada, com requisitos mais complexos de ciclo de vida e gerenciamento para desenvolvedores, sem mencionar requisitos adicionais de processo e memória para os usuários. Além disso, eles não correspondem ao principal caso de uso dos service workers (atuar como um proxy para solicitações de rede). Usar service workers completos apenas para concluir algum trabalho no descarregamento da página parece exagerado.
Solução proposta
A API SharedWorker é uma API mais leve usada para descarregar o trabalho da linha de execução principal. No entanto, eles não duram mais do que o ciclo de vida da origem (quando a última página dessa origem é descarregada). O Chrome está propondo adicionar uma nova opção à API SharedWorker para permitir que os workers compartilhados sobrevivam à destruição de documentos por um curto período.
O padrão HTML já incentiva as implementações a manter os workers compartilhados ativos por um curto período após o descarregamento do documento. Assim, a navegação entre páginas de mesma origem não destrói e recria o worker compartilhado. A proposta de tempo de vida estendido sugere que, mesmo que o usuário não navegue para um destino de mesma origem, o user agent mantenha o service worker compartilhado ativo por algum tempo para que o trabalho assíncrono possa ser concluído.
A proposta é permitir que os workers compartilhados continuem ativos após o último descarregamento de documento, pelo mesmo período em que os workers do servidor podem ficar inativos, que é de 30 segundos no Chrome. Para workers compartilhados, esse é um tempo de vida máximo após o descarregamento, e não um tempo ocioso. Ou seja, o limite de 30 segundos começa a partir do descarregamento, e não do tempo ocioso. O trabalho que foi iniciado e ainda não foi concluído nesse período será cancelado.
Ativar o ciclo de vida estendido
O recurso pode ser ativado em sites para usuários ao se inscrever em um teste de origem para workers compartilhados de vida útil estendida. Como alternativa, os desenvolvedores podem ativar no próprio navegador usando a flag chrome://flags/#enable-experimental-web-platform-features
.
Exemplo de código
Depois de ativar o teste ou a flag de recurso, habilite o tempo de vida útil estendido da seguinte forma:
const myWorker = new SharedWorker("worker.js", { extendedLifetime: true });
Como os workers compartilhados também são compatíveis com blobs, isso também pode ser ativado sem um script separado. Por exemplo, para gravar dados em um IndexedDb:
const sharedWorkerScript = `
const transaction = db.transaction("analytics", "readwrite");
const store = transaction.objectStore("analytics");
const request = store.get("visitCount");
request.onsuccess = (event) => {
const newCount = (event.target.result || 0) + 1;
store.put(newCount, "visitCount");
};
`;
document.addEventListener("pagehide", () => {
const blob = new Blob([sharedWorkerScript], { type: "text/javascript" });
const blobURL = URL.createObjectURL(blob);
new SharedWorker(blobURL, { extendedLifetime: true });
});
Também temos um aplicativo de exemplo aqui: https://sharedworker-extendedlifetime.netlify.app/. Quando a página é recarregada (ou fechada e reaberta em 30 segundos), o cálculo anterior ainda está disponível.
Os trabalhadores compartilhados podem ser visualizados em: chrome://inspect/#workers
. Em breve, essa opção será aprimorada para mostrar se a opção extendedLifetime
foi usada. Os workers compartilhados de ciclo de vida estendido também vão continuar aparecendo nessa página por 30 segundos após o descarregamento da página.
Envie feedback
Aguardamos seu feedback sobre o teste de origem do service worker compartilhado com ciclo de vida estendido.
O formato da API está sendo discutido no GitHub (link em inglês), e temos uma explicação técnica mais detalhada.
Para enviar feedback sobre a implementação do Chrome, informe um bug do Chromium.