Italiano

Una guida completa all'implementazione delle Progressive Web App (PWA), che copre concetti chiave, service worker, file manifest, notifiche push e best practice.

Progressive Web App: Una guida completa all'implementazione per sviluppatori globali

Le Progressive Web App (PWA) rappresentano un cambio di paradigma nello sviluppo web, sfumando i confini tra i siti web tradizionali e le applicazioni mobile native. Offrono un'esperienza utente migliorata caratterizzata da affidabilità, installabilità e coinvolgimento, rendendole una soluzione ideale per raggiungere un pubblico globale con diverse connettività internet e capacità dei dispositivi.

Cosa sono le Progressive Web App?

Le PWA sono applicazioni web che sfruttano i moderni standard web per fornire un'esperienza simile a un'app nativa. Sono:

A differenza delle app native, le PWA sono individuabili tramite i motori di ricerca, facilmente condivisibili tramite URL e non richiedono agli utenti di passare attraverso gli app store. Questo le rende una soluzione accessibile ed economica per le aziende che desiderano espandere la propria portata.

Tecnologie principali alla base delle PWA

Le PWA sono costruite su tre tecnologie principali:

1. HTTPS

La sicurezza è fondamentale. Le PWA devono essere servite tramite HTTPS per prevenire intercettazioni e garantire l'integrità dei dati. Questo è un requisito fondamentale per il funzionamento dei service worker.

2. Service Worker

I service worker sono file JavaScript che vengono eseguiti in background, separatamente dal thread principale del browser. Agiscono come server proxy tra l'applicazione web e la rete, abilitando funzionalità come:

Ciclo di vita del Service Worker: Comprendere il ciclo di vita del service worker (registrazione, installazione, attivazione, aggiornamenti) è fondamentale per un'efficace implementazione della PWA. Una gestione errata può portare a problemi di caching e comportamenti imprevisti. Tratteremo gli aggiornamenti in modo più dettagliato più avanti.

3. Web App Manifest

Il web app manifest è un file JSON che fornisce metadati sulla PWA, come:

Fasi di implementazione: creazione di una PWA semplice

Analizziamo i passaggi per la creazione di una PWA semplice:

Passaggio 1: Imposta HTTPS

Assicurati che il tuo sito web sia servito tramite HTTPS. Puoi ottenere un certificato SSL gratuito da Let's Encrypt.

Passaggio 2: Crea un file manifest dell'app web (manifest.json)

Crea un file denominato `manifest.json` e aggiungi il codice seguente:


{
  "name": "La mia semplice 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"
}

Sostituisci `icon-192x192.png` e `icon-512x512.png` con i tuoi file icona effettivi. Dovrai generare queste icone in varie dimensioni. Strumenti online come Real Favicon Generator possono aiutarti in questo.

Passaggio 3: collega il file manifest nel tuo HTML

Aggiungi la riga seguente alla sezione `` del tuo file `index.html`:


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

Passaggio 4: crea un service worker (service-worker.js)

Crea un file denominato `service-worker.js` e aggiungi il codice seguente:


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);
          }
        })
      );
    })
  );
});

Questo service worker memorizza nella cache i file specificati durante l'installazione e li serve dalla cache quando l'utente è offline o su una rete lenta.

Passaggio 5: registra il service worker nel tuo JavaScript

Aggiungi il codice seguente al tuo file `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);
      });
  });
}

Questo codice verifica se il browser supporta i service worker e registra il file `service-worker.js`.

Passaggio 6: testa la tua PWA

Apri il tuo sito web in un browser che supporta le PWA (ad esempio, Chrome, Firefox, Safari). Apri gli strumenti per sviluppatori e controlla la scheda "Applicazione" per vedere se il service worker è registrato correttamente e il file manifest è caricato.

Ora dovresti vedere un prompt "Aggiungi alla schermata Home" nel tuo browser. Fare clic su questo prompt installerà la PWA sul tuo dispositivo.

Funzionalità e considerazioni avanzate delle PWA

Notifiche Push

Le notifiche push sono un modo efficace per coinvolgere nuovamente gli utenti con la tua PWA. Per implementare le notifiche push, dovrai:

  1. Ottieni una chiave API Push: Dovrai utilizzare un servizio come Firebase Cloud Messaging (FCM) o un servizio simile per gestire le notifiche push. Ciò richiede la creazione di un account e l'ottenimento di una chiave API.
  2. Iscrivi l'utente: Nella tua PWA, dovrai richiedere l'autorizzazione all'utente per ricevere notifiche push e quindi iscriverlo al tuo servizio push.
  3. Gestisci gli eventi push: Nel tuo service worker, dovrai ascoltare gli eventi push e visualizzare la notifica all'utente.

Esempio (semplificato - utilizzando Firebase):

Nel tuo `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 = 'Titolo del messaggio in background';
  const notificationOptions = {
    body: 'Corpo del messaggio in background.',
    icon: '/icon-512x512.png'
  };

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

Importante: Sostituisci i valori segnaposto con la tua configurazione Firebase effettiva. Questo esempio dimostra la gestione dei messaggi in background. Dovrai implementare la logica di iscrizione nel tuo codice JavaScript principale.

Background Sync

La sincronizzazione in background consente alla tua PWA di eseguire attività anche quando l'utente è offline. Questo è utile per scenari come:

Per utilizzare la sincronizzazione in background, dovrai registrarti all'evento `sync` nel tuo service worker e gestire la logica di sincronizzazione.

Strategie di supporto offline

Esistono diverse strategie per fornire supporto offline nella tua PWA:

La strategia migliore dipende dai requisiti specifici della tua applicazione.

Aggiornamenti PWA

Gli aggiornamenti del service worker sono una parte cruciale della manutenzione della PWA. Quando il browser rileva una modifica nel tuo file `service-worker.js` (anche una singola modifica di byte), attiva un processo di aggiornamento. Il nuovo service worker viene installato in background, ma non diventa attivo fino alla prossima volta che l'utente visita la tua PWA o tutte le schede esistenti controllate dal vecchio service worker vengono chiuse.

Puoi forzare un aggiornamento immediato chiamando `self.skipWaiting()` nell'evento `install` del tuo nuovo service worker e `clients.claim()` nell'evento `activate`. Tuttavia, questo può interrompere l'esperienza dell'utente, quindi usalo con cautela.

Considerazioni SEO per le PWA

Le PWA sono generalmente SEO-friendly, in quanto sono essenzialmente siti web. Tuttavia, ci sono alcune cose da tenere a mente:

Compatibilità tra browser

Sebbene le PWA siano basate su standard web, il supporto del browser può variare. È importante testare la tua PWA in diversi browser e dispositivi per assicurarti che funzioni correttamente. Usa il rilevamento delle funzionalità per degradare gradualmente la funzionalità nei browser che non supportano determinate funzionalità.

Debug delle PWA

Il debug delle PWA può essere difficile a causa della natura asincrona dei service worker. Usa gli strumenti per sviluppatori del browser per ispezionare la registrazione del service worker, la memorizzazione nella cache e le richieste di rete. Presta molta attenzione ai log della console e ai messaggi di errore.

Esempi di PWA in tutto il mondo

Numerose aziende in tutto il mondo hanno implementato con successo le PWA. Ecco alcuni esempi diversi:

Conclusione: abbracciare il futuro del web

Le Progressive Web App offrono una valida alternativa ai siti web tradizionali e alle applicazioni mobile native. Forniscono un'esperienza utente superiore, prestazioni migliorate e un maggiore coinvolgimento, rendendole uno strumento prezioso per le aziende che desiderano raggiungere un pubblico globale. Comprendendo i concetti fondamentali e seguendo i passaggi di implementazione descritti in questa guida, gli sviluppatori possono creare PWA affidabili, installabili e coinvolgenti, fornendo un vantaggio competitivo nel mondo odierno orientato al mobile. Abbraccia il futuro del web e inizia a creare oggi stesso le tue Progressive Web App!