Files
dogfather-universe/tools/workspace-stempel.mjs
T
DogFatherGitandClaude Opus 5 c0ac041122 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]>
2026-08-28 13:03:33 +02:00

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?");