Command Palette

Search for a command to run...

Ciclo de Vida de Service Workers: Instalación, Activación y Actualización

Domina las fases de instalación, activación y actualización del ciclo de vida de Service Workers para implementar estrategias de caching robustas y actualizaciones sin problemas.

Lectura: 18 min
Nivel: Intermedio

TL;DR - Resumen rápido

  • El ciclo de vida de un Service Worker tiene tres fases principales: instalación, activación y control
  • El evento install se dispara una vez por Service Worker y es ideal para precachear recursos
  • El evento activate se dispara cuando el Service Worker toma control de las páginas
  • Las actualizaciones del Service Worker se instalan en segundo plano mientras el antiguo sigue activo
  • Usa skipWaiting() para activación inmediata o espera a que las páginas se cierren

Introducción al Ciclo de Vida

El ciclo de vida de un Service Worker es más complejo que el de otros tipos de workers en JavaScript. Este ciclo de vida diseñado específicamente permite actualizaciones sin interrupciones y asegura que los usuarios siempre tengan una experiencia fluida, incluso cuando se actualiza el Service Worker.

El ciclo de vida tiene tres fases principales: instalación, activación y control. Durante la instalación, el Service Worker precachea recursos críticos. Durante la activación, toma control de las páginas y limpia caches antiguos. Durante el control, intercepta las peticiones HTTP y maneja el caching.

  • <strong>Instalación</strong>: El Service Worker se instala y precachea recursos críticos
  • <strong>Activación</strong>: El Service Worker se activa y toma control de las páginas
  • <strong>Control</strong>: El Service Worker intercepta peticiones y maneja el caching
  • <strong>Actualización</strong>: Una nueva versión se instala en segundo plano
  • <strong>Redundancia</strong>: El Service Worker antiguo sigue activo hasta que se activa el nuevo

Diseño del ciclo de vida

El ciclo de vida de los Service Workers fue diseñado para permitir actualizaciones sin interrupciones. Cuando actualizas un Service Worker, el nuevo se instala en segundo plano mientras el antiguo sigue controlando las páginas. Esto asegura que los usuarios nunca experimenten una interrupción durante la actualización.

Fase de Instalación

La fase de instalación es el primer paso en el ciclo de vida de un Service Worker. El evento install se dispara cuando el navegador descarga e instala el Service Worker por primera vez. Este evento solo se dispara una vez por Service Worker, lo que lo hace ideal para precachear recursos críticos.

Evento Install

El evento install es donde realizas todas las tareas de inicialización, como precachear recursos críticos que tu aplicación necesita para funcionar offline. El método event.waitUntil() asegura que la instalación no complete hasta que todas las tareas asíncronas hayan terminado.

evento-install-detallado.js
Loading code...

Este ejemplo muestra un manejo detallado del evento install. Precachear recursos críticos usando cache.addAll(), y usamos event.waitUntil() para asegurar que la instalación no complete hasta que todos los recursos se hayan cacheado exitosamente.

skipWaiting()

El método skipWaiting() fuerza la activación inmediata del Service Worker, sin esperar a que todas las páginas controladas por el Service Worker anterior se cierren. Esto es útil durante el desarrollo pero debe usarse con cuidado en producción.

skip-waiting.js
Loading code...

Este ejemplo muestra cómo usar skipWaiting() para forzar la activación inmediata. Sin skipWaiting(), el Service Worker esperaría a que todas las páginas controladas por el Service Worker anterior se cierren antes de activarse.

Advertencia de skipWaiting

Usar skipWaiting() puede causar que múltiples versiones de tu aplicación se ejecuten simultáneamente en diferentes pestañas. Esto puede causar inconsistencias si la nueva versión no es compatible con la antigua. Considera implementar una notificación al usuario antes de activar la nueva versión.

Fase de Activación

La fase de activación es donde el Service Worker toma control de las páginas. El evento activate se dispara cuando el Service Worker se activa, lo que ocurre después de la instalación. Este evento es ideal para limpiar caches antiguos que ya no se necesitan.

Evento Activate

El evento activate es donde realizas tareas de limpieza y preparación. Es el lugar ideal para eliminar caches antiguos que ya no se necesitan, asegurando que el cache no crezca indefinidamente.

evento-activate-detallado.js
Loading code...

Este ejemplo muestra un manejo detallado del evento activate. Eliminamos caches antiguos que no coinciden con el cache actual, y usamos event.waitUntil() para asegurar que la activación no complete hasta que la limpieza termine.

clients.claim()

El método clients.claim() hace que el Service Worker tome control de todas las páginas abiertas inmediatamente, sin esperar a que se recarguen. Esto es útil para asegurar que el Service Worker tome control de todas las páginas lo más rápido posible.

clients-claim.js
Loading code...

Este ejemplo muestra cómo usar clients.claim() para tomar control de todas las páginas abiertas inmediatamente. Sin clients.claim(), el Service Worker solo tomaría control de las páginas que se recarguen después de la activación.

Mejor práctica

Usa clients.claim() en el evento activate para asegurar que el Service Worker tome control de todas las páginas abiertas lo más rápido posible. Esto mejora la experiencia del usuario al asegurar que el Service Worker esté activo en todas las páginas.

Fase de Control

La fase de control es donde el Service Worker intercepta las peticiones HTTP y maneja el caching. El Service Worker toma control de las páginas después de la activación y comienza a interceptar todas las peticiones que hacen las páginas bajo su control.

