Statische Dateien: JS/CSS revalidieren statt blind cachen

express.static setzte kein Cache-Control, also legte der Browser die
Lebensdauer selbst fest (heuristisch, aus dem Alter der Datei). Folge: nach
einem Deploy lief die Oberflaeche im offenen Tab weiter mit dem alten
chat.js - die frisch ausgelieferten Tabellen wurden dort weiter als
Pipe-Wueste gerendert, obwohl der Server die neue Datei schon hatte.

no-cache heisst nicht "nicht cachen": der Browser behaelt die Datei, fragt
aber per ETag nach, ob sie noch gilt (304, kein erneuter Download).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-14 12:33:07 +02:00
co-authored by Claude Opus 4.8
parent 090228479a
commit 92ade10a37
+10 -1
View File
@@ -135,7 +135,16 @@ app.locals.safeUrl = function (url) {
// Middleware
app.use(express.json({ limit: '2mb' }));
app.use(express.urlencoded({ extended: true, limit: '2mb' }));
app.use(express.static(path.join(__dirname, 'public')));
// Statische Dateien. JS/CSS bekommen "no-cache": der Browser darf sie behalten,
// muss aber jedes Mal per ETag nachfragen, ob sie noch aktuell sind (304, kein
// erneuter Download). Ohne diesen Header setzt der Browser die Lebensdauer selbst
// fest — nach einem Deploy lief die Oberfläche dann noch tagelang mit dem alten
// chat.js weiter, obwohl der Server längst die neue Datei auslieferte.
app.use(express.static(path.join(__dirname, 'public'), {
setHeaders: (res, datei) => {
if (/\.(js|css)$/i.test(datei)) res.setHeader('Cache-Control', 'no-cache');
},
}));
// Allow the browser extension (running on indeed.com) to call the import API.
// Kept narrow: only the extension-facing endpoints need cross-origin access.