Fix PWA-Update: window global statt dynamic import, synchroner Reload bei Seitenwechsel

This commit is contained in:
2026-06-02 19:38:40 +02:00
parent b698818791
commit b0b4c27f00
3 changed files with 26 additions and 41 deletions

View File

@@ -1,52 +1,44 @@
// Service Worker stellt sicher dass nach einem Deploy immer der neue Stand geladen wird
// index.html und API: immer vom Netzwerk (no-store)
// Assets (JS/CSS mit Hash): Network-first mit Cache-Fallback für Offline
const CACHE_NAME = 'dickendock-v2';
// Service Worker index.html immer frisch vom Server, Assets gecacht
const CACHE_NAME = 'dickendock-v3';
self.addEventListener('install', () => {
self.skipWaiting(); // sofort aktivieren ohne auf Tab-Schließen zu warten
self.skipWaiting();
});
self.addEventListener('activate', e => {
e.waitUntil(
caches.keys()
.then(keys => Promise.all(keys.map(k => caches.delete(k))))
.then(() => self.clients.claim()) // alle offenen Tabs sofort übernehmen
.then(() => self.clients.claim())
);
});
self.addEventListener('fetch', e => {
const url = new URL(e.request.url);
// API-Requests: nie cachen
// API: immer Netzwerk
if (url.pathname.startsWith('/api/')) {
e.respondWith(fetch(e.request));
return;
}
// HTML-Navigation (index.html, /, /*, alle Routen): immer frisch vom Server
// Das ist der Kern: verhindert dass eine alte index.html aus dem HTTP-Cache kommt
// HTML-Navigation: immer frisch vom Server, nie aus Cache
if (e.request.mode === 'navigate') {
e.respondWith(
fetch(e.request, {
cache: 'no-store', // Browser-HTTP-Cache umgehen
headers: { 'Cache-Control': 'no-cache' }
}).catch(() => caches.match('/index.html')) // nur bei echtem Offline-Fall: Cache-Fallback
fetch(e.request, { cache: 'no-store' })
.catch(() => caches.match('/index.html'))
);
return;
}
// Statische Assets (Vite baut mit Content-Hash im Dateinamen):
// Network-first, bei Fehler Cache-Fallback (für Offline-Nutzung)
// Statische Assets (JS/CSS mit Hash): Network-first, Cache als Fallback
e.respondWith(
fetch(e.request)
.then(response => {
if (response.ok) {
const clone = response.clone();
caches.open(CACHE_NAME).then(c => c.put(e.request, clone));
.then(res => {
if (res.ok) {
caches.open(CACHE_NAME).then(c => c.put(e.request, res.clone()));
}
return response;
return res;
})
.catch(() => caches.match(e.request))
);