Progressiivsete veebirakenduste arhitektuur: JavaScripti Service Worker'i mustrid | MLOG | MLOG

4. Ainult võrk (Network-Only)

Ainult võrk strateegia laadib varad alati võrgust, möödudes täielikult vahemälust. Seda strateegiat kasutatakse siis, kui on absoluutselt vajalik ressursi uusim versioon ja vahemällu salvestamine pole soovitatav.

Näide:

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

            

5. Aegunud vahemälu uuendamise ajal (Stale-While-Revalidate)

Stale-while-revalidate strateegia serveerib vahemälus oleva vara koheselt, samal ajal kui võrgust laaditakse alla uusim versioon. Kui võrgupäring on lõpule viidud, uuendatakse vahemälu uue versiooniga. See strateegia tagab kiire esialgse vastuse, kindlustades samal ajal, et kasutaja saab lõpuks kõige ajakohasema sisu. See on kasulik strateegia mittekriitilise sisu jaoks, mis eelistab kiirust absoluutsele värskusele.

Näide:

            
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. Vahemälu, seejärel võrk (Cache, then Network)

Sarnane stale-while-revalidate strateegiale, kuid ilma vahemälus oleva vara kohese tagastamiseta. See kontrollib esmalt vahemälu ja ainult siis, kui vara on olemas, jätkatakse taustal võrgupäringuga vahemälu uuendamiseks.

Õige vahemälustrateegia valimine

Optimaalne vahemälustrateegia sõltub teie rakenduse konkreetsetest nõuetest. Kaaluge selliseid tegureid nagu:

Valides hoolikalt sobivad vahemälustrateegiad, saate oluliselt parandada oma PWA jõudlust ja kasutajakogemust, isegi võrguühenduseta keskkondades. Tööriistad nagu Workbox ([https://developers.google.com/web/tools/workbox](https://developers.google.com/web/tools/workbox)) võivad nende strateegiate rakendamist lihtsustada.

Taustasünkroonimine: võrguühenduseta mutatsioonide käsitlemine

Taustasünkroonimine võimaldab teie PWA-l teha ülesandeid taustal, isegi kui kasutaja on võrguühenduseta. See on eriti kasulik vormide esitamise, andmete uuendamise ja muude toimingute käsitlemiseks, mis nõuavad võrguühendust. `BackgroundSyncManager` API võimaldab teil registreerida ülesandeid, mis käivitatakse siis, kui võrguühendus muutub kättesaadavaks.

TaustasĂĽnkroonimise ĂĽlesande registreerimine

Taustasünkroonimise ülesande registreerimiseks peate kasutama `BackgroundSyncManager`'i `register` meetodit. See meetod võtab argumendina unikaalse sildinime. Sildinimi identifitseerib konkreetse teostatava ülesande.

Näide:

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

            

Sünkroonimissündmuse käsitlemine

Kui brauser tuvastab võrguühenduse, saadab see Service Worker'ile `sync` sündmuse. Saate seda sündmust kuulata ja teha vajalikud toimingud, näiteks saata andmeid serverisse.

Näide:

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

            

Näide: võrguühenduseta vormi esitamine

Kujutage ette stsenaariumi, kus kasutaja täidab vormi võrguühenduseta olles. Service Worker saab vormiandmed salvestada IndexedDB-sse ja registreerida taustasünkroonimise ülesande. Kui võrguühendus muutub kättesaadavaks, hangib Service Worker vormiandmed IndexedDB-st ja esitab need serverile.

  1. Kasutaja täidab vormi ja klõpsab võrguühenduseta olles nuppu Esita.
  2. Vormiandmed salvestatakse IndexedDB-sse.
  3. TaustasĂĽnkroonimise ĂĽlesanne registreeritakse unikaalse sildiga (nt `form-submission`).
  4. Kui võrguühendus on kättesaadav, käivitatakse `sync` sündmus.
  5. Service Worker hangib vormiandmed IndexedDB-st ja esitab need serverile.
  6. Kui esitamine õnnestub, eemaldatakse vormiandmed IndexedDB-st.

Tõuketeated: kasutajate kaasamine õigeaegsete uuendustega

Tõuketeated võimaldavad teie PWA-l saata kasutajatele õigeaegseid uuendusi ja sõnumeid, isegi kui rakendus ei tööta brauseris aktiivselt. See võib oluliselt parandada kasutajate kaasatust ja hoidmist. Push API ja Notifications API töötavad koos tõuketeadete edastamiseks.

Tõuketeadete tellimine

Tõuketeadete saamiseks peavad kasutajad esmalt andma teie PWA-le loa. Kasutajate tõuketeadete tellimiseks saate kasutada `PushManager` API-t.

Näide:

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

            

Oluline: Asendage `YOUR_PUBLIC_VAPID_KEY` oma tegeliku VAPID (Voluntary Application Server Identification) võtmega. VAPID-võtmeid kasutatakse teie rakendusserveri tuvastamiseks ja tõuketeadete turvalise saatmise tagamiseks.

Tõuketeadete käsitlemine

Kui tõuketeade vastu võetakse, saadab Service Worker `push` sündmuse. Saate seda sündmust kuulata ja kuvada teate kasutajale.

Näide:

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

            

Tõuketeadete kohandamine

Notifications API võimaldab teil kohandada tõuketeadete välimust ja käitumist. Saate määrata pealkirja, sisu, ikooni, märgi ja muid valikuid.

Näide:

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

            

Näide: uudisteade

Uudisterakendus saab kasutada tõuketeateid, et teavitada kasutajaid värsketest uudistest. Kui uus artikkel avaldatakse, saadab server kasutaja seadmesse tõuketeate, mis kuvab artikli lühikokkuvõtte. Kasutaja saab seejärel teatel klõpsata, et avada kogu artikkel PWA-s.

Täiustatud Service Worker'i mustrid

1. Võrguühenduseta analüütika

Jälgige kasutajate käitumist isegi siis, kui nad on võrguühenduseta, salvestades analüütikaandmed lokaalselt ja saates need serverisse, kui võrguühendus on kättesaadav. Seda saab saavutada IndexedDB ja taustasünkroonimise abil.

2. Versioonihaldus ja uuendamine

Rakendage oma Service Worker'i jaoks tugev versioonihaldusstrateegia, et tagada kasutajatele alati uusimate uuenduste saamine ilma nende kogemust häirimata. Kasutage vahemälu tühjendamise tehnikaid vanade vahemällu salvestatud varade kehtetuks muutmiseks.

3. Modulaarsed Service Worker'id

Organiseerige oma Service Worker'i kood mooduliteks, et parandada hooldatavust ja loetavust. Kasutage JavaScripti mooduleid (ESM) või moodulite komplekteerijat nagu Webpack või Rollup.

4. Dünaamiline vahemällu salvestamine

Salvestage varad dünaamiliselt vahemällu vastavalt kasutaja interaktsioonidele ja kasutusmustritele. See võib aidata optimeerida vahemälu suurust ja parandada jõudlust.

Service Worker'i arenduse parimad praktikad

Kokkuvõte

JavaScripti Service Worker'id on võimsad tööriistad vastupidavate, jõudluspõhiste ja kaasahaaravate PWA-de ehitamiseks. Mõistes Service Worker'i elutsüklit ja rakendades sobivaid vahemälustrateegiaid, taustasünkroonimist ja tõuketeateid, saate luua erakordseid kasutajakogemusi, isegi võrguühenduseta keskkondades. See artikkel on uurinud peamisi Service Worker'i mustreid ja parimaid praktikaid, et juhendada teid edukate PWA-de ehitamisel globaalsele publikule. Veebi arenedes mängivad Service Worker'id veebiarenduse tuleviku kujundamisel üha olulisemat rolli.

Pidage meeles, et peate neid mustreid kohandama oma rakenduse spetsiifilistele nõuetele ja seadma alati esikohale kasutajakogemuse. Service Worker'ite võimsust omaks võttes saate luua PWA-sid, mis pole mitte ainult funktsionaalsed, vaid ka meeldivad kasutada, sõltumata kasutaja asukohast või võrguühendusest.

Lisamaterjalid: