Architektura progresivních webových aplikací: Vzory pro JavaScript Service Worker | MLOG | MLOG

4. Network-Only

Strategie network-only vždy načítá zdroje ze sítě a zcela obchází cache. Tato strategie se používá, když absolutně potřebujete nejnovější verzi zdroje a cachování není žádoucí.

Příklad:

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

            

5. Stale-While-Revalidate

Strategie stale-while-revalidate okamžitě poskytne cachovaný zdroj a zároveň na pozadí načítá nejnovější verzi ze sítě. Jakmile je síťový požadavek dokončen, cache je aktualizována novou verzí. Tato strategie poskytuje rychlou počáteční odpověď a zároveň zajišťuje, že uživatel nakonec obdrží nejaktuálnější obsah. Je to užitečná strategie pro nekritický obsah, kde je rychlost důležitější než absolutní aktuálnost.

Příklad:

            
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

Podobné jako stale-while-revalidate, ale bez okamžitého vrácení cachovaného zdroje. Nejprve zkontroluje cache, a pouze pokud je zdroj přítomen, síťový požadavek pokračuje na pozadí, aby aktualizoval cache.

Výběr správné strategie cachování

Optimální strategie cachování závisí na konkrétních požadavcích vaší aplikace. Zvažte faktory jako:

Pečlivým výběrem vhodných strategií cachování můžete výrazně zlepšit výkon a uživatelský zážitek vaší PWA, a to i v offline prostředích. Nástroje jako Workbox ([https://developers.google.com/web/tools/workbox](https://developers.google.com/web/tools/workbox)) mohou implementaci těchto strategií zjednodušit.

Synchronizace na pozadí: Zpracování offline změn

Synchronizace na pozadí umožňuje vaší PWA provádět úkoly na pozadí, i když je uživatel offline. To je zvláště užitečné pro zpracování odeslání formulářů, aktualizací dat a dalších operací, které vyžadují síťové připojení. API `BackgroundSyncManager` vám umožňuje registrovat úkoly, které budou provedeny, jakmile bude síť k dispozici.

Registrace úlohy synchronizace na pozadí

Pro registraci úlohy synchronizace na pozadí musíte použít metodu `register` objektu `BackgroundSyncManager`. Tato metoda přijímá jako argument unikátní název (tag). Tento název identifikuje konkrétní úkol, který má být proveden.

Příklad:

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

            

Zpracování události synchronizace

Když prohlížeč detekuje síťové připojení, vyšle událost `sync` do service workeru. Můžete na tuto událost naslouchat a provést potřebné akce, jako je odeslání dat na server.

Příklad:

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

            

Příklad: Offline odeslání formuláře

Představte si scénář, kdy uživatel vyplní formulář, zatímco je offline. Service worker může uložit data formuláře do IndexedDB a zaregistrovat úlohu synchronizace na pozadí. Jakmile bude síť k dispozici, service worker načte data formuláře z IndexedDB a odešle je na server.

  1. Uživatel vyplní formulář a klikne na odeslat, zatímco je offline.
  2. Data formuláře jsou uložena v IndexedDB.
  3. Je zaregistrována úloha synchronizace na pozadí s unikátním tagem (např. `form-submission`).
  4. Když je síť k dispozici, je spuštěna událost `sync`.
  5. Service worker načte data formuláře z IndexedDB a odešle je na server.
  6. Pokud je odeslání úspěšné, data formuláře jsou z IndexedDB odstraněna.

Push notifikace: Zaujetí uživatelů pomocí včasných aktualizací

Push notifikace umožňují vaší PWA posílat uživatelům včasné aktualizace a zprávy, i když aplikace není aktivně spuštěna v prohlížeči. To může výrazně zlepšit zapojení a udržení uživatelů. Pro doručování push notifikací spolupracují Push API a Notifications API.

Přihlášení k odběru push notifikací

Aby mohli uživatelé dostávat push notifikace, musí nejprve vaší PWA udělit povolení. K přihlášení uživatelů k odběru push notifikací můžete použít `PushManager` API.

Příklad:

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

            

Důležité: Nahraďte `YOUR_PUBLIC_VAPID_KEY` vaším skutečným VAPID (Voluntary Application Server Identification) klíčem. VAPID klíče se používají k identifikaci vašeho aplikačního serveru a zajišťují bezpečné odesílání push notifikací.

Zpracování push notifikací

Když je přijata push notifikace, service worker vyšle událost `push`. Můžete na tuto událost naslouchat a zobrazit notifikaci uživateli.

Příklad:

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

            

Přizpůsobení push notifikací

Notifications API vám umožňuje přizpůsobit vzhled a chování push notifikací. Můžete specifikovat název, tělo, ikonu, odznak a další možnosti.

Příklad:

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

            

Příklad: Upozornění na novinky

Zpravodajská aplikace může používat push notifikace k upozornění uživatelů na nejnovější zprávy. Když je publikován nový článek, server odešle push notifikaci na zařízení uživatele, která zobrazí krátké shrnutí článku. Uživatel pak může kliknutím na notifikaci otevřít celý článek v PWA.

Pokročilé vzory pro Service Worker

1. Offline analytika

Sledujte chování uživatelů, i když jsou offline, ukládáním analytických dat lokálně a jejich odesláním na server, jakmile je síť k dispozici. Toho lze dosáhnout pomocí IndexedDB a Background Sync.

2. Správa verzí a aktualizace

Implementujte robustní strategii správy verzí pro váš service worker, abyste zajistili, že uživatelé vždy obdrží nejnovější aktualizace bez narušení jejich zážitku. Používejte techniky cache-busting k zneplatnění starých cachovaných zdrojů.

3. Modulární Service Workery

Organizujte kód vašeho service workeru do modulů pro zlepšení udržovatelnosti a čitelnosti. Použijte JavaScript moduly (ESM) nebo nástroj pro sdružování modulů jako Webpack nebo Rollup.

4. Dynamické cachování

Cachujte zdroje dynamicky na základě interakcí uživatelů a vzorců používání. To může pomoci optimalizovat velikost cache a zlepšit výkon.

Osvědčené postupy pro vývoj Service Workerů

Závěr

JavaScript service workery jsou mocnými nástroji pro tvorbu robustních, výkonných a poutavých PWA. Porozuměním životnímu cyklu service workeru a implementací vhodných strategií cachování, synchronizace na pozadí a push notifikací můžete vytvořit výjimečné uživatelské zážitky, a to i v offline prostředích. Tento článek prozkoumal klíčové vzory a osvědčené postupy pro service workery, které vás povedou při tvorbě úspěšných PWA pro globální publikum. Jak se web neustále vyvíjí, service workery budou hrát stále důležitější roli při formování budoucnosti webového vývoje.

Nezapomeňte přizpůsobit tyto vzory specifickým požadavkům vaší aplikace a vždy upřednostňujte uživatelský zážitek. Přijetím síly service workerů můžete vytvořit PWA, které jsou nejen funkční, ale také radostné používat, bez ohledu na polohu uživatele nebo jeho síťové připojení.

Další zdroje: