Get to know MDN better
Esta página ha sido traducida del inglés por la comunidad. Aprende más y únete a la comunidad de MDN Web Docs.
Este artículo proporciona información sobre cómo comenzar con los service workers, incluyendo la arquitectura básica, el registro de un service worker, el proceso de instalación y activación de un nuevo service worker, la actualización del service worker, el control de caché y las respuestas personalizadas, todo en el contexto de una aplicación con funcionalidad sin conexión.
Un problema predominante que los usuarios web han sufrido durante años es la pérdida de conectividad. La mejor aplicación web del mundo proporcionará una experiencia de usuario terrible si no se puede descargar. Ha habido varios intentos de crear tecnologías para resolver este problema, y algunos de los problemas se han resuelto. Pero el problema predominante es que no existía un buen mecanismo de control general para el almacenamiento en caché de recursos y las solicitudes de red personalizadas.
Los service workers solucionan estos problemas. Usando un service worker se puede configurar una aplicación para usar recursos almacenados en caché primero, proporcionando así una experiencia predeterminada incluso sin conexión, antes de obtener más datos de la red (comúnmente conocido como "offline first"). Esto ya está disponible con las aplicaciones nativas, que es una de las principales razones por las que las aplicaciones nativas se eligen a menudo en lugar de las aplicaciones web.
Un service worker funciona como un servidor proxy, permitiendo modificar las solicitudes y respuestas reemplazándolas con elementos de su propia caché.
Los service workers están habilitados de forma predeterminada en todos los navegadores modernos. Para ejecutar código que use service workers, se necesita servir el código a través de HTTPS, ya que los service workers están restringidos a ejecutarse sobre HTTPS por razones de seguridad. Es necesario un servidor que soporte HTTPS. Para alojar experimentos, se puede usar un servicio como GitHub, Netlify, Vercel, etc. Para facilitar el desarrollo local, los navegadores también consideran localhost como un origen seguro.
Con los service workers, generalmente se observan los siguientes pasos para la configuración básica:
Este es un resumen de los eventos de service worker disponibles:
Para demostrar los conceptos básicos de registro e instalación de un service worker, se ha creado una demostración simple llamada simple service worker, que es una galería de imágenes de Star Wars Lego. Utiliza una función basada en promesas para leer datos de imagen de un objeto JSON y cargar las imágenes usando fetch(), antes de mostrar las imágenes en línea en la página. Se ha mantenido estático por ahora. También registra, instala y activa un service worker.
Se puede ver el código fuente en GitHub y el simple service worker ejecutándose en vivo.
El primer bloque de código en el archivo JavaScript de la aplicación, app.js, es el siguiente. Este es el punto de entrada para usar service workers.
Esto registra un service worker, que se ejecuta en un contexto worker y, por lo tanto, no tiene acceso al DOM.
Un solo service worker puede controlar muchas páginas. Cada vez que se carga una página dentro de su alcance, el service worker se instala para esa página y opera en ella. Por lo tanto, es necesario tener cuidado con las variables globales en el script del service worker: cada página no tiene su propio worker único.
Nota: Una gran ventaja de los service workers es que si se usa la detección de características como se muestra arriba, los navegadores que no soportan service workers pueden simplemente usar la aplicación en línea de la manera normal esperada.
Un service worker falla en registrarse por una de las siguientes razones:
Después de que el service worker se registra, el navegador intentará instalar y luego activar el service worker para la página/sitio.
El evento install es el primer evento que se dispara en la instalación o actualización del service worker. Se emite una sola vez, inmediatamente después de que el registro se completa exitosamente, y se usa generalmente para llenar las capacidades de almacenamiento en caché sin conexión del navegador con los recursos necesarios para ejecutar la aplicación sin conexión. Para esto, se usa la API de almacenamiento del Service Worker, cache, un objeto global en el service worker que permite almacenar recursos entregados por respuestas, indexados por sus solicitudes. Esta API funciona de manera similar a la caché estándar del navegador, pero es específica para el dominio. Los contenidos de la caché se mantienen hasta que se limpien.
Así es como el service worker maneja el evento install:
Nota: La API Web Storage (localStorage) funciona de manera similar a la caché del service worker, pero es síncrona, por lo que no está permitida en service workers.
Nota: IndexedDB se puede usar dentro de un service worker para almacenamiento de datos si se requiere.
Ahora que los recursos del sitio están almacenados en caché, se necesita indicar a los service workers que hagan algo con el contenido almacenado en caché. Esto se hace con el evento fetch.
Un evento fetch se dispara cada vez que se obtiene cualquier recurso controlado por un service worker, lo que incluye los documentos dentro del alcance especificado y cualquier recurso referenciado en esos documentos (por ejemplo, si index.html hace una solicitud de origen cruzado para incrustar una imagen, eso también pasa por su service worker).
Se puede adjuntar un detector de eventos fetch al service worker, luego llamar al método respondWith() en el evento para interceptar las respuestas HTTP y actualizarlas con contenido propio.
Se podría empezar respondiendo con el recurso cuya URL coincida con la de la solicitud de red, en cada caso:
caches.match(event.request) permite hacer coincidir cada recurso solicitado de la red con el recurso equivalente disponible en la caché, si hay uno coincidente disponible. La coincidencia se realiza a través de URL y varios encabezados, al igual que con las solicitudes HTTP normales.
caches.match(event.request) es excelente cuando hay una coincidencia en la caché del service worker, pero ¿qué pasa con los casos en los que no hay coincidencia? Si no se proporciona ningún tipo de manejo de fallos, la promesa se resolvería con undefined y no se obtendría nada.
Después de probar la respuesta de la caché, se puede recurrir a una solicitud de red regular:
Si los recursos no están en la caché, se solicitan de la red.
Usando una estrategia más elaborada, se podría no solo solicitar el recurso de la red, sino también guardarlo en la caché para que las solicitudes posteriores de ese recurso también se puedan recuperar sin conexión. Esto significaría que si se añadieran imágenes adicionales a la galería de Star Wars, la aplicación podría capturarlas automáticamente y almacenarlas en caché. El siguiente fragmento implementa tal estrategia:
Si la URL de la solicitud no está disponible en la caché, se solicita el recurso de la red con await fetch(request). Después de eso, se coloca un clon de la respuesta en la caché. La función putInCache() usa caches.open('v1') y cache.put() para agregar el recurso a la caché. La respuesta original se devuelve al navegador para entregarse a la página que la solicitó.
Clonar la respuesta es necesario porque los flujos de solicitud y respuesta solo se pueden leer una vez. Para devolver la respuesta al navegador y ponerla en la caché, es necesario clonarla. Así el original se devuelve al navegador y el clon se envía a la caché. Cada uno se lee una vez.
Lo que puede parecer un poco extraño es que la promesa devuelta por putInCache() no se espera. La razón es que no se desea esperar hasta que el clon de respuesta se haya agregado a la caché antes de devolver una respuesta. Sin embargo, es necesario llamar a event.waitUntil() con la promesa, para asegurar que el service worker no se detenga antes de que la caché se haya llenado.
El único problema ahora es que si la solicitud no coincide con nada en la caché y la red no está disponible, la solicitud seguirá fallando. Se puede proporcionar un respaldo predeterminado para que, pase lo que pase, el usuario al menos obtenga algo:
Se ha optado por esta imagen alternativa porque las únicas actualizaciones que probablemente fallarán son las imágenes nuevas, ya que todo lo demás depende de la instalación en el detector de eventos install visto anteriormente.
Si está habilitada, la función de precarga de navegación comienza a descargar recursos tan pronto como se realiza la solicitud de fetch, y en paralelo con la activación del service worker. Esto asegura que la descarga comience inmediatamente al navegar a una página, en lugar de tener que esperar hasta que el service worker esté activado. Ese retraso ocurre relativamente rara vez, pero es inevitable cuando sucede y puede ser significativo.
Primero, la función debe habilitarse durante la activación del service worker, usando registration.navigationPreload.enable():
Luego se usa event.preloadResponse para esperar a que el recurso precargado termine de descargarse en el controlador de eventos fetch.
Continuando con el ejemplo de las secciones anteriores, se inserta el código para esperar el recurso precargado después de la verificación de caché, y antes de obtenerlo de la red si eso no tiene éxito.
El nuevo proceso es:
Nótese que en este ejemplo se descargan y almacenan en caché los mismos datos para el recurso, ya sea que se descargue "normalmente" o se precargue. En su lugar, se puede optar por descargar y almacenar en caché un recurso diferente en la precarga. Para más información, consulte NavigationPreloadManager > Respuestas personalizadas.
Si el service worker se instaló previamente, pero luego hay una nueva versión del worker disponible al refrescar o cargar la página, la nueva versión se instala en segundo plano, pero aún no se activa. Solo se activa cuando ya no hay páginas cargadas que aún usen el service worker antiguo. Tan pronto como no queden más páginas cargadas de este tipo, el nuevo service worker se activa.
Nota: Es posible evitar esto usando Clients.claim().
Se querrá actualizar el detector de eventos install en el nuevo service worker a algo como esto (nótese el nuevo número de versión):
Mientras el service worker se está instalando, la versión anterior sigue siendo responsable de los fetches. La nueva versión se está instalando en segundo plano. Se está llamando a la nueva caché v2, por lo que la caché anterior v1 no se ve afectada.
Cuando ninguna página está usando la versión anterior, el nuevo worker se activa y se vuelve responsable de los fetches.
Como se vio en la sección anterior, cuando se actualiza un service worker a una nueva versión, se crea una nueva caché en el controlador de eventos install. Mientras haya páginas abiertas controladas por la versión anterior del worker, es necesario mantener ambas cachés, porque la versión anterior necesita su versión de la caché. Se puede usar el evento activate para eliminar datos de las cachés anteriores.
Las promesas pasadas a waitUntil() bloquearán otros eventos hasta completarse, por lo que se puede estar seguro de que la operación de limpieza se habrá completado para cuando se reciba el primer evento fetch en el nuevo service worker.
This page was last modified on 15 abr 2026 by MDN contributors.
Your blueprint for a better internet.
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998–2026 by individual mozilla.org contributors. Content available under a Creative Commons license.