Prueba de origen de trabajadores compartidos con ciclo de vida extendido

Publicado: 31 de julio de 2025

A partir de Chrome 139, participa en una nueva prueba de origen para los trabajadores compartidos con una vida útil extendida. La prueba agrega una nueva opción extendedLifetime: true para permitir que los trabajadores compartidos sigan activos después de que se descargue el último documento.

Caso de uso de la función de duración extendida

Muchos sitios desean realizar algún trabajo cuando el usuario abandona la página. Por ejemplo, escribir en el almacenamiento o enviar datos de vuelta a los servidores para guardar el estado o registrar estadísticas

La plataforma web proporciona algunas APIs para abordar algunos de los casos de uso más simples, pero cada una tiene limitaciones:

  • Las APIs de JavaScript síncronas, como las escrituras de localStorage, se ejecutan hasta completarse antes de descargar la página actual.
  • El objeto fetch API tiene varias opciones, como keepalive y, más recientemente, fetchLater, que permiten que las solicitudes enviadas sobrevivan a la descarga del documento durante un breve período.

Sin embargo, solo cubren el trabajo síncrono, excepto la solicitud final de fetch. No permiten el uso de APIs asíncronas como IndexedDB, Compression Streams o Web Crypto para generar un hash o encriptar. Muchas APIs, en especial las más nuevas, son asíncronas para evitar bloquear el subproceso principal, por lo que no poder usar estas APIs en el evento de descarga es restrictivo.

La alternativa es usar service workers, que existen fuera de los ciclos de vida de las páginas individuales. Sin embargo, esta es una solución bastante pesada, con requisitos de administración y ciclo de vida más complejos para los desarrolladores, sin mencionar los requisitos adicionales de memoria y procesos para los usuarios. Tampoco coinciden con el caso de uso principal de los service workers (actuar como proxy para las solicitudes de red). Usar service workers completos solo para el caso de uso de completar algún trabajo en la descarga de la página parece excesivo.

La solución propuesta

La API de SharedWorker es una API más liviana que se usa para descargar el trabajo del subproceso principal. Sin embargo, actualmente no sobreviven más allá de la vida útil del origen (cuando se descarga la última página de ese origen). Chrome propone agregar una nueva opción a la API de SharedWorker para permitir que los trabajadores compartidos sobrevivan a la destrucción de documentos durante un breve período.

El estándar HTML ya recomienda que las implementaciones mantengan activos los trabajadores compartidos durante un breve período después de la descarga del documento, de modo que la navegación entre páginas del mismo origen no destruya y, luego, vuelva a crear el trabajador compartido. La propuesta de tiempo de vida extendido solo extiende esto sugiriendo que, incluso si el usuario no navega a un destino del mismo origen, el agente de usuario debe mantener activo el trabajador compartido durante un tiempo, de modo que se pueda completar el trabajo asíncrono.

La propuesta es permitir que los trabajadores compartidos sigan activos después de que se descargue el último documento, durante el mismo período que se permite que los trabajadores del servidor permanezcan inactivos, que es de 30 segundos para Chrome. Ten en cuenta que, para los trabajadores compartidos, este es un tiempo de vida útil máximo después de la descarga, en lugar de un tiempo de inactividad. Es decir, el límite de 30 segundos comienza desde la descarga, no desde el tiempo de inactividad. Se cancelará el trabajo que se haya iniciado y aún no se haya completado dentro de ese período.

Habilita la vida útil extendida

Para habilitar la función en los sitios para los usuarios, regístrate en una prueba de origen para los service workers compartidos con una vida útil extendida. Como alternativa, los desarrolladores pueden habilitar la función en su propio navegador con la marca chrome://flags/#enable-experimental-web-platform-features.

Ejemplo de código

Después de habilitar la prueba o la marca de función, habilita la vida útil extendida de la siguiente manera:

const myWorker = new SharedWorker("worker.js", { extendedLifetime: true });

Como los trabajadores compartidos también admiten blobs, esto también se puede habilitar sin una secuencia de comandos separada. Por ejemplo, para escribir datos en IndexedDb, haz lo siguiente:

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 });
});

También tenemos una aplicación de ejemplo aquí: https://sharedworker-extendedlifetime.netlify.app/. Cuando se vuelve a cargar la página (o se cierra y se vuelve a abrir en un plazo de 30 segundos), el cálculo anterior sigue disponible.

Los trabajadores compartidos se pueden ver en un sitio en chrome://inspect/#workers, y pronto se mejorará para mostrar si se usó la opción extendedLifetime. Los trabajadores compartidos con una vida útil extendida también seguirán apareciendo en esta página durante 30 segundos después de que se descargue la página.

Comparte tus comentarios

Esperamos recibir tus comentarios sobre la prueba de origen del trabajador compartido con una vida útil extendida.

La forma de la API se está analizando en GitHub y tenemos una explicación técnica más detallada.

Para enviar comentarios sobre la implementación de Chrome, informa un error de Chromium.