Arkitektur for progressive nettapper: Mønstre for JavaScript Service Worker | MLOG | MLOG

4. Network-Only (Kun nettverk)

Network-only-strategien henter alltid ressurser fra nettverket og omgår cachen fullstendig. Denne strategien brukes når du absolutt trenger den nyeste versjonen av en ressurs og caching ikke er ønskelig.

Eksempel:

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

            

5. Stale-While-Revalidate

Stale-while-revalidate-strategien serverer den bufrede ressursen umiddelbart, samtidig som den henter den nyeste versjonen fra nettverket. Når nettverksforespørselen er fullført, oppdateres cachen med den nye versjonen. Denne strategien gir en rask innledende respons samtidig som den sikrer at brukeren til slutt mottar det mest oppdaterte innholdet. Dette er en nyttig strategi for ikke-kritisk innhold som drar nytte av hastighet fremfor absolutt ferskhet.

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 (Cache, deretter nettverk)

Ligner på stale-while-revalidate, men uten den umiddelbare returen av den bufrede ressursen. Den sjekker cachen først, og bare hvis ressursen er til stede, vil nettverksforespørselen fortsette i bakgrunnen for å oppdatere cachen.

Velge riktig cachingstrategi

Den optimale cachingstrategien avhenger av de spesifikke kravene til din applikasjon. Vurder faktorer som:

Ved å velge de riktige cachingstrategiene nøye, kan du betydelig forbedre ytelsen og brukeropplevelsen til din PWA, selv i offline-miljøer. Verktøy som Workbox ([https://developers.google.com/web/tools/workbox](https://developers.google.com/web/tools/workbox)) kan forenkle implementeringen av disse strategiene.

Bakgrunnssynkronisering: Håndtering av offline-endringer

Bakgrunnssynkronisering lar din PWA utføre oppgaver i bakgrunnen, selv når brukeren er offline. Dette er spesielt nyttig for å håndtere skjemainnsendinger, dataoppdateringer og andre operasjoner som krever nettverkstilkobling. `BackgroundSyncManager` API-et lar deg registrere oppgaver som vil bli utført når nettverket blir tilgjengelig.

Registrere en bakgrunnssynkroniseringsoppgave

For å registrere en bakgrunnssynkroniseringsoppgave, må du bruke `register`-metoden til `BackgroundSyncManager`. Denne metoden tar et unikt tag-navn som argument. Tag-navnet identifiserer den spesifikke oppgaven som skal utføres.

Eksempel:

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

            

Håndtere Sync-hendelsen

Når nettleseren oppdager nettverkstilkobling, sender den en `sync`-hendelse til service workeren. Du kan lytte etter denne hendelsen og utføre de nødvendige handlingene, som å 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) {
      // Fjern dataene fra IndexedDB
      await clearDataFromIndexedDB();
    } else {
      // Håndter feil
      console.error('Sync failed:', response.status);
      throw new Error('Sync failed');
    }
  } catch (error) {
    // Håndter nettverksfeil
    console.error('Network error:', error);
    throw error;
  }
}

            

Eksempel: Offline skjemainnsending

Se for deg et scenario der en bruker fyller ut et skjema mens han er offline. Service workeren kan lagre skjemadataene i IndexedDB og registrere en bakgrunnssynkroniseringsoppgave. Når nettverket blir tilgjengelig, vil service workeren hente skjemadataene fra IndexedDB og sende dem til serveren.

  1. Brukeren fyller ut skjemaet og klikker send mens han er offline.
  2. Skjemadataene lagres i IndexedDB.
  3. En bakgrunnssynkroniseringsoppgave registreres med en unik tag (f.eks. `form-submission`).
  4. Når nettverket er tilgjengelig, utløses `sync`-hendelsen.
  5. Service workeren henter skjemadataene fra IndexedDB og sender dem til serveren.
  6. Hvis innsendingen er vellykket, fjernes skjemadataene fra IndexedDB.

Push-varsler: Engasjere brukere med tidsriktige oppdateringer

Push-varsler gjør at din PWA kan sende tidsriktige oppdateringer og meldinger til brukere, selv når appen ikke kjører aktivt i nettleseren. Dette kan forbedre brukerengasjementet og -retensjonen betydelig. Push API og Notifications API jobber sammen for å levere push-varsler.

Abonnere på push-varsler

For å motta push-varsler, må brukere først gi tillatelse til din PWA. Du kan bruke `PushManager` API-et for å abonnere brukere på push-varsler.

Eksempel:

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

            

Viktig: Erstatt `YOUR_PUBLIC_VAPID_KEY` med din faktiske VAPID (Voluntary Application Server Identification) nøkkel. VAPID-nøkler brukes til å identifisere applikasjonsserveren din og sikre at push-varsler sendes sikkert.

Håndtere push-varsler

Når en push-varsel mottas, sender service workeren en `push`-hendelse. Du kan lytte etter denne hendelsen og vise varselet til brukeren.

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

            

Tilpasse push-varsler

Notifications API lar deg tilpasse utseendet og oppførselen til push-varsler. Du kan spesifisere tittel, brødtekst, ikon, merke og andre alternativer.

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: { // Egendefinerte data du kan få tilgang til når brukeren klikker på varselet
      url: data.url || '/'
    },
    actions: [
      {action: 'explore', title: 'Utforsk denne nye verdenen',
        icon: 'images/checkmark.png'},
      {action: 'close', title: 'Lukk',
        icon: 'images/xmark.png'},
    ]
  };

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


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

  // Sjekk om brukeren klikket på en handling.
  if (event.action === 'explore') {
    clients.openWindow(event.notification.data.url);
  } else {
    // Standardhandling: åpne appen.
    clients.openWindow('/');
  }
});

            

Eksempel: Nyhetsvarsel

En nyhetsapplikasjon kan bruke push-varsler for å varsle brukere om siste nytt. Når en ny artikkel publiseres, sender serveren en push-varsel til brukerens enhet, som viser et kort sammendrag av artikkelen. Brukeren kan deretter klikke på varselet for å åpne hele artikkelen i PWA-en.

Avanserte Service Worker-mønstre

1. Offline-analyse

Spor brukeratferd selv når de er offline ved å lagre analysedata lokalt og sende dem til serveren når nettverket er tilgjengelig. Dette kan oppnås ved hjelp av IndexedDB og Background Sync.

2. Versjonering og oppdatering

Implementer en robust versjoneringsstrategi for din service worker for å sikre at brukere alltid mottar de siste oppdateringene uten å forstyrre opplevelsen deres. Bruk cache-busting-teknikker for å ugyldiggjøre gamle bufrede ressurser.

3. Modulære Service Workers

Organiser service worker-koden din i moduler for å forbedre vedlikeholdbarhet og lesbarhet. Bruk JavaScript-moduler (ESM) eller en modul-bundler som Webpack eller Rollup.

4. Dynamisk caching

Cache ressurser dynamisk basert på brukerinteraksjoner og bruksmønstre. Dette kan bidra til å optimalisere cache-størrelsen og forbedre ytelsen.

Beste praksis for Service Worker-utvikling

Konklusjon

JavaScript service workers er kraftige verktøy for å bygge robuste, effektive og engasjerende PWA-er. Ved å forstå service worker-livssyklusen og implementere passende cachingstrategier, bakgrunnssynkronisering og push-varsler, kan du skape eksepsjonelle brukeropplevelser, selv i offline-miljøer. Denne artikkelen har utforsket sentrale service worker-mønstre og beste praksis for å veilede deg i å bygge vellykkede PWA-er for et globalt publikum. Ettersom nettet fortsetter å utvikle seg, vil service workers spille en stadig viktigere rolle i å forme fremtiden for webutvikling.

Husk å tilpasse disse mønstrene til dine spesifikke applikasjonskrav og alltid prioritere brukeropplevelsen. Ved å omfavne kraften til service workers, kan du skape PWA-er som ikke bare er funksjonelle, men også en fryd å bruke, uavhengig av brukerens plassering eller nettverkstilkobling.

Flere ressurser: