Español

Una guía completa para implementar Aplicaciones Web Progresivas (PWAs), cubriendo conceptos básicos, service workers, archivos de manifiesto y las mejores prácticas.

Aplicaciones Web Progresivas: Una Guía de Implementación Completa para Desarrolladores Globales

Las Aplicaciones Web Progresivas (PWAs) representan un cambio de paradigma en el desarrollo web, difuminando las líneas entre los sitios web tradicionales y las aplicaciones móviles nativas. Ofrecen una experiencia de usuario mejorada, caracterizada por la fiabilidad, la instalabilidad y el compromiso, lo que las convierte en una solución ideal para llegar a una audiencia global con diferentes capacidades de conectividad a Internet y dispositivos.

¿Qué son las Aplicaciones Web Progresivas?

Las PWAs son aplicaciones web que aprovechan los estándares web modernos para proporcionar una experiencia similar a la de una aplicación nativa. Son:

A diferencia de las aplicaciones nativas, las PWAs se pueden descubrir a través de los motores de búsqueda, se pueden compartir fácilmente a través de URL y no requieren que los usuarios pasen por las tiendas de aplicaciones. Esto las convierte en una solución accesible y rentable para las empresas que buscan expandir su alcance.

Tecnologías centrales detrás de las PWAs

Las PWAs se construyen sobre tres tecnologías principales:

1. HTTPS

La seguridad es primordial. Las PWAs deben servirse a través de HTTPS para evitar el espionaje y garantizar la integridad de los datos. Este es un requisito fundamental para que los service workers funcionen.

2. Service Workers

Los service workers son archivos JavaScript que se ejecutan en segundo plano, separados del hilo principal del navegador. Actúan como servidores proxy entre la aplicación web y la red, lo que permite funciones como:

Ciclo de vida del Service Worker: Comprender el ciclo de vida del service worker (registro, instalación, activación, actualizaciones) es crucial para una implementación eficaz de PWA. La gestión incorrecta puede generar problemas de almacenamiento en caché y un comportamiento inesperado. Cubriremos las actualizaciones con más detalle más adelante.

3. Manifiesto de la aplicación web

El manifiesto de la aplicación web es un archivo JSON que proporciona metadatos sobre la PWA, como:

Pasos de implementación: Creación de una PWA sencilla

Repasemos los pasos para crear una PWA sencilla:

Paso 1: Configurar HTTPS

Asegúrese de que su sitio web se sirva a través de HTTPS. Puede obtener un certificado SSL gratuito de Let's Encrypt.

Paso 2: Crear un manifiesto de aplicación web (manifest.json)

Cree un archivo llamado `manifest.json` y agregue el siguiente código:


{
  "name": "My Simple PWA",
  "short_name": "PWA",
  "icons": [
    {
      "src": "icon-192x192.png",
      "sizes": "192x192",
      "type": "image/png"
    },
    {
      "src": "icon-512x512.png",
      "sizes": "512x512",
      "type": "image/png"
    }
  ],
  "start_url": "/index.html",
  "display": "standalone",
  "theme_color": "#ffffff",
  "background_color": "#ffffff"
}

Reemplace `icon-192x192.png` y `icon-512x512.png` con sus archivos de iconos reales. Necesitará generar estos iconos en varios tamaños. Herramientas en línea como Real Favicon Generator pueden ayudar con esto.

Paso 3: Vincular el archivo de manifiesto en su HTML

Agregue la siguiente línea a la sección `<head>` de su archivo `index.html`:


<link rel="manifest" href="/manifest.json">

Paso 4: Crear un Service Worker (service-worker.js)

Cree un archivo llamado `service-worker.js` y agregue el siguiente código:


const CACHE_NAME = 'my-pwa-cache-v1';
const urlsToCache = [
  '/',
  '/index.html',
  '/style.css',
  '/script.js',
  '/icon-192x192.png',
  '/icon-512x512.png'
];

self.addEventListener('install', function(event) {
  // Perform install steps
  event.waitUntil(
    caches.open(CACHE_NAME)
      .then(function(cache) {
        console.log('Opened cache');
        return cache.addAll(urlsToCache);
      })
  );
});

self.addEventListener('fetch', function(event) {
  event.respondWith(
    caches.match(event.request)
      .then(function(response) {
        // Cache hit - return response
        if (response) {
          return response;
        }

        // IMPORTANT: If we're here, it means the request was not found in the cache.
        return fetch(event.request).then(
          function(response) {
            // Check if we received a valid response
            if(!response || response.status !== 200 || response.type !== 'basic') {
              return response;
            }

            // IMPORTANT: Clone the response. A response is a stream
            // and because we want the browser to consume the response
            // as well as the cache consuming the response, we need
            // to clone it so we have two independent copies.
            var responseToCache = response.clone();

            caches.open(CACHE_NAME)
              .then(function(cache) {
                cache.put(event.request, responseToCache);
              });

            return response;
          }
        );
      })
  );
});

self.addEventListener('activate', function(event) {

  var cacheWhitelist = [CACHE_NAME];

  event.waitUntil(
    caches.keys().then(function(cacheNames) {
      return Promise.all(
        cacheNames.map(function(cacheName) {
          if (cacheWhitelist.indexOf(cacheName) === -1) {
            return caches.delete(cacheName);
          }
        })
      );
    })
  );
});

Este service worker almacena en caché los archivos especificados durante la instalación y los sirve desde la caché cuando el usuario no está conectado o está en una red lenta.

Paso 5: Registrar el Service Worker en su JavaScript

Agregue el siguiente código a su archivo `script.js`:


if ('serviceWorker' in navigator) {
  window.addEventListener('load', function() {
    navigator.serviceWorker.register('/service-worker.js')
      .then(function(registration) {
        // Registration was successful
        console.log('ServiceWorker registration successful with scope: ', registration.scope);
      },
      function(err) {
        // registration failed :(
        console.log('ServiceWorker registration failed: ', err);
      });
  });
}

Este código verifica si el navegador es compatible con los service workers y registra el archivo `service-worker.js`.

Paso 6: Prueba tu PWA

Abra su sitio web en un navegador que sea compatible con PWAs (por ejemplo, Chrome, Firefox, Safari). Abra las herramientas para desarrolladores y verifique la pestaña "Aplicación" para ver si el service worker está registrado correctamente y el archivo de manifiesto está cargado.

Ahora debería ver un aviso de "Agregar a la pantalla de inicio" en su navegador. Al hacer clic en este aviso, se instalará la PWA en su dispositivo.

Funciones y consideraciones avanzadas de PWA

Notificaciones push

Las notificaciones push son una forma poderosa de volver a interactuar con los usuarios con su PWA. Para implementar las notificaciones push, deberá:

  1. Obtener una clave de la API Push: Necesitará usar un servicio como Firebase Cloud Messaging (FCM) o un servicio similar para manejar las notificaciones push. Esto requiere crear una cuenta y obtener una clave de API.
  2. Suscribir al usuario: En su PWA, deberá solicitar permiso al usuario para recibir notificaciones push y luego suscribirlos a su servicio push.
  3. Manejar los eventos push: En su service worker, deberá escuchar los eventos push y mostrar la notificación al usuario.

Ejemplo (Simplificado - usando Firebase):

En su `service-worker.js`:


// Import the Firebase libraries
importScripts('https://www.gstatic.com/firebasejs/9.6.11/firebase-app-compat.js');
importScripts('https://www.gstatic.com/firebasejs/9.6.11/firebase-messaging-compat.js');

// Initialize Firebase
const firebaseConfig = {
  apiKey: "YOUR_API_KEY",
  authDomain: "YOUR_AUTH_DOMAIN",
  projectId: "YOUR_PROJECT_ID",
  storageBucket: "YOUR_STORAGE_BUCKET",
  messagingSenderId: "YOUR_MESSAGING_SENDER_ID",
  appId: "YOUR_APP_ID",
  measurementId: "YOUR_MEASUREMENT_ID"
};

firebase.initializeApp(firebaseConfig);

const messaging = firebase.messaging();

messaging.onBackgroundMessage(function(payload) {
  console.log('[firebase-messaging-sw.js] Received background message ', payload);
  // Customize notification here
  const notificationTitle = 'Background Message Title';
  const notificationOptions = {
    body: 'Background Message body.',
    icon: '/icon-512x512.png'
  };

  self.registration.showNotification(notificationTitle, notificationOptions);
});

Importante: Reemplace los valores del marcador de posición con su configuración real de Firebase. Este ejemplo demuestra el manejo de mensajes en segundo plano. Necesitará implementar la lógica de suscripción en su código JavaScript principal.

Sincronización en segundo plano

La sincronización en segundo plano permite que su PWA realice tareas incluso cuando el usuario no está conectado. Esto es útil para escenarios como:

Para usar la sincronización en segundo plano, deberá registrarse para el evento `sync` en su service worker y manejar la lógica de sincronización.

Estrategias de soporte sin conexión

Hay varias estrategias para proporcionar soporte sin conexión en su PWA:

La mejor estrategia depende de los requisitos específicos de su aplicación.

Actualizaciones de PWA

Las actualizaciones de service worker son una parte crucial del mantenimiento de PWA. Cuando el navegador detecta un cambio en su archivo `service-worker.js` (incluso un cambio de un solo byte), activa un proceso de actualización. El nuevo service worker se instala en segundo plano, pero no se activa hasta la próxima vez que el usuario visite su PWA o se cierren todas las pestañas existentes controladas por el antiguo service worker.

Puede forzar una actualización inmediata llamando a `self.skipWaiting()` en el evento `install` de su nuevo service worker y `clients.claim()` en el evento `activate`. Sin embargo, esto puede interrumpir la experiencia del usuario, por lo que debe usarse con precaución.

Consideraciones de SEO para PWAs

Las PWAs son generalmente compatibles con SEO, ya que son esencialmente sitios web. Sin embargo, hay algunas cosas a tener en cuenta:

Compatibilidad entre navegadores

Si bien las PWAs se basan en estándares web, la compatibilidad con los navegadores puede variar. Es importante probar su PWA en diferentes navegadores y dispositivos para asegurarse de que funcione correctamente. Use la detección de funciones para degradar con elegancia la funcionalidad en los navegadores que no admiten ciertas funciones.

Depuración de PWAs

La depuración de PWAs puede ser un desafío debido a la naturaleza asíncrona de los service workers. Use las herramientas para desarrolladores del navegador para inspeccionar el registro de service workers, el almacenamiento en caché y las solicitudes de red. Preste mucha atención a los registros de la consola y a los mensajes de error.

Ejemplos de PWA en todo el mundo

Numerosas empresas de todo el mundo han implementado con éxito PWAs. Estos son algunos ejemplos diversos:

Conclusión: Abrazando el futuro de la web

Las Aplicaciones Web Progresivas ofrecen una alternativa convincente a los sitios web tradicionales y a las aplicaciones móviles nativas. Proporcionan una experiencia de usuario superior, un rendimiento mejorado y un mayor compromiso, lo que las convierte en una herramienta valiosa para las empresas que buscan llegar a una audiencia global. Al comprender los conceptos básicos y seguir los pasos de implementación descritos en esta guía, los desarrolladores pueden crear PWAs que sean confiables, instalables y atractivas, proporcionando una ventaja competitiva en el mundo actual, que da prioridad a los dispositivos móviles. ¡Abrace el futuro de la web y comience a construir sus propias Aplicaciones Web Progresivas hoy!