PWA: SW network-first für HTML, sofortiger Reload bei Update; DevTools: JSON Viewer+Builder

This commit is contained in:
2026-06-01 13:52:24 +02:00
parent 2b6f8da0f9
commit f09f2bf03e
3 changed files with 361 additions and 14 deletions

View File

@@ -2,7 +2,7 @@ import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App.jsx'
// ── Auto-Reload bei neuem Build nur beim Seitenwechsel ─────────────────────
// ── Auto-Reload bei neuem Build ───────────────────────────────────────────────
const STORED_KEY = 'dd_build_time';
let newBuildAvailable = false;
@@ -15,7 +15,7 @@ async function checkBuildTime() {
localStorage.setItem(STORED_KEY, buildTime);
} else if (stored !== buildTime) {
localStorage.setItem(STORED_KEY, buildTime);
newBuildAvailable = true; // merken, aber noch nicht reloaden
newBuildAvailable = true;
}
} catch {}
}
@@ -32,17 +32,25 @@ export function reloadIfNewBuild() {
// ── Service Worker ────────────────────────────────────────────────────────────
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js').then(reg => {
if (reg.waiting) reg.waiting.postMessage('SKIP_WAITING');
// Falls schon ein wartender SW da ist → sofort aktivieren
if (reg.waiting) {
reg.waiting.postMessage('SKIP_WAITING');
}
reg.addEventListener('updatefound', () => {
const nw = reg.installing;
nw?.addEventListener('statechange', () => {
if (nw.state === 'installed' && navigator.serviceWorker.controller) {
if (nw.state === 'installed') {
// Neuer SW installiert → sofort aktivieren
nw.postMessage('SKIP_WAITING');
}
});
});
// Wenn SW-Controller gewechselt hat → sofort neu laden
// (nicht erst beim nächsten Seitenwechsel warten)
navigator.serviceWorker.addEventListener('controllerchange', () => {
newBuildAvailable = true; // SW-Update → beim nächsten Wechsel laden
window.location.reload();
});
});
}