Arhitektura progresivnih spletnih aplikacij: Vzorci JavaScript Service Workerjev | MLOG | MLOG

4. Samo omrežje (Network-Only)

Strategija "samo omrežje" vedno pridobi vire iz omrežja in v celoti zaobide predpomnilnik. Ta strategija se uporablja, ko nujno potrebujete najnovejšo različico vira in predpomnjenje ni zaželeno.

Primer:

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

            

5. Zastarelo med ponovnim preverjanjem (Stale-While-Revalidate)

Strategija "zastarelo med ponovnim preverjanjem" postreže s predpomnjenim virom takoj, hkrati pa pridobi najnovejšo različico iz omrežja. Ko se omrežna zahteva konča, se predpomnilnik posodobi z novo različico. Ta strategija zagotavlja hiter začetni odziv, hkrati pa zagotavlja, da uporabnik sčasoma prejme najnovejšo vsebino. To je uporabna strategija za nekritične vsebine, kjer je hitrost pomembnejša od absolutne svežine.

Primer:

            
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. Predpomnilnik, nato omrežje (Cache, then Network)

Podobno kot stale-while-revalidate, vendar brez takojšnje vrnitve predpomnjenega vira. Najprej preveri predpomnilnik in le, če je vir prisoten, se omrežna zahteva nadaljuje v ozadju za posodobitev predpomnilnika.

Izbira prave strategije predpomnjenja

Optimalna strategija predpomnjenja je odvisna od specifičnih zahtev vaše aplikacije. Upoštevajte dejavnike, kot so:

S skrbno izbiro ustreznih strategij predpomnjenja lahko znatno izboljšate zmogljivost in uporabniško izkušnjo vaše PWA, tudi v okoljih brez povezave. Orodja, kot je Workbox ([https://developers.google.com/web/tools/workbox](https://developers.google.com/web/tools/workbox)), lahko poenostavijo implementacijo teh strategij.

Sinhronizacija v ozadju: Obravnavanje sprememb brez povezave

Sinhronizacija v ozadju omogoča vaši PWA, da izvaja naloge v ozadju, tudi ko je uporabnik brez povezave. To je še posebej uporabno za obravnavanje oddaj obrazcev, posodobitev podatkov in drugih operacij, ki zahtevajo omrežno povezljivost. API `BackgroundSyncManager` vam omogoča registracijo nalog, ki se bodo izvedle, ko bo omrežje postalo dostopno.

Registracija naloge za sinhronizacijo v ozadju

Za registracijo naloge za sinhronizacijo v ozadju morate uporabiti metodo `register` v `BackgroundSyncManager`. Ta metoda kot argument sprejme edinstveno ime oznake (tag). Ime oznake identificira specifično nalogo, ki jo je treba izvesti.

Primer:

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

            

Obravnavanje dogodka 'sync'

Ko brskalnik zazna omrežno povezljivost, sproži dogodek `sync` v Service Workerju. Lahko poslušate ta dogodek in izvedete potrebna dejanja, kot je pošiljanje podatkov na strežnik.

Primer:

            
async function doSomeWork() {
  // Retrieve data from IndexedDB
  const data = await getDataFromIndexedDB();

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

    if (response.ok) {
      // Clear the data from IndexedDB
      await clearDataFromIndexedDB();
    } else {
      // Handle errors
      console.error('Sync failed:', response.status);
      throw new Error('Sync failed');
    }
  } catch (error) {
    // Handle network errors
    console.error('Network error:', error);
    throw error;
  }
}

            

Primer: Oddaja obrazca brez povezave

Predstavljajte si scenarij, kjer uporabnik izpolni obrazec, medtem ko je brez povezave. Service Worker lahko shrani podatke obrazca v IndexedDB in registrira nalogo za sinhronizacijo v ozadju. Ko omrežje postane dostopno, bo Service Worker pridobil podatke obrazca iz IndexedDB in jih poslal na strežnik.

  1. Uporabnik izpolni obrazec in klikne oddaj, medtem ko je brez povezave.
  2. Podatki obrazca se shranijo v IndexedDB.
  3. Naloga za sinhronizacijo v ozadju se registrira z edinstveno oznako (npr. `form-submission`).
  4. Ko je omrežje na voljo, se sproži dogodek `sync`.
  5. Service Worker pridobi podatke obrazca iz IndexedDB in jih pošlje na strežnik.
  6. Če je oddaja uspešna, se podatki obrazca odstranijo iz IndexedDB.

Potisna obvestila: Angažiranje uporabnikov s pravočasnimi posodobitvami

Potisna obvestila omogočajo vaši PWA pošiljanje pravočasnih posodobitev in sporočil uporabnikom, tudi ko aplikacija ni aktivno zagnana v brskalniku. To lahko znatno izboljša angažiranost in ohranjanje uporabnikov. API-ja Push in Notifications delujeta skupaj za dostavo potisnih obvestil.

Naročanje na potisna obvestila

Za prejemanje potisnih obvestil morajo uporabniki najprej dati dovoljenje vaši PWA. Za naročanje uporabnikov na potisna obvestila lahko uporabite API `PushManager`.

Primer:

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

            

Pomembno: Zamenjajte `YOUR_PUBLIC_VAPID_KEY` s svojim dejanskim ključem VAPID (Voluntary Application Server Identification). Ključi VAPID se uporabljajo za identifikacijo vašega aplikacijskega strežnika in zagotavljanje varnega pošiljanja potisnih obvestil.

Obravnavanje potisnih obvestil

Ko je prejeto potisno obvestilo, Service Worker sproži dogodek `push`. Lahko poslušate ta dogodek in prikažete obvestilo uporabniku.

Primer:

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

            

Prilagajanje potisnih obvestil

API Notifications vam omogoča prilagajanje videza in obnašanja potisnih obvestil. Določite lahko naslov, telo, ikono, značko in druge možnosti.

Primer:

            
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: { // Custom data that you can access when the user clicks the notification
      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();

  // Check if the user clicked on an action.
  if (event.action === 'explore') {
    clients.openWindow(event.notification.data.url);
  } else {
    // Default action: open the app.
    clients.openWindow('/');
  }
});

            

Primer: Opozorilo o novicah

Novičarska aplikacija lahko uporablja potisna obvestila za obveščanje uporabnikov o najnovejših novicah. Ko je objavljen nov članek, strežnik pošlje potisno obvestilo na uporabnikovo napravo, ki prikaže kratek povzetek članka. Uporabnik lahko nato klikne na obvestilo in odpre celoten članek v PWA.

Napredni vzorci Service Workerjev

1. Analitika brez povezave

Spremljajte obnašanje uporabnikov tudi, ko so brez povezave, tako da analitične podatke shranjujete lokalno in jih pošljete na strežnik, ko je omrežje na voljo. To je mogoče doseči z uporabo IndexedDB in Background Sync.

2. Upravljanje različic in posodabljanje

Implementirajte robustno strategijo za upravljanje različic vašega Service Workerja, da zagotovite, da uporabniki vedno prejmejo najnovejše posodobitve, ne da bi motili njihovo izkušnjo. Uporabite tehnike razveljavljanja predpomnilnika (cache busting) za razveljavitev starih predpomnjenih virov.

3. Modularni Service Workerji

Organizirajte kodo svojega Service Workerja v module za izboljšanje vzdrževanja in berljivosti. Uporabite module JavaScript (ESM) ali orodje za združevanje modulov, kot sta Webpack ali Rollup.

4. Dinamično predpomnjenje

Dinamično predpomnite vire na podlagi interakcij uporabnikov in vzorcev uporabe. To lahko pomaga optimizirati velikost predpomnilnika in izboljšati zmogljivost.

Najboljše prakse za razvoj Service Workerjev

Zaključek

JavaScript Service Workerji so močna orodja za gradnjo robustnih, zmogljivih in privlačnih PWA. Z razumevanjem življenjskega cikla Service Workerja in implementacijo ustreznih strategij predpomnjenja, sinhronizacije v ozadju in potisnih obvestil lahko ustvarite izjemne uporabniške izkušnje, tudi v okoljih brez povezave. Ta članek je raziskal ključne vzorce Service Workerjev in najboljše prakse, ki vas bodo vodile pri gradnji uspešnih PWA za globalno občinstvo. Ker se splet nenehno razvija, bodo Service Workerji igrali vse pomembnejšo vlogo pri oblikovanju prihodnosti spletnega razvoja.

Ne pozabite prilagoditi teh vzorcev svojim specifičnim zahtevam aplikacije in vedno dajte prednost uporabniški izkušnji. Z izkoriščanjem moči Service Workerjev lahko ustvarite PWA, ki niso le funkcionalne, ampak tudi prijetne za uporabo, ne glede na lokacijo ali omrežno povezavo uporabnika.

Dodatni viri: