İlerici Web Uygulaması Mimarisi: JavaScript Service Worker Kalıpları | MLOG | MLOG

4. Yalnızca Ağ (Network-Only)

Yalnızca ağ stratejisi, önbelleği tamamen atlayarak varlıkları her zaman ağdan alır. Bu strateji, bir kaynağın kesinlikle en son sürümüne ihtiyaç duyduğunuzda ve önbelleklemenin istenmediği durumlarda kullanılır.

Örnek:

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

            

5. Eskiyken Yeniden Doğrula (Stale-While-Revalidate)

Eskiyken yeniden doğrula stratejisi, önbelleğe alınmış varlığı hemen sunarken aynı anda ağdan en son sürümü getirir. Ağ isteği tamamlandığında, önbellek yeni sürümle güncellenir. Bu strateji, kullanıcının eninde sonunda en güncel içeriği almasını sağlarken hızlı bir başlangıç yanıtı sunar. Bu, mutlak tazelikten çok hızdan yararlanan kritik olmayan içerikler için kullanışlı bir stratejidir.

Örnek:

            
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. Önce Önbellek, Sonra Ağ (Cache, then Network)

Eskiyken yeniden doğrula stratejisine benzer, ancak önbelleğe alınmış varlığın hemen döndürülmesi yoktur. Önce önbelleği kontrol eder ve yalnızca varlık mevcutsa ağ isteği önbelleği güncellemek için arka planda devam eder.

Doğru Önbellekleme Stratejisini Seçmek

Optimum önbellekleme stratejisi, uygulamanızın özel gereksinimlerine bağlıdır. Aşağıdaki gibi faktörleri göz önünde bulundurun:

Uygun önbellekleme stratejilerini dikkatlice seçerek, çevrimdışı ortamlarda bile PWA'nızın performansını ve kullanıcı deneyimini önemli ölçüde artırabilirsiniz. Workbox ([https://developers.google.com/web/tools/workbox](https://developers.google.com/web/tools/workbox)) gibi araçlar bu stratejilerin uygulanmasını basitleştirebilir.

Arka Plan Senkronizasyonu: Çevrimdışı Değişiklikleri Yönetme

Arka plan senkronizasyonu, PWA'nızın kullanıcı çevrimdışıyken bile arka planda görevleri gerçekleştirmesine olanak tanır. Bu, form gönderimleri, veri güncellemeleri ve ağ bağlantısı gerektiren diğer işlemler için özellikle kullanışlıdır. `BackgroundSyncManager` API'si, ağ kullanılabilir olduğunda yürütülecek görevleri kaydetmenizi sağlar.

Bir Arka Plan Senkronizasyon Görevi Kaydetme

Bir arka plan senkronizasyon görevi kaydetmek için `BackgroundSyncManager`'ın `register` metodunu kullanmanız gerekir. Bu metot, argüman olarak benzersiz bir etiket adı alır. Etiket adı, gerçekleştirilecek belirli görevi tanımlar.

Örnek:

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

            

Senkronizasyon Olayını Yönetme

Tarayıcı ağ bağlantısı algıladığında, service worker'a bir `sync` olayı gönderir. Bu olayı dinleyebilir ve verileri sunucuya göndermek gibi gerekli eylemleri gerçekleştirebilirsiniz.

Örnek:

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

            

Örnek: Çevrimdışı Form Gönderimi

Bir kullanıcının çevrimdışıyken bir form doldurduğu bir senaryo düşünün. Service worker, form verilerini IndexedDB'de saklayabilir ve bir arka plan senkronizasyon görevi kaydedebilir. Ağ kullanılabilir olduğunda, service worker form verilerini IndexedDB'den alacak ve sunucuya gönderecektir.

  1. Kullanıcı çevrimdışıyken formu doldurur ve gönder'e tıklar.
  2. Form verileri IndexedDB'de saklanır.
  3. Benzersiz bir etiketle (ör. `form-submission`) bir arka plan senkronizasyon görevi kaydedilir.
  4. Ağ kullanılabilir olduğunda, `sync` olayı tetiklenir.
  5. Service worker, form verilerini IndexedDB'den alır ve sunucuya gönderir.
  6. Gönderim başarılı olursa, form verileri IndexedDB'den kaldırılır.

Anlık Bildirimler: Kullanıcılarla Zamanında Güncellemelerle Etkileşim Kurma

Anlık bildirimler, uygulama tarayıcıda aktif olarak çalışmıyorken bile PWA'nızın kullanıcılara zamanında güncellemeler ve mesajlar göndermesini sağlar. Bu, kullanıcı etkileşimini ve elde tutma oranını önemli ölçüde artırabilir. Push API ve Notifications API, anlık bildirimleri iletmek için birlikte çalışır.

Anlık Bildirimlere Abone Olma

Anlık bildirimleri almak için kullanıcıların önce PWA'nıza izin vermesi gerekir. Kullanıcıları anlık bildirimlere abone yapmak için `PushManager` API'sini kullanabilirsiniz.

Örnek:

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

            

Önemli: `YOUR_PUBLIC_VAPID_KEY` kısmını gerçek VAPID (Voluntary Application Server Identification) anahtarınızla değiştirin. VAPID anahtarları, uygulama sunucunuzu tanımlamak ve anlık bildirimlerin güvenli bir şekilde gönderilmesini sağlamak için kullanılır.

Anlık Bildirimleri Yönetme

Bir anlık bildirim alındığında, service worker bir `push` olayı gönderir. Bu olayı dinleyebilir ve bildirimi kullanıcıya görüntüleyebilirsiniz.

Örnek:

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

            

Anlık Bildirimleri Özelleştirme

Notifications API, anlık bildirimlerin görünümünü ve davranışını özelleştirmenize olanak tanır. Başlık, gövde, simge, rozet ve diğer seçenekleri belirtebilirsiniz.

Örnek:

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

            

Örnek: Haber Uyarısı

Bir haber uygulaması, kullanıcılara son dakika haberlerini bildirmek için anlık bildirimleri kullanabilir. Yeni bir makale yayınlandığında, sunucu kullanıcının cihazına bir anlık bildirim göndererek makalenin kısa bir özetini görüntüler. Kullanıcı daha sonra bildirime tıklayarak PWA'da makalenin tamamını açabilir.

Gelişmiş Service Worker Kalıpları

1. Çevrimdışı Analitik

Analitik verilerini yerel olarak depolayarak ve ağ kullanılabilir olduğunda sunucuya göndererek kullanıcı davranışını çevrimdışıyken bile izleyin. Bu, IndexedDB ve Arka Plan Senkronizasyonu kullanılarak gerçekleştirilebilir.

2. Sürümleme ve Güncelleme

Kullanıcıların deneyimlerini aksatmadan her zaman en son güncellemeleri almalarını sağlamak için service worker'ınız için sağlam bir sürümleme stratejisi uygulayın. Eski önbelleğe alınmış varlıkları geçersiz kılmak için önbellek bozma (cache busting) tekniklerini kullanın.

3. Modüler Service Worker'lar

Sürdürülebilirliği ve okunabilirliği artırmak için service worker kodunuzu modüller halinde düzenleyin. JavaScript modüllerini (ESM) veya Webpack veya Rollup gibi bir modül paketleyici kullanın.

4. Dinamik Önbellekleme

Kullanıcı etkileşimlerine ve kullanım alışkanlıklarına göre varlıkları dinamik olarak önbelleğe alın. Bu, önbellek boyutunu optimize etmeye ve performansı artırmaya yardımcı olabilir.

Service Worker Geliştirme için En İyi Uygulamalar

Sonuç

JavaScript service worker'ları, sağlam, performanslı ve ilgi çekici PWA'lar oluşturmak için güçlü araçlardır. Service worker yaşam döngüsünü anlayarak ve uygun önbellekleme stratejilerini, arka plan senkronizasyonunu ve anlık bildirimleri uygulayarak, çevrimdışı ortamlarda bile olağanüstü kullanıcı deneyimleri yaratabilirsiniz. Bu makale, küresel bir kitle için başarılı PWA'lar oluşturmanızda size yol gösterecek temel service worker kalıplarını ve en iyi uygulamaları incelemiştir. Web gelişmeye devam ettikçe, service worker'lar web geliştirmenin geleceğini şekillendirmede giderek daha önemli bir rol oynayacaktır.

Bu kalıpları özel uygulama gereksinimlerinize uyarlamayı ve her zaman kullanıcı deneyimine öncelik vermeyi unutmayın. Service worker'ların gücünü benimseyerek, kullanıcının konumundan veya ağ bağlantısından bağımsız olarak sadece işlevsel değil, aynı zamanda kullanımı keyifli olan PWA'lar oluşturabilirsiniz.

Ek Kaynaklar: