El ciclo de vida de un service worker de extensiones

Los service workers de extensiones responden a los eventos estándar de service worker y a los eventos en los espacios de nombres de extensiones. Se presentan juntos porque, a menudo, un tipo sigue a 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 la Chrome Web Store, o cuando carga o actualiza una extensión sin empaquetar con la página chrome://extensions. Se producen tres eventos, en este orden:

  1. install (evento de service worker)
  2. chrome.runtime.onInstalled (evento de extensión)
  3. activate (evento de service worker)

ServiceWorkerRegistration.install

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

chrome.runtime.onInstalled

A continuación, se encuentra el evento onInstalled de la extensión, que se activa cuando se instala la extensión (no el service worker) por primera vez, cuando se actualiza a una versión nueva y cuando Chrome se actualiza a una versión nueva. Usa este evento para establecer un estado o para la 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 de activación del service worker. Ten en cuenta que, a diferencia de los service workers web, este evento se activa inmediatamente después de la instalación de una extensión, ya que no hay nada comparable a una recarga de 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 de service worker.

Inactividad y apagado

Por lo general, Chrome finaliza un service worker cuando se cumple una de las siguientes condiciones:

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

Los eventos y las llamadas a las APIs de extensión restablecen estos temporizadores y, si el service worker está inactivo, un evento entrante los revivirá. 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 tu service worker de forma indefinida si es posible. Prueba tus extensiones para asegurarte de que no lo hagas sin querer.

Persiste los datos en lugar de usar variables globales

Se perderán todas las variables globales que establezcas si se cierra el service worker. En lugar de usar variables globales, guarda los valores en el almacenamiento. Se enumeran tus opciones.

API de chrome.storage
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 quita cuando un usuario borra la caché web.
API de IndexedDB
Una API de bajo nivel para el almacenamiento del lado del cliente de datos estructurados, incluidos archivos y objetos binarios grandes. Esta API proporciona primitivas para crear almacenamiento y recuperación de datos transaccionales. Aunque esta API suele ser demasiado complicada para algunos casos de uso, varias soluciones de almacenamiento de terceros se basan en ella.
API de CacheStorage
Un mecanismo de almacenamiento persistente para pares de objetos Request y Response. Esta API se diseñó específicamente para los service workers web y se usa para recuperar datos de un extremo. Hay varias formas de usar esta API, según si es fundamental que los usuarios vean datos actualizados y cómo lo hagan. Para obtener más información, consulta The Offline Cookbook. A menos que específicamente envíes solicitudes de red a través de un proxy con el 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 los períodos de existencia de los service workers. Esto significa que, si tu extensión de Manifest V3 admite versiones anteriores de Chrome, deberás tener en cuenta ciertas condiciones. Si estas condiciones no afectan tu extensión, puedes omitir esta sección. Si lo hacen, considera especificar una versión mínima de Chrome en tu manifiesto.

Chrome 120

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

Chrome 118

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

Chrome 116

Chrome 116 introdujo las siguientes mejoras en el período de existencia del service worker:

  • Las conexiones WebSocket activas ahora extienden los períodos de existencia de los service workers de extensiones. Enviar o recibir mensajes a través de un WebSocket en un service worker de extensión restablece el temporizador de inactividad del service worker.

  • Se permite que las APIs de extensión adicionales superen el período de tiempo de espera de cinco minutos para los service workers de extensiones. Estas APIs muestran un mensaje al usuario y, por lo tanto, pueden tardar más de cinco minutos en resolverse. Estos incluyen desktopCapture.chooseDesktopMedia(), identity.launchWebAuthFlow(), management.uninstall() y permissions.request().

Chrome 114

Enviar un mensaje con mensajería de larga duración mantiene activo el service worker. Abrir un puerto ya no restablece los temporizadores.

Chrome 110

Las llamadas a la API de extensión restablecen los temporizadores. Antes, solo la ejecución de controladores de eventos mantenía activo un service worker. Los eventos que se pusieron en cola, pero para los que no se llamó a un controlador, no provocarían un restablecimiento.

Chrome 109

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

Chrome 105

Conectarse a un host de mensajería nativa con chrome.runtime.connectNative() mantendrá activo un service worker. Si el proceso del host falla o se cierra, el puerto se cierra y el service worker finalizará después de que se completen los temporizadores. Para evitar esto, llama a chrome.runtime.connectNative() en el controlador de eventos onDisconnect del puerto.