El ciclo de vida de un service worker de extensiones

Los service workers de extensión responden a los eventos de service worker estándar y a los eventos en los espacios de nombres de extensiones. Se presentan juntos porque, a menudo, un tipo va después de otro durante el uso de una extensión.

Instalación

La instalación se produce cuando el usuario instala o actualiza un service worker desde Chrome Web Store o cuando carga o actualiza una extensión sin empaquetar a través de la página chrome://extensions. Ocurren tres eventos en el siguiente orden.

ServiceWorkerRegistration.install

El primer evento que se activa durante la instalación es el evento install de un service worker web.

chrome.runtime.onInstalled

A continuación, se encuentra el evento onInstalled de la extensión, que se activa cuando la extensión (no el service worker) se instala por primera vez, cuando la extensión se actualiza a una versión nueva y cuando Chrome se actualiza a una nueva versión. Usa este evento para establecer un estado o una inicialización única, como un menú contextual.

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 último, se activa el evento activate del service worker. Ten en cuenta que, a diferencia de los service worker web, este evento se activa inmediatamente después de la instalación de una extensión, ya que no hay nada comparable con la recarga de una página en una extensión.

Inicio de la extensión

Cuando se inicia un perfil de usuario, se activa el evento chrome.runtime.onStartup, pero no se invocan eventos del service worker.

Inactividad y apagado

Normalmente, Chrome finaliza un service worker cuando se cumple una de las siguientes condiciones:

  • Después de 30 segundos de inactividad: Cuando recibes un evento o llamas a una API de extensión, se restablece este temporizador.
  • Cuando una sola solicitud, como un evento o una llamada a la API, demora más de 5 minutos en procesarse.
  • Cuando una respuesta de fetch() tarda más de 30 segundos en llegar

Los eventos y las llamadas a las APIs de extensiones restablecen estos temporizadores y, si el service worker queda inactivo, un evento entrante los revierte. Sin embargo, debes diseñar tu service worker para que sea resistente a la finalización inesperada.

Para optimizar el consumo de recursos de tu extensión, evita mantener activo el service worker de manera indefinida, si es posible. Prueba tus extensiones para asegurarte de no hacerlo de forma accidental.

Conserva los datos en lugar de usar variables globales

Todas las variables globales que establezcas se perderán si se cierra el service worker. En lugar de usar variables globales, guarda los valores en el almacenamiento. A continuación, se muestran tus opciones. Ten en cuenta que la API de Web Storage no está disponible para los service workers de extensión.

API de chrome.storage
Es una API de extensión que ofrece varios tipos de almacenamiento: local, de sesión, administrado (dominio) y de sincronización. Esta API almacena objetos JSON identificados y recuperados con claves definidas por el desarrollador. Este tipo de almacenamiento no se quitará cuando un usuario borre la caché web.
API de IndexedDB
Es una API de bajo nivel para el almacenamiento de datos estructurados del cliente, incluidos archivos y BLOB. Esta API proporciona primitivas para crear almacenamiento y recuperación de datos transaccionales. Aunque esta API suele ser demasiado complicada para casos de uso simples, varias soluciones de almacenamiento de terceros están compiladas en ella.
API de CacheStorage
Es un mecanismo de almacenamiento persistente para pares de objetos Request y Response. Esta API se diseñó específicamente para trabajadores de servicios web y se usa para recuperar datos desde un extremo. Existen varias formas de usar esta API en función de si es fundamental que los usuarios vean datos actualizados y de qué tan importante sea. Para obtener más información, consulta La guía de soluciones sin conexión. A menos que transmitas específicamente solicitudes de red mediante proxy a través del controlador de recuperación, debes usar chrome.storage.

Elige una versión mínima de Chrome

Desde el lanzamiento de Manifest V3, realizamos varias mejoras en la vida útil de los service worker. Esto significa que, si tu extensión Manifest V3 admite versiones anteriores de Chrome, hay condiciones que deberás tener en cuenta. Si estas condiciones no afectan tu extensión, puedes avanzar a partir de esta sección. Si es así, considera especificar una versión mínima de Chrome en tu manifiesto.

Chrome 120

Ahora se pueden configurar las alarmas en un período mínimo de 30 s para que coincidan con el ciclo de vida del service worker. Para obtener más información, consulta chrome.alarms.

Chrome 118

Las sesiones activas del depurador creadas con la API de chrome.debugger ahora mantienen activo el service worker. Esto evita que se agote el tiempo de espera de los service workers durante las llamadas a esta API.

Chrome 116

Chrome 116 introdujo las siguientes mejoras en la vida útil del service worker:

  • Las conexiones activas WebSocket ahora extienden la vida útil del service worker de extensión. Cuando se envían o reciben mensajes a través de un WebSocket en un service worker de extensión, se restablece el temporizador de inactividad del service worker.

  • Las APIs de extensión adicionales pueden superar el tiempo de espera de cinco minutos para los service workers de extensión. Estas APIs muestran una solicitud del usuario y, por lo tanto, pueden tardar más de cinco minutos en resolverse. Entre estos, se incluyen desktopCapture.chooseDesktopMedia(), identity.launchWebAuthFlow(), management.uninstall() y permissions.request().

Chrome 114

El envío de un mensaje con mensajes de larga duración mantiene activo el service worker. Antes, abrir un puerto restablece los cronómetros, pero no se podía enviar un mensaje. Cuando se abre un puerto, ya no se restablecen los cronómetros.

Chrome 110

Las llamadas a la API de Extension restablecen los temporizadores. Antes de esto, solo los controladores de eventos en ejecución mantenían activo un service worker. Los eventos que estaban en cola, pero para los que no se había llamado a un controlador, no provocaban un restablecimiento.

Chrome 109

Los mensajes enviados desde un documento fuera de pantalla restablecen los temporizadores.

Chrome 105

Si te conectas a un host de mensajería nativa con chrome.runtime.connectNative(), se mantendrá activo un service worker. Si el proceso del host falla o se cierra, el puerto se cierra y el service worker finaliza después de que finalizan los cronómetros. Para protegerte contra esto, llama a chrome.runtime.connectNative() en el controlador de eventos onDisconnect del puerto.