INTRODUCTION TO SERVICE WORKERS
Service workers are a powerful browser feature that allows developers to intercept network requests, manage caching, and provide offline capabilities for web applications. Running separately from the main browser thread, service workers enable background tasks such as push notifications and background sync.
HOW SERVICE WORKERS WORK
When registered, a service worker acts as a programmable proxy between your web app, the user, and the network. This makes it possible to:
- Intercept incoming and outgoing HTTP requests
- Cache resources for offline use
- Respond to network events even when offline
- Handle push notifications safely in the background
REGISTERING A SERVICE WORKER
To use a service worker, first register it from your main JavaScript file:
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('/service-worker.js')
.then(registration => {
console.log('Service worker registered with scope:', registration.scope);
})
.catch(error => {
console.log('Service worker registration failed:', error);
});
});
}
This code checks for browser support and registers the service-worker.js
file when the page is loaded.
BASIC SERVICE WORKER LIFECYCLE
Service workers follow a defined lifecycle:
- Install: Runs once when the worker is registered, used for pre-caching resources.
- Activate: Cleans up old caches and prepares the worker to control open pages.
- Fetch: Intercepts network requests and serves responses from the cache or network.
CACHING RESOURCES FOR OFFLINE ACCESS
Caching is the most common use of service workers. In your service-worker.js
file:
self.addEventListener('install', event => {
event.waitUntil(
caches.open('v1').then(cache => {
return cache.addAll([
'/',
'/index.html',
'/styles.css',
'/main.js',
]);
})
);
});
During the install
event, this code opens a cache and adds essential files.
SERVING CACHED FILES
To serve files from the cache, listen for fetch
events:
self.addEventListener('fetch', event => {
event.respondWith(
caches.match(event.request)
.then(response => {
return response || fetch(event.request);
})
);
});
This allows your application to load cached files if available or fallback to the network if not.
BEST PRACTICES
- Keep service worker code concise and focused on essential tasks.
- Update cache names when resources change to ensure users receive the latest files.
- Test thoroughly across browsers and devices.
- Unregister the service worker during development to avoid caching issues.
CONCLUSION
Implementing a basic service worker can significantly enhance the performance and reliability of your web projects. By intercepting network requests and caching resources, service workers lay the foundation for building resilient, app-like web experiences.