İlerici Web Uygulaması Mimarisi: JavaScript Service Worker Kalıpları | MLOG | MLOG
Türkçe
Sağlam ve performanslı İlerici Web Uygulamaları (PWA'lar) oluşturmak için gelişmiş JavaScript service worker kalıplarını keşfedin. Önbellekleme stratejilerini, arka plan senkronizasyonunu, anlık bildirimleri ve daha fazlasını öğrenin.
İlerici Web Uygulaması Mimarisi: JavaScript Service Worker Kalıpları
İlerici Web Uygulamaları (PWA'lar), kullanıcılara doğrudan tarayıcılarında uygulama benzeri deneyimler sunarak web geliştirmede devrim yaratıyor. Her PWA'nın kalbinde, çevrimdışı işlevsellik, arka plan senkronizasyonu ve anlık bildirimler sağlayan, programlanabilir bir ağ proxy'si gibi davranan bir JavaScript dosyası olan Service Worker bulunur. Bu makale, küresel bir kitle için tasarlanmış sağlam ve performanslı PWA'lar oluşturmaya yönelik gelişmiş JavaScript service worker kalıplarını ele almaktadır.
Service Worker Yaşam Döngüsünü Anlamak
Belirli kalıplara dalmadan önce, Service Worker yaşam döngüsünü anlamak çok önemlidir. Bu yaşam döngüsü, service worker'ın nasıl kurulduğunu, etkinleştirildiğini ve güncellendiğini belirler. Önemli aşamalar şunları içerir:
Kayıt (Registration): Tarayıcı, service worker'ı belirli bir kapsamla (bir URL yolu) ilişkilendirerek kaydeder.
Kurulum (Installation): Service worker kurulur ve bu sırada genellikle temel varlıkları önbelleğe alır.
Etkinleştirme (Activation): Service worker aktif hale gelir ve kapsamındaki sayfaları kontrol eder.
Güncelleme (Update): Tarayıcı, service worker için güncellemeleri kontrol eder ve kurulum ile etkinleştirme aşamalarını tekrarlar.
Bu yaşam döngüsünü doğru bir şekilde yönetmek, sorunsuz bir PWA deneyimi için esastır. Gelin bazı yaygın service worker kalıplarını inceleyelim.
Önbellekleme Stratejileri: Çevrimdışı Erişim ve Performans için Optimizasyon
Önbellekleme, PWA'larda çevrimdışı işlevselliğin ve artırılmış performansın temel taşıdır. Service worker'lar, önbellekleme üzerinde ayrıntılı kontrol sunarak geliştiricilerin farklı varlık türlerine göre uyarlanmış çeşitli stratejiler uygulamasına olanak tanır. İşte bazı temel önbellekleme kalıpları:
1. Önce Önbellek (Cache-First)
Önce önbellek stratejisi, içeriği önbellekten sunmaya öncelik verir. Varlık önbellekte bulunursa, hemen döndürülür. Aksi takdirde, istek ağa yapılır ve yanıt, kullanıcıya döndürülmeden önce önbelleğe alınır. Bu strateji, resimler, CSS ve JavaScript dosyaları gibi nadiren değişen statik varlıklar için idealdir.
Önce ağ stratejisi, varlığı önce ağdan almayı dener. Ağ isteği başarılı olursa, yanıt önbelleğe alınır ve kullanıcıya döndürülür. Ağ isteği başarısız olursa (örneğin, ağ bağlantısı sorunu nedeniyle), varlık önbellekten alınır. Bu strateji, haber makaleleri veya sosyal medya akışları gibi güncel olması gereken içerikler için uygundur.
Yalnızca önbellek stratejisi, varlıkları sadece önbellekten sunar. Varlık önbellekte bulunamazsa, bir hata döndürülür. Bu strateji, çevrimdışı kaynaklar veya önceden önbelleğe alınmış veriler gibi önbellekte bulunacağı garanti edilen varlıklar için uygundur.
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.
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.
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:
İçerik Tazeliği: İçeriğin en son sürümünü görüntülemek ne kadar önemli?
Ağ Güvenilirliği: Kullanıcının ağ bağlantısı ne kadar güvenilir?
Performans: İçeriği kullanıcıya ne kadar hızlı sunmanız gerekiyor?
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.
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.
Kullanıcı çevrimdışıyken formu doldurur ve gönder'e tıklar.
Form verileri IndexedDB'de saklanır.
Benzersiz bir etiketle (ör. `form-submission`) bir arka plan senkronizasyon görevi kaydedilir.
Ağ kullanılabilir olduğunda, `sync` olayı tetiklenir.
Service worker, form verilerini IndexedDB'den alır ve sunucuya gönderir.
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.
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
Service worker'ınızı küçük ve verimli tutun. Service worker içinde karmaşık hesaplamalar veya kaynak yoğun işlemler yapmaktan kaçının.
Service worker'ınızı kapsamlı bir şekilde test edin. Service worker'ınızın doğru çalıştığından emin olmak için tarayıcı geliştirici araçlarını ve test çerçevelerini kullanın.
Hataları zarif bir şekilde ele alın. PWA'nızın çökmesini veya beklenmedik şekilde davranmasını önlemek için hata yönetimi uygulayın.
Service worker'ları desteklemeyen kullanıcılar için bir yedek deneyim sağlayın. Tüm tarayıcılar service worker'ları desteklemez. PWA'nızın bu tarayıcılarda da doğru çalıştığından emin olun.
Service worker'ınızın performansını izleyin. Herhangi bir performans sorununu belirlemek ve gidermek için performans izleme araçlarını kullanın.
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:
Google Workbox: [https://developers.google.com/web/tools/workbox](https://developers.google.com/web/tools/workbox)
MDN Web Docs - Service Worker'lar: [https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API)