fix(pwa): geaenderte Kopfzeilen erreichen den Browser wieder
Ein Eintrag im Cache ist eine ganze Antwort, mitsamt ihren Kopfzeilen. Weil index.html vorab im Cache lag und von dort auch „/" beantwortete, bekam der Browser dauerhaft die CSP von damals: eine Aenderung an HONEYBAR_ORIGIN kam nie an, denn der Inhalt der Datei aendert sich dabei nicht, und der Vorab-Cache holt nur Geaendertes nach. Sichtbar als Widerspruch, an dem nichts falsch aussah — das Skript laedt den neuen Ursprung, die CSP erlaubt den alten. Navigationen laufen jetzt Netz zuerst, Cache als Rueckfall; index.html bleibt vorab abgelegt, aber nur noch als letzte Reihe (precacheFallback). Dass sie nicht mehr als Verzeichnisseite fuer „/" einspringt, ist der eigentliche Punkt: sonst kaeme die neue Regel nie zum Zug. Nachgemessen: Wechsel des Ursprungs kommt beim zweiten Aufruf an, und offline laden „/", „/admin" und „/s/<token>" weiterhin die Anwendung. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
d6b9d6a1ce
commit
3d9a4832f9
1 file changed
+48
-8
+48
-8
@@ -40,14 +40,54 @@ export default defineConfig({
|
|||||||
VitePWA({
|
VitePWA({
|
||||||
registerType: 'autoUpdate',
|
registerType: 'autoUpdate',
|
||||||
workbox: {
|
workbox: {
|
||||||
// Der Service Worker beantwortet jede Navigation aus dem Cache mit
|
// Der Service Worker beantwortet Navigationen — also den Aufruf der
|
||||||
// index.html – nötig, damit Adressen wie /admin oder /s/<token> auch
|
// Seite selbst — **Netz zuerst, Cache als Rueckfall**.
|
||||||
// offline funktionieren. Ohne diese Ausnahmen erwischt er aber auch
|
//
|
||||||
// Downloads: Ein Klick auf „Download" öffnet eine Navigation zu
|
// Frueher lag index.html im Vorab-Cache und wurde von dort geliefert.
|
||||||
// /api/v1/files/<id>/download, der Worker liefert die Anwendung statt
|
// Das war schnell, hatte aber eine unscheinbare Folge: Ein Eintrag im
|
||||||
// der Datei, und es passiert sichtbar nichts.
|
// Cache ist eine ganze Antwort, **mitsamt ihren Kopfzeilen**. Der
|
||||||
navigateFallback: 'index.html',
|
// Browser bekam also dauerhaft die CSP von damals. Eine Aenderung an
|
||||||
navigateFallbackDenylist: [/^\/api\//, /^\/dav\//, /^\/share\//, /^\/branding\//, /^\/wopi\//],
|
// HONEYBAR_ORIGIN erreichte ihn nie — der Inhalt der Datei aendert sich
|
||||||
|
// ja nicht, und der Vorab-Cache holt nur nach, was sich geaendert hat.
|
||||||
|
// Sichtbar wurde das als Widerspruch, an dem nichts falsch aussah: Das
|
||||||
|
// Skript laedt den neuen Ursprung, die CSP erlaubt den alten.
|
||||||
|
//
|
||||||
|
// precacheFallback haelt dabei, was navigateFallback vorher leistete:
|
||||||
|
// Ist weder Netz noch Cache da, antwortet die vorab abgelegte
|
||||||
|
// index.html — Adressen wie /admin oder /s/<token> funktionieren also
|
||||||
|
// weiterhin offline.
|
||||||
|
//
|
||||||
|
// Ausgenommen sind Downloads und WebDAV: Ein Klick auf „Download"
|
||||||
|
// oeffnet eine Navigation zu /api/v1/files/<id>/download. Faengt der
|
||||||
|
// Worker die ab, liefert er die Anwendung statt der Datei — und es
|
||||||
|
// passiert sichtbar nichts. Sie sollen am Worker vorbeigehen, nicht
|
||||||
|
// von ihm beantwortet werden.
|
||||||
|
// Der Vorab-Cache beantwortet sonst auch den Aufruf von „/" — er
|
||||||
|
// rechnet index.html als Verzeichnisseite an. Genau daran scheiterte
|
||||||
|
// der erste Anlauf: Die Regel unten kam nie zum Zug, weil die Seite
|
||||||
|
// schon vorher aus dem Vorab-Cache beantwortet wurde, mitsamt alter
|
||||||
|
// CSP. Als reiner Rueckfall (precacheFallback) bleibt index.html dort
|
||||||
|
// liegen, nur eben nicht mehr als Antwort auf jede Navigation.
|
||||||
|
directoryIndex: null,
|
||||||
|
// vite-plugin-pwa setzt sonst von sich aus navigateFallback: 'index.html'
|
||||||
|
// — also genau die Vorab-Cache-Antwort, die wir hier los sein wollen.
|
||||||
|
// Die Sperrliste nimmt jede Adresse davon aus; zustaendig ist dann die
|
||||||
|
// Regel darunter.
|
||||||
|
navigateFallbackDenylist: [/./],
|
||||||
|
runtimeCaching: [
|
||||||
|
{
|
||||||
|
urlPattern: ({ request, url }) =>
|
||||||
|
request.mode === 'navigate' &&
|
||||||
|
!/^\/(api|dav|share|branding|wopi)\//.test(url.pathname),
|
||||||
|
handler: 'NetworkFirst',
|
||||||
|
options: {
|
||||||
|
cacheName: 'aether-seiten',
|
||||||
|
// Ohne Grenze haengt der Start am langsamsten Netz.
|
||||||
|
networkTimeoutSeconds: 3,
|
||||||
|
precacheFallback: { fallbackURL: 'index.html' },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
// PDF.js bleibt aussen vor: Betrachter (435 KB), Arbeiter (1,3 MB)
|
// PDF.js bleibt aussen vor: Betrachter (435 KB), Arbeiter (1,3 MB)
|
||||||
// und Standardschriften (800 KB) sind zusammen zweieinhalb Megabyte,
|
// und Standardschriften (800 KB) sind zusammen zweieinhalb Megabyte,
|
||||||
// die nur braucht, wer ein PDF oeffnet. Vorab in den Cache zu legen
|
// die nur braucht, wer ein PDF oeffnet. Vorab in den Cache zu legen
|
||||||
|
|||||||
Reference in new issue
Block a user