Progressiivisen verkkosovelluksen arkkitehtuuri: JavaScript Service Worker -mallit | MLOG | MLOG

4. Vain verkko (Network-Only)

Vain verkko -strategia hakee resurssit aina verkosta, ohittaen välimuistin kokonaan. Tätä strategiaa käytetään, kun tarvitset ehdottomasti resurssin uusimman version eikä välimuistia haluta käyttää.

Esimerkki:

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

            

5. Vanhentunut, kunnes validoidaan uudelleen (Stale-While-Revalidate)

Stale-while-revalidate -strategia tarjoaa välimuistissa olevan resurssin välittömästi ja hakee samanaikaisesti uusimman version verkosta. Kun verkkopyyntö on valmis, välimuisti päivitetään uudella versiolla. Tämä strategia tarjoaa nopean alkuvastauksen varmistaen samalla, että käyttäjä saa lopulta ajantasaisimman sisällön. Tämä on hyödyllinen strategia ei-kriittiselle sisällölle, joka hyötyy nopeudesta enemmän kuin ehdottomasta tuoreudesta.

Esimerkki:

            
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. Välimuisti, sitten verkko (Cache, then Network)

Samankaltainen kuin stale-while-revalidate, mutta ilman välimuistissa olevan resurssin välitöntä palauttamista. Se tarkistaa ensin välimuistin, ja vain jos resurssi on olemassa, verkkopyyntö jatkuu taustalla välimuistin päivittämiseksi.

Oikean välimuististrategian valitseminen

Optimaalinen välimuististrategia riippuu sovelluksesi erityisvaatimuksista. Harkitse seuraavia tekijöitä:

Valitsemalla huolellisesti sopivat välimuististrategiat voit parantaa merkittävästi PWA:si suorituskykyä ja käyttäjäkokemusta jopa offline-ympäristöissä. Työkalut, kuten Workbox ([https://developers.google.com/web/tools/workbox](https://developers.google.com/web/tools/workbox)), voivat yksinkertaistaa näiden strategioiden toteuttamista.

Taustasynkronointi: Offline-muutosten käsittely

Taustasynkronoinnin avulla PWA voi suorittaa tehtäviä taustalla, vaikka käyttäjä olisi offline-tilassa. Tämä on erityisen hyödyllistä lomakkeiden lähetysten, tietojen päivitysten ja muiden verkkoyhteyttä vaativien toimintojen käsittelyssä. `BackgroundSyncManager`-API mahdollistaa sellaisten tehtävien rekisteröinnin, jotka suoritetaan, kun verkkoyhteys tulee saataville.

Taustasynkronointitehtävän rekisteröinti

Rekisteröidäksesi taustasynkronointitehtävän sinun on käytettävä `BackgroundSyncManager`-olion `register`-metodia. Tämä metodi ottaa argumenttina yksilöllisen tunnisteen (tag name). Tunniste yksilöi suoritettavan tehtävän.

Esimerkki:

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

            

Synkronointitapahtuman (sync event) käsittely

Kun selain havaitsee verkkoyhteyden, se lähettää `sync`-tapahtuman service workerille. Voit kuunnella tätä tapahtumaa ja suorittaa tarvittavat toimet, kuten tietojen lähettämisen palvelimelle.

Esimerkki:

            
async function doSomeWork() {
  // Hae tiedot IndexedDB:stä
  const data = await getDataFromIndexedDB();

  // Lähetä tiedot palvelimelle
  try {
    const response = await fetch('/api/sync', {
      method: 'POST',
      body: JSON.stringify(data),
      headers: {
        'Content-Type': 'application/json'
      }
    });

    if (response.ok) {
      // Tyhjennä tiedot IndexedDB:stä
      await clearDataFromIndexedDB();
    } else {
      // Käsittele virheet
      console.error('Sync failed:', response.status);
      throw new Error('Sync failed');
    }
  } catch (error) {
    // Käsittele verkkovirheet
    console.error('Network error:', error);
    throw error;
  }
}

            

Esimerkki: Lomakkeen lähettäminen offline-tilassa

Kuvittele tilanne, jossa käyttäjä täyttää lomakkeen ollessaan offline-tilassa. Service worker voi tallentaa lomaketiedot IndexedDB:hen ja rekisteröidä taustasynkronointitehtävän. Kun verkkoyhteys on saatavilla, service worker hakee lomaketiedot IndexedDB:stä ja lähettää ne palvelimelle.

  1. Käyttäjä täyttää lomakkeen ja napsauttaa lähetä-painiketta offline-tilassa.
  2. Lomaketiedot tallennetaan IndexedDB:hen.
  3. Taustasynkronointitehtävä rekisteröidään yksilöllisellä tunnisteella (esim. `form-submission`).
  4. Kun verkkoyhteys on saatavilla, `sync`-tapahtuma laukaistaan.
  5. Service worker hakee lomaketiedot IndexedDB:stä ja lähettää ne palvelimelle.
  6. Jos lähetys onnistuu, lomaketiedot poistetaan IndexedDB:stä.

Push-ilmoitukset: Käyttäjien sitouttaminen ajankohtaisilla päivityksillä

Push-ilmoitusten avulla PWA voi lähettää ajankohtaisia päivityksiä ja viestejä käyttäjille, vaikka sovellus ei olisi aktiivisesti käynnissä selaimessa. Tämä voi merkittävästi parantaa käyttäjien sitoutumista ja pysyvyyttä. Push API ja Notifications API toimivat yhdessä push-ilmoitusten toimittamiseksi.

Push-ilmoitusten tilaaminen

Saadakseen push-ilmoituksia käyttäjien on ensin annettava lupa PWA:llesi. Voit käyttää `PushManager`-APIa käyttäjien tilaamiseksi push-ilmoituksiin.

Esimerkki:

            
navigator.serviceWorker.ready.then(registration => {
  registration.pushManager.subscribe({
    userVisibleOnly: true,
    applicationServerKey: 'YOUR_PUBLIC_VAPID_KEY'
  })
  .then(subscription => {
    // Lähetä tilaustiedot palvelimellesi
    sendSubscriptionToServer(subscription);
  })
  .catch(error => {
    console.error('Failed to subscribe:', error);
  });
});

            

Tärkeää: Korvaa `YOUR_PUBLIC_VAPID_KEY` todellisella VAPID-avaimellasi (Voluntary Application Server Identification). VAPID-avaimia käytetään sovelluspalvelimesi tunnistamiseen ja sen varmistamiseen, että push-ilmoitukset lähetetään turvallisesti.

Push-ilmoitusten käsittely

Kun push-ilmoitus vastaanotetaan, service worker lähettää `push`-tapahtuman. Voit kuunnella tätä tapahtumaa ja näyttää ilmoituksen käyttäjälle.

Esimerkki:

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

            

Push-ilmoitusten mukauttaminen

Notifications API antaa sinun mukauttaa push-ilmoitusten ulkoasua ja toimintaa. Voit määrittää otsikon, leipätekstin, kuvakkeen, merkin ja muita asetuksia.

Esimerkki:

            
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: { // Mukautettua dataa, johon pääset käsiksi, kun käyttäjä napsauttaa ilmoitusta
      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();

  // Tarkista, napsauttiko käyttäjä toimintoa.
  if (event.action === 'explore') {
    clients.openWindow(event.notification.data.url);
  } else {
    // Oletustoiminto: avaa sovellus.
    clients.openWindow('/');
  }
});

            

Esimerkki: Uutishälytys

Uutissovellus voi käyttää push-ilmoituksia hälyttääkseen käyttäjiä tuoreista uutisista. Kun uusi artikkeli julkaistaan, palvelin lähettää push-ilmoituksen käyttäjän laitteelle, jossa näytetään lyhyt yhteenveto artikkelista. Käyttäjä voi sitten napsauttaa ilmoitusta avatakseen koko artikkelin PWA:ssa.

Edistyneet Service Worker -mallit

1. Offline-analytiikka

Seuraa käyttäjien käyttäytymistä myös offline-tilassa tallentamalla analytiikkadataa paikallisesti ja lähettämällä se palvelimelle, kun verkkoyhteys on saatavilla. Tämä voidaan saavuttaa käyttämällä IndexedDB:tä ja taustasynkronointia.

2. Versiointi ja päivittäminen

Toteuta vankka versiointistrategia service workerillesi varmistaaksesi, että käyttäjät saavat aina uusimmat päivitykset häiritsemättä heidän kokemustaan. Käytä välimuistin mitätöintitekniikoita (cache busting) vanhentuneiden välimuistissa olevien resurssien poistamiseksi.

3. Modulaariset Service Workerit

Järjestä service worker -koodisi moduuleihin parantaaksesi ylläpidettävyyttä ja luettavuutta. Käytä JavaScript-moduuleja (ESM) tai moduulien niputtajaa, kuten Webpackia tai Rollupia.

4. Dynaaminen välimuisti

Tallenna resursseja dynaamisesti välimuistiin käyttäjän vuorovaikutusten ja käyttötapojen perusteella. Tämä voi auttaa optimoimaan välimuistin kokoa ja parantamaan suorituskykyä.

Service Worker -kehityksen parhaat käytännöt

Yhteenveto

JavaScript service workerit ovat tehokkaita työkaluja vankkojen, suorituskykyisten ja sitouttavien PWA-sovellusten rakentamiseen. Ymmärtämällä service workerin elinkaaren ja toteuttamalla sopivia välimuististrategioita, taustasynkronointia ja push-ilmoituksia voit luoda poikkeuksellisia käyttäjäkokemuksia jopa offline-ympäristöissä. Tämä artikkeli on tutkinut keskeisiä service worker -malleja ja parhaita käytäntöjä opastaakseen sinua menestyksekkäiden PWA-sovellusten rakentamisessa globaalille yleisölle. Verkon jatkaessa kehittymistään service workerit tulevat olemaan yhä tärkeämmässä roolissa verkkokehityksen tulevaisuuden muovaamisessa.

Muista mukauttaa nämä mallit omiin sovellusvaatimuksiisi ja asettaa aina käyttäjäkokemus etusijalle. Hyödyntämällä service workerien voimaa voit luoda PWA-sovelluksia, jotka eivät ole vain toimivia, vaan myös ilahduttavia käyttää riippumatta käyttäjän sijainnista tai verkkoyhteydestä.

Lisäresursseja: