Progressive Web App Arkitektur: JavaScript Service Worker Mønstre | MLOG | MLOG

4. Network-Only

Network-only strategien henter altid aktiver fra netværket og går helt uden om cachen. Denne strategi bruges, når du absolut har brug for den seneste version af en ressource, og caching ikke er ønsket.

Eksempel:

            
self.addEventListener('fetch', event => {
  event.respondWith(
    fetch(event.request)
  );
});

            

5. Stale-While-Revalidate

Stale-while-revalidate strategien serverer det cachede aktiv med det samme, mens den samtidigt henter den seneste version fra netværket. Når netværksanmodningen er fuldført, opdateres cachen med den nye version. Denne strategi giver et hurtigt indledende svar, samtidig med at den sikrer, at brugeren til sidst modtager det mest opdaterede indhold. Dette er en nyttig strategi for ikke-kritisk indhold, der har mere gavn af hastighed end absolut friskhed.

Eksempel:

            
self.addEventListener('fetch', event => {
  event.respondWith(
    caches.match(event.request)
      .then(response => {
        const fetchPromise = fetch(event.request).then(networkResponse => {
          caches.open('my-cache').then(cache => {
            cache.put(event.request, networkResponse.clone());
            return networkResponse;
          });
        });
        return response || fetchPromise;
      })
  );
});

            

6. Cache, then Network

Ligner stale-while-revalidate, men uden den øjeblikkelige returnering af det cachede aktiv. Den tjekker cachen først, og kun hvis aktivet er til stede, vil netværksanmodningen fortsætte i baggrunden for at opdatere cachen.

Valg af den Rette Caching-strategi

Den optimale caching-strategi afhænger af de specifikke krav i din applikation. Overvej faktorer som:

Ved omhyggeligt at vælge de passende caching-strategier kan du markant forbedre ydeevnen og brugeroplevelsen af din PWA, selv i offline-miljøer. Værktøjer som Workbox ([https://developers.google.com/web/tools/workbox](https://developers.google.com/web/tools/workbox)) kan forenkle implementeringen af disse strategier.

Baggrundssynkronisering: Håndtering af Offline Ændringer

Baggrundssynkronisering giver din PWA mulighed for at udføre opgaver i baggrunden, selv når brugeren er offline. Dette er især nyttigt til håndtering af formularindsendelser, dataopdateringer og andre operationer, der kræver netværksforbindelse. `BackgroundSyncManager` API'en giver dig mulighed for at registrere opgaver, der vil blive udført, når netværket bliver tilgængeligt.

Registrering af en Baggrundssynkroniseringsopgave

For at registrere en baggrundssynkroniseringsopgave skal du bruge `register`-metoden i `BackgroundSyncManager`. Denne metode tager et unikt tag-navn som argument. Tag-navnet identificerer den specifikke opgave, der skal udføres.

Eksempel:

            
self.addEventListener('sync', event => {
  if (event.tag === 'my-sync-task') {
    event.waitUntil(doSomeWork());
  }
});

            

Håndtering af Sync-hændelsen

Når browseren registrerer netværksforbindelse, sender den en `sync`-hændelse til service worker'en. Du kan lytte efter denne hændelse og udføre de nødvendige handlinger, såsom at sende data til serveren.

Eksempel:

            
async function doSomeWork() {
  // Hent data fra IndexedDB
  const data = await getDataFromIndexedDB();

  // Send data til serveren
  try {
    const response = await fetch('/api/sync', {
      method: 'POST',
      body: JSON.stringify(data),
      headers: {
        'Content-Type': 'application/json'
      }
    });

    if (response.ok) {
      // Ryd data fra IndexedDB
      await clearDataFromIndexedDB();
    } else {
      // Håndter fejl
      console.error('Sync failed:', response.status);
      throw new Error('Sync failed');
    }
  } catch (error) {
    // Håndter netværksfejl
    console.error('Network error:', error);
    throw error;
  }
}

            

Eksempel: Offline Formularindsendelse

Forestil dig et scenarie, hvor en bruger udfylder en formular, mens vedkommende er offline. Service worker'en kan gemme formulardataene i IndexedDB og registrere en baggrundssynkroniseringsopgave. Når netværket bliver tilgængeligt, vil service worker'en hente formulardataene fra IndexedDB og indsende dem til serveren.

  1. Brugeren udfylder formularen og klikker på send, mens vedkommende er offline.
  2. Formulardataene gemmes i IndexedDB.
  3. En baggrundssynkroniseringsopgave registreres med et unikt tag (f.eks. `form-submission`).
  4. Når netværket er tilgængeligt, udløses `sync`-hændelsen.
  5. Service worker'en henter formulardataene fra IndexedDB og indsender dem til serveren.
  6. Hvis indsendelsen lykkes, fjernes formulardataene fra IndexedDB.

Push-notifikationer: Engagering af Brugere med Rettidige Opdateringer

Push-notifikationer gør det muligt for din PWA at sende rettidige opdateringer og beskeder til brugerne, selv når appen ikke kører aktivt i browseren. Dette kan markant forbedre brugerengagement og -fastholdelse. Push API'en og Notifications API'en arbejder sammen om at levere push-notifikationer.

Abonnering på Push-notifikationer

For at modtage push-notifikationer skal brugerne først give tilladelse til din PWA. Du kan bruge `PushManager` API'en til at abonnere brugere på push-notifikationer.

Eksempel:

            
navigator.serviceWorker.ready.then(registration => {
  registration.pushManager.subscribe({
    userVisibleOnly: true,
    applicationServerKey: 'YOUR_PUBLIC_VAPID_KEY'
  })
  .then(subscription => {
    // Send abonnementsoplysninger til din server
    sendSubscriptionToServer(subscription);
  })
  .catch(error => {
    console.error('Failed to subscribe:', error);
  });
});

            

Vigtigt: Erstat `YOUR_PUBLIC_VAPID_KEY` med din faktiske VAPID-nøgle (Voluntary Application Server Identification). VAPID-nøgler bruges til at identificere din applikationsserver og sikre, at push-notifikationer sendes sikkert.

Håndtering af Push-notifikationer

Når en push-notifikation modtages, sender service worker'en en `push`-hændelse. Du kan lytte efter denne hændelse og vise notifikationen til brugeren.

Eksempel:

            
self.addEventListener('push', event => {
  const payload = event.data ? event.data.text() : 'No payload';

  event.waitUntil(
    self.registration.showNotification('My PWA', {
      body: payload,
      icon: 'icon.png'
    })
  );
});

            

Tilpasning af Push-notifikationer

Notifications API'en giver dig mulighed for at tilpasse udseendet og adfærden af push-notifikationer. Du kan specificere titel, brødtekst, ikon, badge og andre indstillinger.

Eksempel:

            
self.addEventListener('push', event => {
  const data = event.data.json();
  const title = data.title || 'My PWA';
  const options = {
    body: data.body || 'No message',
    icon: data.icon || 'icon.png',
    badge: data.badge || 'badge.png',
    vibrate: [200, 100, 200],
    data: { // Brugerdefinerede data, du kan tilgå, når brugeren klikker på notifikationen
      url: data.url || '/'
    },
    actions: [
      {action: 'explore', title: 'Explore this new world',
        icon: 'images/checkmark.png'},
      {action: 'close', title: 'Close',
        icon: 'images/xmark.png'},
    ]
  };

  event.waitUntil(self.registration.showNotification(title, options));
});


self.addEventListener('notificationclick', function(event) {
  event.notification.close();

  // Tjek om brugeren klikkede på en handling.
  if (event.action === 'explore') {
    clients.openWindow(event.notification.data.url);
  } else {
    // Standardhandling: åbn appen.
    clients.openWindow('/');
  }
});

            

Eksempel: Nyheds-alarm

En nyhedsapplikation kan bruge push-notifikationer til at alarmere brugere om breaking news. Når en ny artikel udgives, sender serveren en push-notifikation til brugerens enhed, som viser et kort resumé af artiklen. Brugeren kan derefter klikke på notifikationen for at åbne den fulde artikel i PWA'en.

Avancerede Service Worker Mønstre

1. Offline Analyse

Spor brugeradfærd, selv når de er offline, ved at gemme analysedata lokalt og sende dem til serveren, når netværket er tilgængeligt. Dette kan opnås ved hjælp af IndexedDB og Background Sync.

2. Versionering og Opdatering

Implementer en robust versioneringsstrategi for din service worker for at sikre, at brugerne altid modtager de seneste opdateringer uden at forstyrre deres oplevelse. Brug cache-busting teknikker til at ugyldiggøre gamle cachede aktiver.

3. Modulære Service Workers

Organiser din service worker-kode i moduler for at forbedre vedligeholdelse og læsbarhed. Brug JavaScript-moduler (ESM) eller en modul-bundler som Webpack eller Rollup.

4. Dynamisk Caching

Cache aktiver dynamisk baseret på brugerinteraktioner og brugsmønstre. Dette kan hjælpe med at optimere cache-størrelsen og forbedre ydeevnen.

Bedste Praksis for Service Worker Udvikling

Konklusion

JavaScript service workers er kraftfulde værktøjer til at bygge robuste, effektive og engagerende PWA'er. Ved at forstå service worker-livscyklussen og implementere passende caching-strategier, baggrundssynkronisering og push-notifikationer, kan du skabe enestående brugeroplevelser, selv i offline-miljøer. Denne artikel har udforsket centrale service worker-mønstre og bedste praksis for at guide dig i at bygge succesfulde PWA'er til et globalt publikum. I takt med at nettet fortsætter med at udvikle sig, vil service workers spille en stadig vigtigere rolle i at forme fremtiden for webudvikling.

Husk at tilpasse disse mønstre til dine specifikke applikationskrav og altid prioritere brugeroplevelsen. Ved at omfavne kraften i service workers kan du skabe PWA'er, der ikke kun er funktionelle, men også en fornøjelse at bruge, uanset brugerens placering eller netværksforbindelse.

Yderligere Ressourcer: