Arsitektur Progressive Web App: Pola-Pola Service Worker JavaScript | MLOG | MLOG

4. Network-Only

Strategi network-only selalu mengambil aset dari jaringan, melewati cache sepenuhnya. Strategi ini digunakan ketika Anda benar-benar membutuhkan versi terbaru dari suatu sumber daya dan caching tidak diinginkan.

Contoh:

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

            

5. Stale-While-Revalidate

Strategi stale-while-revalidate menyajikan aset dari cache dengan segera sambil secara bersamaan mengambil versi terbaru dari jaringan. Setelah permintaan jaringan selesai, cache akan diperbarui dengan versi baru. Strategi ini memberikan respons awal yang cepat sambil memastikan bahwa pengguna pada akhirnya menerima konten yang paling mutakhir. Ini adalah strategi yang berguna untuk konten yang tidak kritis yang lebih mementingkan kecepatan daripada kebaruan mutlak.

Contoh:

            
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

Mirip dengan stale-while-revalidate tetapi tanpa pengembalian langsung aset yang di-cache. Strategi ini memeriksa cache terlebih dahulu, dan hanya jika aset ada, permintaan jaringan akan dilanjutkan di latar belakang untuk memperbarui cache.

Memilih Strategi Caching yang Tepat

Strategi caching yang optimal bergantung pada kebutuhan spesifik aplikasi Anda. Pertimbangkan faktor-faktor seperti:

Dengan memilih strategi caching yang sesuai secara cermat, Anda dapat secara signifikan meningkatkan performa dan pengalaman pengguna PWA Anda, bahkan di lingkungan offline. Alat seperti Workbox ([https://developers.google.com/web/tools/workbox](https://developers.google.com/web/tools/workbox)) dapat menyederhanakan implementasi strategi-strategi ini.

Sinkronisasi Latar Belakang: Menangani Mutasi Offline

Sinkronisasi latar belakang memungkinkan PWA Anda untuk melakukan tugas di latar belakang, bahkan ketika pengguna sedang offline. Ini sangat berguna untuk menangani pengiriman formulir, pembaruan data, dan operasi lain yang memerlukan konektivitas jaringan. API `BackgroundSyncManager` memungkinkan Anda mendaftarkan tugas yang akan dieksekusi ketika jaringan tersedia.

Mendaftarkan Tugas Sinkronisasi Latar Belakang

Untuk mendaftarkan tugas sinkronisasi latar belakang, Anda perlu menggunakan metode `register` dari `BackgroundSyncManager`. Metode ini menerima nama tag yang unik sebagai argumen. Nama tag mengidentifikasi tugas spesifik yang akan dilakukan.

Contoh:

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

            

Menangani Event Sync

Ketika browser mendeteksi konektivitas jaringan, ia akan mengirimkan event `sync` ke service worker. Anda dapat mendengarkan event ini dan melakukan tindakan yang diperlukan, seperti mengirim data ke server.

Contoh:

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

            

Contoh: Pengiriman Formulir Offline

Bayangkan sebuah skenario di mana pengguna mengisi formulir saat offline. Service worker dapat menyimpan data formulir di IndexedDB dan mendaftarkan tugas sinkronisasi latar belakang. Ketika jaringan tersedia, service worker akan mengambil data formulir dari IndexedDB dan mengirimkannya ke server.

  1. Pengguna mengisi formulir dan mengklik kirim saat offline.
  2. Data formulir disimpan di IndexedDB.
  3. Sebuah tugas sinkronisasi latar belakang didaftarkan dengan tag unik (misalnya, `form-submission`).
  4. Ketika jaringan tersedia, event `sync` dipicu.
  5. Service worker mengambil data formulir dari IndexedDB dan mengirimkannya ke server.
  6. Jika pengiriman berhasil, data formulir dihapus dari IndexedDB.

Notifikasi Push: Melibatkan Pengguna dengan Pembaruan Tepat Waktu

Notifikasi push memungkinkan PWA Anda untuk mengirim pembaruan dan pesan tepat waktu kepada pengguna, bahkan ketika aplikasi tidak berjalan secara aktif di browser. Hal ini dapat secara signifikan meningkatkan keterlibatan dan retensi pengguna. Push API dan Notifications API bekerja sama untuk mengirimkan notifikasi push.

Berlangganan Notifikasi Push

Untuk menerima notifikasi push, pengguna harus terlebih dahulu memberikan izin kepada PWA Anda. Anda dapat menggunakan API `PushManager` untuk mendaftarkan pengguna ke notifikasi push.

Contoh:

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

            

Penting: Ganti `YOUR_PUBLIC_VAPID_KEY` dengan kunci VAPID (Voluntary Application Server Identification) Anda yang sebenarnya. Kunci VAPID digunakan untuk mengidentifikasi server aplikasi Anda dan memastikan bahwa notifikasi push dikirim dengan aman.

Menangani Notifikasi Push

Ketika notifikasi push diterima, service worker akan mengirimkan event `push`. Anda dapat mendengarkan event ini dan menampilkan notifikasi kepada pengguna.

Contoh:

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

            

Menyesuaikan Notifikasi Push

Notifications API memungkinkan Anda untuk menyesuaikan tampilan dan perilaku notifikasi push. Anda dapat menentukan judul, isi, ikon, lencana, dan opsi lainnya.

Contoh:

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

            

Contoh: Peringatan Berita

Aplikasi berita dapat menggunakan notifikasi push untuk memberi tahu pengguna tentang berita terkini. Ketika artikel baru diterbitkan, server mengirimkan notifikasi push ke perangkat pengguna, menampilkan ringkasan singkat artikel tersebut. Pengguna kemudian dapat mengklik notifikasi untuk membuka artikel lengkap di PWA.

Pola-Pola Service Worker Tingkat Lanjut

1. Analitik Offline

Lacak perilaku pengguna bahkan ketika mereka offline dengan menyimpan data analitik secara lokal dan mengirimkannya ke server ketika jaringan tersedia. Ini dapat dicapai dengan menggunakan IndexedDB dan Background Sync.

2. Pemberian Versi dan Pembaruan

Terapkan strategi pemberian versi yang kuat untuk service worker Anda untuk memastikan bahwa pengguna selalu menerima pembaruan terbaru tanpa mengganggu pengalaman mereka. Gunakan teknik cache busting untuk membatalkan aset cache yang lama.

3. Service Worker Modular

Organisasikan kode service worker Anda ke dalam modul untuk meningkatkan kemudahan pemeliharaan dan keterbacaan. Gunakan modul JavaScript (ESM) atau module bundler seperti Webpack atau Rollup.

4. Caching Dinamis

Cache aset secara dinamis berdasarkan interaksi pengguna dan pola penggunaan. Ini dapat membantu mengoptimalkan ukuran cache dan meningkatkan performa.

Praktik Terbaik untuk Pengembangan Service Worker

Kesimpulan

Service worker JavaScript adalah alat yang ampuh untuk membangun PWA yang tangguh, berperforma tinggi, dan menarik. Dengan memahami siklus hidup service worker dan menerapkan strategi caching yang sesuai, sinkronisasi latar belakang, dan notifikasi push, Anda dapat menciptakan pengalaman pengguna yang luar biasa, bahkan di lingkungan offline. Artikel ini telah menjelajahi pola-pola utama service worker dan praktik terbaik untuk memandu Anda dalam membangun PWA yang sukses untuk audiens global. Seiring web terus berkembang, service worker akan memainkan peran yang semakin penting dalam membentuk masa depan pengembangan web.

Ingatlah untuk mengadaptasi pola-pola ini sesuai dengan kebutuhan spesifik aplikasi Anda dan selalu prioritaskan pengalaman pengguna. Dengan memanfaatkan kekuatan service worker, Anda dapat membuat PWA yang tidak hanya fungsional tetapi juga menyenangkan untuk digunakan, terlepas dari lokasi atau koneksi jaringan pengguna.

Sumber Daya Lebih Lanjut: