Service Worker adalah skrip JavaScript yang berjalan di background browser, terpisah dari halaman web utama. Service Worker memungkinkan fitur modern seperti:
- Offline support
- Caching resource
- Push notifications
- Background sync
Dengan Service Worker, web app bisa bekerja lebih cepat, responsif, dan dapat diakses bahkan tanpa koneksi internet.
Contents
1. Konsep Dasar Service Worker
1.1 Cara Kerja
- Service Worker berjalan di luar main thread.
- Tidak memiliki akses langsung ke DOM.
- Berfungsi sebagai proxy antara jaringan dan aplikasi.
- Lifecycle terdiri dari install → activate → fetch → sync.
1.2 Lifecycle Service Worker
- Register: Browser mendeteksi dan mendaftarkan service worker.
- Install: Service worker menginstal resource yang akan dicache.
- Activate: Service worker aktif, mengontrol halaman.
- Fetch: Menangani request jaringan, bisa intercept dan serve cached response.
- Update: Browser mengecek versi terbaru service worker.
2. Mendaftarkan Service Worker
File utama JavaScript, misal app.js:
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('/sw.js')
.then(registration => {
console.log('Service Worker terdaftar dengan scope:', registration.scope);
})
.catch(err => {
console.log('Pendaftaran Service Worker gagal:', err);
});
});
}
sw.jsadalah file Service Worker.- Scope default adalah folder tempat sw.js berada dan semua subfolder.
3. File Service Worker Dasar (sw.js)
const CACHE_NAME = 'my-site-cache-v1';
const urlsToCache = [
'/',
'/index.html',
'/styles.css',
'/app.js',
'/logo.png'
];
// Install event
self.addEventListener('install', event => {
console.log('[Service Worker] Install');
event.waitUntil(
caches.open(CACHE_NAME)
.then(cache => {
console.log('[Service Worker] Caching all files');
return cache.addAll(urlsToCache);
})
);
});
// Activate event
self.addEventListener('activate', event => {
console.log('[Service Worker] Activate');
event.waitUntil(
caches.keys().then(cacheNames => {
return Promise.all(
cacheNames.map(cacheName => {
if (cacheName !== CACHE_NAME) {
console.log('[Service Worker] Clearing old cache:', cacheName);
return caches.delete(cacheName);
}
})
);
})
);
});
// Fetch event
self.addEventListener('fetch', event => {
console.log('[Service Worker] Fetching:', event.request.url);
event.respondWith(
caches.match(event.request)
.then(response => {
return response || fetch(event.request);
})
);
});
Penjelasan:
- Install: Mencache file penting agar aplikasi bisa diakses offline.
- Activate: Menghapus cache lama.
- Fetch: Intercept request; jika ada di cache → serve cached file, jika tidak → fetch dari jaringan.
4. Strategi Caching
4.1 Cache First (Static Assets)
- File statis (CSS, JS, gambar) diambil dari cache terlebih dahulu.
- Cocok untuk file jarang berubah.
event.respondWith(
caches.match(event.request)
.then(response => response || fetch(event.request))
);
4.2 Network First (Dynamic Content)
- Untuk data API atau konten dinamis, coba ambil dari jaringan terlebih dahulu.
- Jika gagal (offline), fallback ke cache.
event.respondWith(
fetch(event.request)
.then(response => {
return caches.open(CACHE_NAME).then(cache => {
cache.put(event.request, response.clone());
return response;
});
})
.catch(() => caches.match(event.request))
);
5. Contoh Kasus Nyata: Offline Web App
- File penting dicache saat install (
index.html, CSS, JS, logo). - Pengguna membuka web tanpa internet → halaman tetap tampil dari cache.
- API data bisa menggunakan network first → selalu up-to-date, tapi fallback ke cache saat offline.
6. Update Service Worker
- Jika ada perubahan
sw.js, browser akan mendeteksi versi baru. - Service worker baru akan install → activate → replace service worker lama setelah tab web ditutup.
Tips: Tambahkan versi cache untuk menghindari cache lama:
const CACHE_NAME = 'my-site-cache-v2'; // ganti versi setiap update
7. Debugging dan Tools
- Chrome DevTools → Application → Service Workers
Bisa melihat status, unregister, update service worker. - Cache Storage: melihat file yang dicache.
- Network → Offline mode: testing offline support.
8. Best Practices
- Selalu gunakan versioning untuk cache agar update file bisa dikenali.
- Batasi ukuran cache → jangan cache file terlalu besar.
- Gunakan network-first untuk API, cache-first untuk static assets.
- Hati-hati dengan
fetch→ jangan cache request sensitive (misal login atau data pribadi). - Testing offline → gunakan DevTools Offline mode.
- Kombinasikan dengan Push Notification dan Background Sync untuk PWA lebih canggih.
9. Kesimpulan
Service Worker memungkinkan:
- Offline-first experience
- Faster load times
- Control terhadap caching
- Background sync dan push notification
Dengan implementasi yang tepat, web app menjadi lebih responsif, stabil, dan PWA-ready.