Evento Fetch

El evento fetch se dispara cada vez que una página bajo el control del Service Worker hace una petición HTTP. Es donde implementas las estrategias de caching y decides cómo manejar cada petición.

evento-fetch-control.js
Loading code...

Este ejemplo muestra cómo implementar una estrategia de caching en el evento fetch. Primero buscamos en el cache, y si no encontramos la respuesta, hacemos la petición a la red y guardamos la respuesta en el cache.

Verificar Control

Puedes verificar si un Service Worker está controlando una página usando navigator.serviceWorker.controller. Esta propiedad es null si no hay un Service Worker activo, o contiene el Service Worker que está controlando la página.

verificar-control.js
Loading code...

Este ejemplo muestra cómo verificar si un Service Worker está controlando la página. También mostramos cómo escuchar cambios en el Service Worker controlador usando el evento controllerchange.

Actualización del Service Worker

Cuando actualizas el archivo del Service Worker, el navegador detecta el cambio y comienza el proceso de actualización. El nuevo Service Worker se instala en segundo plano mientras el antiguo sigue controlando las páginas. El nuevo Service Worker solo se activa cuando todas las páginas controladas por el antiguo se cierran.

Detectar Actualización

Puedes detectar cuando hay una nueva versión del Service Worker disponible usando el evento updatefound. Este evento se dispara cuando el navegador encuentra una nueva versión del Service Worker.

detectar-actualizacion.js
Loading code...

Este ejemplo muestra cómo detectar cuando hay una nueva versión del Service Worker disponible. El evento updatefound se dispara cuando se encuentra una nueva versión, y el evento statechange nos permite seguir el progreso de la instalación.

Forzar Actualización

Puedes forzar la activación inmediata del nuevo Service Worker usando skipWaiting(). Esto es útil durante el desarrollo pero debe usarse con cuidado en producción, ya que puede causar que múltiples versiones de tu aplicación se ejecuten simultáneamente.

forzar-actualizacion.js
Loading code...

Este ejemplo muestra cómo forzar la activación inmediata del nuevo Service Worker usando skipWaiting(). También mostramos cómo notificar al usuario cuando hay una nueva versión disponible y permitirle decidir cuándo recargar.

Estrategia de actualización

Una buena estrategia de actualización es notificar al usuario cuando hay una nueva versión disponible y permitirle decidir cuándo recargar. Esto evita interrupciones inesperadas y permite al usuario terminar su trabajo actual antes de actualizar.

Esperar Actualización

Por defecto, un nuevo Service Worker espera a que todas las páginas controladas por el antiguo se cierren antes de activarse. Esto asegura que no haya múltiples versiones de tu aplicación ejecutándose simultáneamente.

esperar-actualizacion.js
Loading code...

Este ejemplo muestra cómo esperar a que el usuario cierre todas las pestañas antes de activar el nuevo Service Worker. El evento controllerchange se dispara cuando el nuevo Service Worker toma control de la página.

Errores Comunes

Hay varios errores comunes que puedes encontrar al trabajar con el ciclo de vida de los Service Workers. Conocer estos errores y cómo evitarlos te ayudará a implementar Service Workers robustos y confiables.

Service Worker No Se Activa

Un error común es que el Service Worker no se active después de la instalación. Esto puede ocurrir si el evento install no llama a event.waitUntil() con una Promise que se resuelve, o si hay un error durante la instalación.

error-no-activa.js
Loading code...

Este ejemplo muestra un error común donde el Service Worker no se activa porque el evento install no llama a event.waitUntil(). La solución es asegurarse de que event.waitUntil() se llame con una Promise que se resuelve.

Cache Antiguo No Se Elimina

Otro error común es que los caches antiguos no se eliminen durante la activación. Esto puede causar que el cache crezca indefinidamente y consuma demasiado espacio de almacenamiento.

error-cache-antiguo.js
Loading code...

Este ejemplo muestra un error común donde los caches antiguos no se eliminan. La solución es implementar una limpieza de caches en el evento activate que elimine todos los caches excepto el actual.

Limpieza de cache

Siempre implementa limpieza de caches en el evento activate. Los caches pueden crecer indefinidamente si no los limpias periódicamente, lo que puede causar problemas de almacenamiento y rendimiento.

Actualización Silenciosa

Un error común es que las actualizaciones del Service Worker ocurran silenciosamente sin que el usuario se entere. Esto puede causar confusión si la nueva versión tiene cambios significativos.

error-actualizacion-silenciosa.js
Loading code...

Este ejemplo muestra cómo notificar al usuario cuando hay una nueva versión disponible. Escuchamos el evento updatefound y mostramos una notificación al usuario cuando se encuentra una nueva versión.

Resumen: Ciclo de Vida de Service Workers

Conceptos principales:

  • El ciclo de vida tiene tres fases: instalación, activación y control
  • El evento install se dispara una vez y es ideal para precachear recursos
  • El evento activate se dispara cuando el Service Worker toma control de las páginas
  • Las actualizaciones se instalan en segundo plano mientras el antiguo sigue activo
  • skipWaiting() fuerza la activación inmediata del nuevo Service Worker

Mejores prácticas:

  • Usa event.waitUntil() en install y activate para tareas asíncronas
  • Implementa limpieza de caches en el evento activate
  • Usa clients.claim() para tomar control de todas las páginas inmediatamente
  • Notifica al usuario cuando hay una nueva versión disponible
  • Usa skipWaiting() con cuidado en producción