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]>
60 lines
2.3 KiB
JavaScript
60 lines
2.3 KiB
JavaScript
/* =====================================================================
|
|
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?");
|