Server: Assets werden nachgefragt statt jedes Mal neu geladen

Auf allem stand no-store -- im Server und noch einmal in preloadAssets().
Der Browser durfte also nichts behalten, und jeder Reload lud die vollen
Assets neu: 3 MB Screenshots, 3,3 MB Mockups, Schriften, Bibliotheken.

Am schlimmsten in uebersicht.html. Die laedt die sechs Projekte als
iframes, und weil keiner etwas behalten durfte, holte sich jeder iframe
dieselben Dateien noch einmal: 38,1 MB in 435 Anfragen.

  uebersicht.html erster Aufruf   38,1 MB  ->  2,2 MB
  uebersicht.html Reload          32,8 MB  ->  1,9 MB
  post6.html Reload                5,4 MB  ->  0,3 MB

Die Absicht hinter no-store war richtig: ein Bild, das unter demselben
Namen ausgetauscht wird, muss sofort ankommen. no-cache leistet das
billiger -- der Browser behaelt seine Kopie, fragt aber vor jeder
Benutzung nach. Nachgeprueft: unveraendert antwortet der Server mit 304
und 0 Bytes, nach einem touch mit 200 und der vollen Datei.

Seite, Stand und Auskuenfte (/bilder, /state) bleiben bei no-store. Die
sind klein und duerfen nie aus einer Kopie kommen.

Die eine Zeile stand in allen sieben Projektdateien.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U7RZ6ZpLD8Dp84Rtt4KHfv
This commit is contained in:
dejanandClaude Opus 5 committed 2026-08-29 16:31:25 +02:00
1 parent e8f5686f30
commit 77734b6da2
9 files changed
+111 -20

No files matched your search

+25 -6
View File
@@ -267,12 +267,31 @@ class Handler(http.server.SimpleHTTPRequestHandler):
self.wfile.write(payload)
def end_headers(self):
# Werkzeug, kein Auslieferungsserver: Assets werden hier laufend
# ausgetauscht, und ein gecachter Screenshot unter gleichem Dateinamen
# kostet mehr Zeit als jeder erneute Ladevorgang.
self.send_header("Cache-Control", "no-store, must-revalidate")
self.send_header("Pragma", "no-cache")
self.send_header("Expires", "0")
# Werkzeug, kein Auslieferungsserver: ein Asset, das unter demselben
# Namen ausgetauscht wird, muss sofort ankommen.
#
# Dafuer stand hier no-store auf allem. Das Ziel war richtig, der
# Preis zu hoch: no-store verbietet dem Browser die Kopie ueberhaupt,
# und damit lud jeder Reload die vollen rund 6 MB neu -- 3 MB
# Screenshots, 3,3 MB Mockups, die Schriften, die Bibliotheken. Am
# Ende wartete man beim Neuladen auf Dateien, die sich seit Wochen
# nicht geaendert hatten.
#
# no-cache leistet dasselbe billiger: der Browser darf die Kopie
# behalten, muss aber vor jeder Benutzung nachfragen. Eine
# ausgetauschte Datei kommt damit genauso sofort an, eine
# unveraenderte kostet ein 304 ohne Rumpf. Geprueft: der Handler
# beantwortet If-Modified-Since bereits mit 304 und 0 Bytes.
#
# Seite, Stand und Auskuenfte bleiben bei no-store. Die sind klein,
# und sie duerfen nie aus einer Kopie kommen.
pfad = urllib.parse.urlparse(self.path).path
if pfad.startswith(("/assets/", "/vendor/", "/animation/")):
self.send_header("Cache-Control", "no-cache")
else:
self.send_header("Cache-Control", "no-store, must-revalidate")
self.send_header("Pragma", "no-cache")
self.send_header("Expires", "0")
super().end_headers()
def log_message(self, fmt, *args):