Command Palette

Search for a command to run...

Progressive Web Apps (PWA): Aplicaciones Web Instalables y Offline

Aprende a crear Progressive Web Apps que funcionan offline, son instalables y ofrecen una experiencia nativa usando Service Workers y Web App Manifest.

Lectura: 15 min
Nivel: Intermedio

TL;DR - Resumen rápido

  • Las PWA combinan lo mejor de web y apps nativas: instalables, offline-first y responsivas
  • Service Workers actúan como proxy entre tu app y la red, habilitando caching y offline
  • Web App Manifest define metadatos para instalación en dispositivos móviles y desktop
  • Las estrategias de caching (cache-first, network-first, stale-while-revalidate) determinan cómo se sirven los recursos
  • El ciclo de vida del Service Worker incluye instalación, activación y fetch events

Introducción a las PWA

Las Progressive Web Apps (PWA) representan una evolución fundamental en el desarrollo web moderno, permitiendo que las aplicaciones web ofrezcan una experiencia comparable a las aplicaciones nativas. Una PWA es una aplicación web que utiliza tecnologías web modernas para proporcionar una experiencia de usuario confiable, rápida y atractiva, con características clave como la capacidad de funcionar offline, ser instalada en el dispositivo y recibir notificaciones push.

El concepto de PWA fue introducido por Google en 2015 como respuesta a la necesidad de aplicaciones web que pudieran competir con las aplicaciones nativas en términos de funcionalidad y experiencia de usuario. A diferencia de las apps nativas, las PWA no requieren instalación desde una tienda de aplicaciones y son accesibles a través de cualquier navegador moderno que soporte las tecnologías PWA.

Características clave de una PWA

Una PWA debe cumplir ciertos criterios para ser considerada instalable: tener un Service Worker registrado, usar HTTPS, incluir un Web App Manifest con nombre, iconos y colores definidos, y ser responsiva. Cuando se cumplen estos requisitos, el navegador muestra un indicador de instalación y permite agregar la app a la pantalla de inicio o escritorio.

¿Qué es una PWA?

Una Progressive Web App es esencialmente una aplicación web construida con tecnologías estándar (HTML, CSS y JavaScript) que aprovecha APIs modernas del navegador para ofrecer funcionalidades que tradicionalmente solo estaban disponibles en aplicaciones nativas. La arquitectura de una PWA se basa en tres pilares fundamentales que trabajan juntos para crear una experiencia de usuario superior.

  • <strong>Service Workers</strong>: Scripts que se ejecutan en segundo plano y actúan como proxy de red, permitiendo caching, background sync y notificaciones push.
  • <strong>Web App Manifest</strong>: Archivo JSON que define metadatos de la aplicación como nombre, iconos, colores y modo de visualización.
  • <strong>HTTPS obligatorio</strong>: Todas las PWA deben servirse a través de HTTPS para garantizar seguridad y habilitar ciertas APIs del navegador.

La filosofía detrás de las PWA es la progresividad: la aplicación debe funcionar bien en cualquier navegador, pero mejorar progresivamente en navegadores que soportan las características avanzadas. Esto significa que una PWA degradará graciosamente en navegadores antiguos, ofreciendo una experiencia básica, mientras que en navegadores modernos proporcionará todas las capacidades avanzadas.

Ventajas de las PWA sobre apps nativas

Las PWA ofrecen ventajas significativas: son más ligeras (generalmente menos de 1MB vs 50MB+ de apps nativas), no requieren aprobación de tiendas de aplicaciones, se actualizan automáticamente sin intervención del usuario, funcionan en múltiples plataformas con una sola base de código, y son indexables por motores de búsqueda, mejorando el SEO.

Service Workers

Los Service Workers son el corazón de una PWA y representan una de las tecnologías más importantes de las Web APIs modernas. Un Service Worker es esencialmente un script que se ejecuta en un hilo separado del hilo principal de JavaScript, lo que significa que puede realizar operaciones sin bloquear la interfaz de usuario. Esta arquitectura permite que los Service Workers manejen eventos de red, realicen caching y sirvan contenido incluso cuando el usuario está offline.

Los Service Workers tienen un ciclo de vida específico que incluye varias fases: registro, instalación, activación y funcionamiento. Durante la fase de registro, el navegador registra el Service Worker para un origen específico. En la fase de instalación, el Service Worker se descarga e instala, momento en el cual puede precachear recursos estáticos. La fase de activación ocurre cuando el Service Worker está listo para controlar la página, permitiéndole limpiar cachés antiguos. Finalmente, en la fase de funcionamiento, el Service Worker intercepta peticiones de red y responde con recursos cacheados o de la red.

Registro del Service Worker

El primer paso para implementar una PWA es registrar el Service Worker en tu aplicación. El registro debe realizarse en el hilo principal de JavaScript, típicamente en el archivo principal de tu aplicación. Es importante verificar que el navegador soporta Service Workers antes de intentar el registro, ya que no todos los navegadores tienen esta funcionalidad.

registro-service-worker.js
Loading code...

Este código verifica primero si el navegador soporta Service Workers usando la propiedad 'serviceWorker' in navigator. Si hay soporte, registra el Service Worker ubicado en /sw.js usando el método navigator.serviceWorker.register(). El registro devuelve una promesa que se resuelve con el objeto de registro si tiene éxito, o se rechaza si hay un error. Es importante manejar ambos casos para proporcionar retroalimentación al usuario y facilitar la depuración.

Consideraciones importantes para el registro

El Service Worker solo funciona en HTTPS o en localhost. No funcionará en HTTP por razones de seguridad. Además, el archivo del Service Worker debe estar en el mismo origen que la página que lo registra. El registro debe hacerse después de que el DOM esté completamente cargado para evitar conflictos con otros scripts que también puedan estar registrando Service Workers.

Estrategias de Caching

Una de las capacidades más poderosas de los Service Workers es la implementación de estrategias de caching que determinan cómo se sirven los recursos. Las estrategias de caching permiten optimizar el rendimiento, reducir el uso de datos y habilitar funcionalidad offline. Existen varias estrategias comunes, cada una con sus propias ventajas y casos de uso ideales.

estrategias-caching.js
Loading code...

Este código implementa tres estrategias fundamentales de caching. La estrategia cache-first sirve recursos desde la caché si están disponibles, lo que proporciona la respuesta más rápida pero puede entregar contenido obsoleto. La estrategia network-first intenta primero obtener el recurso de la red y solo usa la caché si la red falla, asegurando contenido fresco pero con latencia inicial. La estrategia stale-while-revalidate sirve el recurso cacheado inmediatamente para velocidad, mientras simultáneamente actualiza la caché con la respuesta de la red, proporcionando un balance óptimo entre velocidad y frescura.

  • <strong>Cache First</strong>: Ideal para recursos estáticos que rara vez cambian (imágenes, fuentes, CSS, JS). Proporciona la mejor velocidad.
  • <strong>Network First</strong>: Apropiado para contenido dinámico que debe estar actualizado (API responses, datos de usuario). Garantiza frescura.
  • <strong>Stale-While-Revalidate</strong>: Excelente para contenido que puede tolerar ligera obsolescencia pero necesita actualizarse eventualmente (artículos, feeds).

Offline Fallback

Un aspecto crítico de las PWA es proporcionar una experiencia adecuada cuando el usuario está offline. En lugar de mostrar el error genérico del navegador, tu PWA debería servir una página de fallback que informe al usuario sobre la situación y posibilite navegar por contenido previamente cacheado. Esto no solo mejora la experiencia del usuario, sino que también mantiene el engagement incluso sin conexión.

offline-fallback.js
Loading code...

Este código implementa un mecanismo de fallback para cuando el usuario está offline. Primero, durante la fase de instalación del Service Worker, se cachea una página de fallback específica (/offline.html). Luego, en el evento fetch, se verifica si la petición es para navegación (página principal). Si la petición falla (por ejemplo, porque no hay conexión), se sirve la página de fallback desde la caché. Esto asegura que el usuario siempre vea contenido útil, incluso cuando está completamente offline.

Mejor práctica: precachear recursos críticos

Durante la fase de instalación del Service Worker, precachea todos los recursos críticos que tu aplicación necesita para funcionar offline: HTML principal, CSS, JavaScript esencial, iconos y fuentes. Esto reduce significativamente el tiempo de carga inicial y asegura que la aplicación sea funcional inmediatamente después de la instalación, incluso sin conexión a internet.

Web App Manifest

El Web App Manifest es un archivo JSON que proporciona metadatos sobre tu aplicación web, permitiendo que los navegadores y sistemas operativos la traten como una aplicación instalable. Este archivo define propiedades como el nombre de la aplicación, iconos de diferentes tamaños, colores del tema, modo de visualización y URL de inicio. Cuando el navegador detecta un manifest válido junto con un Service Worker registrado, muestra un indicador de instalación que permite al usuario agregar la aplicación a su dispositivo.

El manifest es fundamental para la experiencia de instalación de una PWA. Define cómo aparecerá la aplicación en la pantalla de inicio del dispositivo, qué iconos se usarán, y cómo se comportará cuando se lance. Por ejemplo, puedes especificar si la aplicación debe abrirse en modo pantalla completa, standalone o dentro del navegador. También puedes definir colores de fondo y de tema para que la integración con el sistema operativo sea más natural.

manifest.json
Loading code...

Este manifest define una PWA básica con los elementos esenciales para la instalación. La propiedad name es el nombre completo de la aplicación que se muestra en la tienda de aplicaciones y en la pantalla de inicio, mientras que short_name es una versión abreviada que se usa donde hay espacio limitado. La propiedad start_url especifica la URL que se carga cuando se inicia la aplicación, y display define cómo se muestra: "standalone" hace que la aplicación se vea como una app nativa sin la interfaz del navegador. Los iconos se especifican en diferentes tamaños para adaptarse a varios dispositivos y contextos de visualización.

Errores comunes en el manifest

Los errores más frecuentes incluyen: no incluir el link al manifest en el HTML, usar rutas relativas incorrectas en start_url o iconos, no proporcionar iconos en todos los tamaños requeridos (mínimo 192x192 y 512x512), y usar display: "browser" que no permite la experiencia de app nativa. Verifica siempre que el manifest sea JSON válido usando un validador online.

Resumen: Progressive Web Apps

Conceptos principales:

  • Las PWA combinan tecnologías web modernas para ofrecer experiencia similar a apps nativas
  • Service Workers son scripts en segundo plano que actúan como proxy de red y habilitan offline
  • Web App Manifest es un archivo JSON que define metadatos para instalación y comportamiento
  • Las estrategias de caching (cache-first, network-first, stale-while-revalidate) optimizan rendimiento
  • El ciclo de vida del Service Worker incluye registro, instalación, activación y fetch events

Mejores prácticas:

  • Siempre usa HTTPS para las PWA (obligatorio para Service Workers)
  • Precachea recursos críticos durante la instalación del Service Worker
  • Implementa páginas de fallback para proporcionar experiencia offline
  • Usa estrategias de caching apropiadas según el tipo de recurso
  • Prueba tu PWA en diferentes dispositivos y navegadores para verificar compatibilidad