El ciclo de vida de un service worker de extensiones

Los trabajadores del servicio de extensión responden a los eventos de trabajador del servicio estándar y a los eventos en los espacios de nombres de la extensión. 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 trabajador de servicio desde Chrome Web Store o cuando carga o actualiza una extensión descomprimida con 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 muestra 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 la extensión a una versión nueva y cuando se actualiza Chrome 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 activate del service worker. Ten en cuenta que, a diferencia de los trabajadores de servicios web, este evento se activa inmediatamente después de la instalación de una extensión porque 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.

Inactivo y apagado

Por lo general, Chrome finaliza un trabajador de servicio 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 respuesta de fetch() 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 trabajador de servicio está inactivo, un evento entrante los reactivará. Sin embargo, debes diseñar tu trabajador de servicio para que sea resistente a la finalización inesperada.

Para optimizar el consumo de recursos de tu extensión, evita mantener el trabajador de servicio activo de forma indefinida si es posible. Prueba tus extensiones para asegurarte de no estar haciendo esto de forma involuntaria.

Cómo conservar datos en lugar de usar variables globales

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

API de chrome.storage
Una API de extensión que ofrece varios tipos de almacenamiento: local, de sesión, administrado (dominio) y sincronizado. 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
Una API de bajo nivel para el almacenamiento del cliente de datos estructurados, incluidos archivos y BLOB. Esta API proporciona primitivas para crear almacenamiento y recuperación de datos transaccionales. Si bien esta API suele ser demasiado complicada para casos de uso simples, se compilan varias soluciones de almacenamiento de terceros 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 trabajadores de servicios web y se usa para recuperar datos de un extremo. Existen varias formas de usar esta API según si es fundamental que los usuarios vean datos actualizados y qué tan importante es. Para obtener más información, consulta The Offline Cookbook. A menos que uses un proxy específico para las solicitudes de red a través del controlador de recuperación, debes usar chrome.storage.

Elige una versión mínima de Chrome

Desde el lanzamiento del manifiesto V3, realizamos varias mejoras en la duración de los trabajadores del servicio. Esto significa que, si tu extensión de Manifest V3 es compatible con versiones anteriores de Chrome, debes tener en cuenta algunas condiciones. Si estas condiciones no afectan a tu extensión, puedes pasar a la siguiente sección. Si es así, 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 segundos para que coincidan con el ciclo de vida del trabajador de servicio. Consulta chrome.alarms para obtener más detalles.

Chrome 118

Las sesiones de depurador activas creadas con la API de chrome.debugger ahora mantienen el trabajador de servicio activo. Esto evita que los trabajadores del servicio se agoten durante las llamadas a esta API.

Chrome 116

En Chrome 116, se introdujeron las siguientes mejoras de tiempo de vida de los trabajadores de servicio:

  • Las conexiones activas de WebSocket ahora extienden la vida útil del trabajador de servicio de la extensión. Enviar o recibir mensajes a través de un WebSocket en un trabajador de servicio de extensión restablece el temporizador inactivo del trabajador de servicio.

  • Las APIs de extensión adicionales pueden superar el tiempo de espera de cinco minutos para los service workers de extensiones. Estas APIs muestran un mensaje para el usuario y, por lo tanto, es posible que demoren más de cinco minutos en resolverse. Entre ellos, se 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 servicio en primer plano. Anteriormente, abrir un puerto restablecía los temporizadores, pero no enviar un mensaje. Abrir un puerto ya no restablece los temporizadores.

Chrome 110

Las llamadas a la API de la extensión restablecen los temporizadores. Antes de esto, solo los controladores de eventos en ejecución mantenían activo un service worker. Los eventos que se hayan puesto en cola, pero para los que no se haya llamado a un controlador, no causarán un restablecimiento.

Chrome 109

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

Chrome 105

Si te conectas a un host de mensajería nativo con chrome.runtime.connectNative(), se mantendrá activo un service worker. Si el proceso del host falla o se cierra, el puerto se cerrará y el trabajador de servicio 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.