Вот пример работы Service Worker для отображения сообщения об оффлайне.
Больше - в этой статье.
index.html:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SW test</title>
</head>
<body>
<h1>You are ONLINE</h1>
</body>
</html>
<script>
const registerSW = async () => {
if ('serviceWorker' in navigator) {
await navigator.serviceWorker.register('./sw.js')
const worker = await navigator.serviceWorker.ready
}
}
registerSW()
</script>
sw.js:
function offlineResponse() {
return new Response('<h1>you are offline</h1>', {
headers: {
'Content-Type': 'text/html; charset=utf-8'
}
});
}
function useCache(request) {
return caches.open('offline-cache').then((cache) =>
cache.match(request).then((matching) =>
matching || Promise.reject('no-match')
));
}
self.addEventListener('install', (event) => {
event.waitUntil(
caches
.open('CACHE')
.then(() => self.skipWaiting())
);
});
self.addEventListener('activate', (event) => {
event.waitUntil(self.clients.claim());
});
self.addEventListener('fetch', function (event) {
event.respondWith(
fetch(event.request)
.then((response) => response.ok ? response : useCache(request))
.catch(() => offlineResponse())
)
});
Протестировать можно при помощи DevTools
