Architektura Progresywnych Aplikacji Webowych: Wzorce JavaScript Service Worker | MLOG | MLOG

4. Network-Only (Tylko Sie膰)

Strategia network-only zawsze pobiera zasoby z sieci, ca艂kowicie omijaj膮c pami臋膰 podr臋czn膮. Ta strategia jest u偶ywana, gdy absolutnie potrzebujesz najnowszej wersji zasobu, a buforowanie nie jest po偶膮dane.

Przyk艂ad:

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

            

5. Stale-While-Revalidate

Strategia stale-while-revalidate natychmiast serwuje zbuforowany zas贸b, jednocze艣nie pobieraj膮c najnowsz膮 wersj臋 z sieci. Po zako艅czeniu 偶膮dania sieciowego pami臋膰 podr臋czna jest aktualizowana now膮 wersj膮. Ta strategia zapewnia szybk膮 pocz膮tkow膮 odpowied藕, jednocze艣nie gwarantuj膮c, 偶e u偶ytkownik ostatecznie otrzyma najbardziej aktualn膮 tre艣膰. Jest to przydatna strategia dla tre艣ci niekrytycznych, kt贸re czerpi膮 korzy艣ci z szybko艣ci ponad absolutn膮 艣wie偶o艣膰.

Przyk艂ad:

            
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 (Pami臋膰 Podr臋czna, potem Sie膰)

Podobna do stale-while-revalidate, ale bez natychmiastowego zwracania zbuforowanego zasobu. Sprawdza najpierw pami臋膰 podr臋czn膮 i tylko je艣li zas贸b jest obecny, 偶膮danie sieciowe jest kontynuowane w tle w celu zaktualizowania pami臋ci podr臋cznej.

Wyb贸r Odpowiedniej Strategii Buforowania

Optymalna strategia buforowania zale偶y od specyficznych wymaga艅 Twojej aplikacji. Nale偶y wzi膮膰 pod uwag臋 takie czynniki jak:

