Make your SvelteKit app work offline with service worker support
Service workers act as proxy servers that handle network requests inside your app. This makes it possible to make your app work offline and speed up navigation by precaching built assets.
This example caches the built app and static files eagerly, then caches other requests as they happen:
src/service-worker.js
Copy
// Type safety references/// <reference no-default-lib="true"/>/// <reference lib="esnext" />/// <reference lib="webworker" />/// <reference types="@sveltejs/kit" />/// <reference types="../.svelte-kit/ambient.d.ts" />import { build, files, version } from '$service-worker';const self = /** @type {ServiceWorkerGlobalScope} */ (/** @type {unknown} */ (globalThis.self));// Create a unique cache name for this deploymentconst CACHE = `cache-${version}`;const ASSETS = [ ...build, // the app itself ...files // everything in `static`];self.addEventListener('install', (event) => { // Create a new cache and add all files to it async function addFilesToCache() { const cache = await caches.open(CACHE); await cache.addAll(ASSETS); } event.waitUntil(addFilesToCache());});self.addEventListener('activate', (event) => { // Remove previous cached data from disk async function deleteOldCaches() { for (const key of await caches.keys()) { if (key !== CACHE) await caches.delete(key); } } event.waitUntil(deleteOldCaches());});self.addEventListener('fetch', (event) => { // ignore POST requests etc if (event.request.method !== 'GET') return; async function respond() { const url = new URL(event.request.url); const cache = await caches.open(CACHE); // `build`/`files` can always be served from the cache if (ASSETS.includes(url.pathname)) { const response = await cache.match(url.pathname); if (response) { return response; } } // for everything else, try the network first, but // fall back to the cache if we're offline try { const response = await fetch(event.request); // if we're offline, fetch can return a value that is not a Response // instead of throwing - and we can't pass this non-Response to respondWith if (!(response instanceof Response)) { throw new Error('invalid response from fetch'); } if (response.status === 200) { cache.put(event.request, response.clone()); } return response; } catch (err) { const response = await cache.match(event.request); if (response) { return response; } // if there's no cache, then just error out // as there is nothing we can do to respond to this request throw err; } } event.respondWith(respond());});
1
Install event
Opens a cache and adds all static assets to it
2
Activate event
Removes old caches from previous deployments
3
Fetch event
Serves cached assets immediately, network resources with cache fallback