Das bisherige 'CACHE = baustelle-vN' Pattern erforderte, dass ich bei
jeder Änderung drei Stellen synchron halte (sw.js, index.html ?v=,
manifest). Eddy hat klargestellt dass das nicht akzeptabel ist.
Fix nach KB #201 Pattern (referenz: dolibarr.stundenzettel v2.2.0):
1. index.html → index.php
PHP berechnet bei jedem Request filemtime() von app.css, app.js,
lib/*.js, manifest.webmanifest. Die mtimes kommen automatisch
beim Deploy (rsync preserviert sie default) und werden als ?v=
an alle Asset-URLs gehängt.
2. sw.js liest Version aus eigener URL-Query:
const SW_VERSION = (new URL(self.location.href)).searchParams.get('v')
const CACHE = 'baustelle-' + SW_VERSION
activate() löscht alle caches die mit 'baustelle-' anfangen aber
nicht der aktuelle sind.
3. Client-Registration mit Auto-Update:
- setInterval 60s reg.update()
- visibilitychange-Listener für Tab-Fokus
- updatefound → SKIP_WAITING postMessage
- controllerchange → einmaliger location.reload
4. SHELL pre-cache enthält nur statische Dateien (index.php, share.html,
icons). CSS/JS werden beim ersten fetch dynamisch gecached — so
gibt es keinen Mix zwischen alten und neuen ?v= Versionen.
5. manifest.webmanifest start_url auf /custom/baustelle/index.php
Ergebnis: Ich deploye → mtime ändert sich → neue URLs → Browser holt
frische Files → SW aktiviert automatisch beim nächsten Tab-Fokus.
Nie wieder manuelles Hochzählen.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
[deploy]