Workspace: Versionsstempel gegen Cloudflares 4-Stunden-Cache
Filipe sah die neue Kachel nicht, obwohl sie live war. Ursache gemessen, nicht vermutet: Node liefert : Cache-Control: no-cache (richtig) Cloudflare macht: Cache-Control: max-age=14400 (ueberschreibt es) cf-cache-status: REVALIDATED, Server: cloudflare Cloudflares voreingestellte Browser-Cache-Zeit von vier Stunden setzt sich ueber das no-cache des Servers hinweg -- aber NUR bei JS und CSS. HTML kommt mit DYNAMIC und no-cache immer frisch durch (geprueft an /creator.html und /workspace/). Genau deshalb genuegt ein Stempel in der HTML: neue Seite -> neue Adresse -> Cloudflare kennt sie nicht -> frische Datei. Keine Cloudflare-Einstellung noetig, nichts, worauf ich warten muss. tools/workspace-stempel.mjs setzt den Stempel auf alle 71 Verweise in 13 Dateien. Der Lauf ist wiederholbar: ein vorhandener Stempel wird ersetzt, nicht angehaengt (geprueft). Gehoert ab jetzt vor jeden Deploy, der JS oder CSS im Workspace anfasst. Ich verlasse mich damit nicht mehr aufs Erinnern -- das war der eigentliche Fehler. Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
/* =====================================================================
|
||||
workspace-stempel.mjs — Versionsstempel an die Workspace-Dateien.
|
||||
|
||||
WARUM ES DAS GIBT:
|
||||
Cloudflare speichert JS und CSS vier Stunden im Browser -- es
|
||||
ueberschreibt damit das "no-cache", das der Server korrekt schickt.
|
||||
Nach einem Deploy sah man deshalb bis zu vier Stunden lang die ALTE
|
||||
Oberflaeche, obwohl der Server laengst die neue auslieferte. Genau so
|
||||
ist es passiert: eine neue Kachel war live, aber nicht sichtbar.
|
||||
|
||||
Die HTML-Seiten kommen dagegen immer frisch an (no-cache, DYNAMIC).
|
||||
Deshalb genuegt es, in der HTML einen Stempel an die Adressen zu
|
||||
haengen: Neue Seite -> neue Adresse -> Cloudflare kennt sie nicht ->
|
||||
frische Datei. Ohne Cloudflare-Einstellung, ohne Zutun von aussen.
|
||||
|
||||
Der Stempel ist die Minute des Aufrufs. Er wird bei jedem Lauf neu
|
||||
gesetzt, auch wenn schon einer dasteht.
|
||||
|
||||
AUFRUF: node tools/workspace-stempel.mjs
|
||||
Gehoert vor jeden Deploy, der JS oder CSS im Workspace anfasst.
|
||||
===================================================================== */
|
||||
|
||||
import { readdirSync, readFileSync, writeFileSync } from "node:fs";
|
||||
import { join, dirname } from "node:path";
|
||||
import { fileURLToPath } from "node:url";
|
||||
|
||||
const HIER = dirname(fileURLToPath(import.meta.url));
|
||||
const ORDNER = join(HIER, "..", "workspace");
|
||||
|
||||
const d = new Date();
|
||||
const p = (n) => String(n).padStart(2, "0");
|
||||
const STEMPEL = `${d.getFullYear()}${p(d.getMonth() + 1)}${p(d.getDate())}${p(d.getHours())}${p(d.getMinutes())}`;
|
||||
|
||||
/* Trifft href="assets/..." und src="assets/..." -- mit oder ohne
|
||||
vorhandenen Stempel, damit wiederholte Laeufe nicht anhaengen. */
|
||||
const MUSTER = /(href|src)="(assets\/(?:css|js)\/[A-Za-z0-9._-]+)(?:\?v=\d+)?"/g;
|
||||
|
||||
let dateien = 0;
|
||||
let stellen = 0;
|
||||
|
||||
for (const name of readdirSync(ORDNER)) {
|
||||
if (!name.endsWith(".html")) continue;
|
||||
const pfad = join(ORDNER, name);
|
||||
const alt = readFileSync(pfad, "utf8");
|
||||
let n = 0;
|
||||
const neu = alt.replace(MUSTER, (_, was, datei) => {
|
||||
n += 1;
|
||||
return `${was}="${datei}?v=${STEMPEL}"`;
|
||||
});
|
||||
if (neu !== alt) {
|
||||
writeFileSync(pfad, neu);
|
||||
dateien += 1;
|
||||
stellen += n;
|
||||
console.log(` ${name.padEnd(20)} ${n} Verweise`);
|
||||
}
|
||||
}
|
||||
|
||||
console.log(`\nStempel ${STEMPEL} auf ${stellen} Verweise in ${dateien} Dateien gesetzt.`);
|
||||
if (!dateien) console.log("Nichts geaendert -- stimmt das Muster noch?");
|
||||
Reference in New Issue
Block a user