Starannie dobieraj膮c odpowiednie strategie buforowania, mo偶esz znacznie poprawi膰 wydajno艣膰 i do艣wiadczenie u偶ytkownika Twojej PWA, nawet w 艣rodowiskach offline. Narz臋dzia takie jak Workbox ([https://developers.google.com/web/tools/workbox](https://developers.google.com/web/tools/workbox)) mog膮 upro艣ci膰 implementacj臋 tych strategii.

Synchronizacja w Tle: Obs艂uga Zmian w Trybie Offline

Synchronizacja w tle pozwala Twojej PWA wykonywa膰 zadania w tle, nawet gdy u偶ytkownik jest offline. Jest to szczeg贸lnie przydatne do obs艂ugi wysy艂ania formularzy, aktualizacji danych i innych operacji wymagaj膮cych po艂膮czenia z sieci膮. API `BackgroundSyncManager` umo偶liwia rejestrowanie zada艅, kt贸re zostan膮 wykonane, gdy sie膰 stanie si臋 dost臋pna.

Rejestrowanie Zadania Synchronizacji w Tle

Aby zarejestrowa膰 zadanie synchronizacji w tle, musisz u偶y膰 metody `register` z `BackgroundSyncManager`. Metoda ta przyjmuje jako argument unikaln膮 nazw臋 znacznika (tag). Nazwa ta identyfikuje konkretne zadanie do wykonania.

Przyk艂ad:

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

            

Obs艂uga Zdarzenia Sync

Gdy przegl膮darka wykryje po艂膮czenie sieciowe, wysy艂a zdarzenie `sync` do service workera. Mo偶esz nas艂uchiwa膰 na to zdarzenie i wykonywa膰 niezb臋dne dzia艂ania, takie jak wysy艂anie danych na serwer.

Przyk艂ad:

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

            

Przyk艂ad: Wysy艂anie Formularza w Trybie Offline

Wyobra藕 sobie scenariusz, w kt贸rym u偶ytkownik wype艂nia formularz w trybie offline. Service worker mo偶e zapisa膰 dane formularza w IndexedDB i zarejestrowa膰 zadanie synchronizacji w tle. Gdy sie膰 stanie si臋 dost臋pna, service worker pobierze dane formularza z IndexedDB i wy艣le je na serwer.

  1. U偶ytkownik wype艂nia formularz i klika "wy艣lij" w trybie offline.
  2. Dane formularza s膮 zapisywane w IndexedDB.
  3. Zadanie synchronizacji w tle jest rejestrowane z unikalnym znacznikiem (np. `form-submission`).
  4. Gdy sie膰 jest dost臋pna, wyzwalane jest zdarzenie `sync`.
  5. Service worker pobiera dane formularza z IndexedDB i wysy艂a je na serwer.
  6. Je艣li wysy艂anie zako艅czy si臋 sukcesem, dane formularza s膮 usuwane z IndexedDB.

Powiadomienia Push: Anga偶owanie U偶ytkownik贸w za Pomoc膮 Aktualnych Powiadomie艅

Powiadomienia push pozwalaj膮 Twojej PWA wysy艂a膰 aktualne powiadomienia i wiadomo艣ci do u偶ytkownik贸w, nawet gdy aplikacja nie jest aktywnie uruchomiona w przegl膮darce. Mo偶e to znacznie poprawi膰 zaanga偶owanie i retencj臋 u偶ytkownik贸w. Push API i Notifications API wsp贸艂pracuj膮 ze sob膮, aby dostarcza膰 powiadomienia push.

Subskrybowanie Powiadomie艅 Push

Aby otrzymywa膰 powiadomienia push, u偶ytkownicy musz膮 najpierw udzieli膰 pozwolenia Twojej PWA. Mo偶esz u偶y膰 API `PushManager` do subskrybowania u偶ytkownik贸w na powiadomienia push.

Przyk艂ad:

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

            

Wa偶ne: Zast膮p `YOUR_PUBLIC_VAPID_KEY` swoim rzeczywistym kluczem VAPID (Voluntary Application Server Identification). Klucze VAPID s膮 u偶ywane do identyfikacji Twojego serwera aplikacji i zapewnienia bezpiecznego wysy艂ania powiadomie艅 push.

Obs艂uga Powiadomie艅 Push

Gdy powiadomienie push zostanie odebrane, service worker wysy艂a zdarzenie `push`. Mo偶esz nas艂uchiwa膰 na to zdarzenie i wy艣wietli膰 powiadomienie u偶ytkownikowi.

Przyk艂ad:

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

            

Dostosowywanie Powiadomie艅 Push

Notifications API pozwala dostosowa膰 wygl膮d i zachowanie powiadomie艅 push. Mo偶esz okre艣li膰 tytu艂, tre艣膰, ikon臋, plakietk臋 i inne opcje.

Przyk艂ad:

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

            

Przyk艂ad: Alert Informacyjny

Aplikacja informacyjna mo偶e u偶ywa膰 powiadomie艅 push do informowania u偶ytkownik贸w o najnowszych wiadomo艣ciach. Gdy nowy artyku艂 zostanie opublikowany, serwer wysy艂a powiadomienie push na urz膮dzenie u偶ytkownika, wy艣wietlaj膮c kr贸tkie podsumowanie artyku艂u. U偶ytkownik mo偶e nast臋pnie klikn膮膰 powiadomienie, aby otworzy膰 pe艂ny artyku艂 w PWA.

Zaawansowane Wzorce Service Worker

1. Analityka Offline

艢led藕 zachowanie u偶ytkownik贸w nawet w trybie offline, przechowuj膮c dane analityczne lokalnie i wysy艂aj膮c je na serwer, gdy sie膰 b臋dzie dost臋pna. Mo偶na to osi膮gn膮膰 za pomoc膮 IndexedDB i Background Sync.

2. Wersjonowanie i Aktualizowanie

Zaimplementuj solidn膮 strategi臋 wersjonowania dla swojego service workera, aby zapewni膰, 偶e u偶ytkownicy zawsze otrzymuj膮 najnowsze aktualizacje bez zak艂贸cania ich do艣wiadczenia. U偶ywaj technik cache busting, aby uniewa偶ni膰 stare zbuforowane zasoby.

3. Modu艂owe Service Workers

Organizuj kod swojego service workera w modu艂y, aby poprawi膰 jego utrzymywalno艣膰 i czytelno艣膰. U偶ywaj modu艂贸w JavaScript (ESM) lub narz臋dzi do budowania modu艂贸w, takich jak Webpack lub Rollup.

4. Dynamiczne Buforowanie

Buforuj zasoby dynamicznie w oparciu o interakcje u偶ytkownika i wzorce u偶ytkowania. Mo偶e to pom贸c zoptymalizowa膰 rozmiar pami臋ci podr臋cznej i poprawi膰 wydajno艣膰.

Dobre Praktyki w Rozwoju Service Worker

Podsumowanie

JavaScript service workers to pot臋偶ne narz臋dzia do budowy solidnych, wydajnych i anga偶uj膮cych PWA. Rozumiej膮c cykl 偶ycia service workera i implementuj膮c odpowiednie strategie buforowania, synchronizacj臋 w tle i powiadomienia push, mo偶esz tworzy膰 wyj膮tkowe do艣wiadczenia u偶ytkownika, nawet w 艣rodowiskach offline. Ten artyku艂 om贸wi艂 kluczowe wzorce service worker i dobre praktyki, kt贸re pomog膮 Ci w budowaniu udanych PWA dla globalnej publiczno艣ci. W miar臋 ewolucji sieci, service workers b臋d膮 odgrywa膰 coraz wa偶niejsz膮 rol臋 w kszta艂towaniu przysz艂o艣ci tworzenia stron internetowych.

Pami臋taj, aby dostosowa膰 te wzorce do specyficznych wymaga艅 swojej aplikacji i zawsze priorytetowo traktowa膰 do艣wiadczenie u偶ytkownika. Wykorzystuj膮c moc service workers, mo偶esz tworzy膰 PWA, kt贸re s膮 nie tylko funkcjonalne, ale tak偶e przyjemne w u偶yciu, niezale偶nie od lokalizacji u偶ytkownika czy po艂膮czenia sieciowego.

Dodatkowe zasoby: