Wenn ich richtig verstehe, speichert ein Broswor Bilder, JS-Dateien usw. basierend auf dem Dateinamen. Es besteht also die Gefahr, dass der Browser, wenn eine solche Datei aktualisiert wird (auf dem Server), stattdessen die zwischengespeicherte Kopie verwendet.clientseitige Datei-Caching
Eine Umgehung für dieses Problem besteht darin, alle Dateien (als Teil des Builds) umzubenennen, sodass der Dateiname einen MD5-Hash seines Inhalts enthält, z.
foo.js -> foo_AS577688BC87654.js
me.png -> me_32126A88BC3456BB.png
Zusätzlich zu dem Umbenennen der Dateien müssen jedoch alle Verweise auf diese Dateien geändert werden. Zum Beispiel sollte ein Tag wie <img src="me.png"/>
zu <img src="me_32126A88BC3456BB.png"/>
geändert werden.
Offensichtlich kann dies ziemlich kompliziert werden, insbesondere wenn Sie bedenken, dass Verweise auf diese Dateien dynamisch innerhalb des serverseitigen Codes erstellt werden können.
Eine Lösung besteht natürlich darin, die Zwischenspeicherung im Browser (und alle Caches zwischen dem Server und dem Browser) mithilfe von HTTP-Headern vollständig zu deaktivieren. Wenn Sie jedoch kein Caching durchführen, wird dies zu einer Reihe von Problemen führen.
Gibt es eine bessere Lösung?
Danke, Don
Ist das wirklich ein Problem? Moderne Browser überprüfen mindestens einmal pro Sitzung, wenn nicht alle Seiten aktualisiert werden, um zu sehen, ob ein Bild oder eine js-Datei oder eine andere referenzierte Datei durch Hinzufügen eines if-modified-since-Headers in ihrer Anfrage aktualisiert wird. Wenn die Datei nicht geändert wird, gibt der Webserver 304 zurück und der Browser verwendet die zwischengespeicherte Datei. – GrandmasterB
Ich habe einen Fall bemerkt, bei dem Safari den Cache nicht aktualisiert hat, obwohl der Benutzer F5 verwendet hat. Leider habe ich keine gründliche Überprüfung vorgenommen, da es über das Telefon lief und nur der Client es zu dieser Zeit ansah, also ließ ich den Benutzer seinen Browser-Cache leeren und dann griff Safari zur neuen Version. –
* basierend auf dem Dateinamen * - nicht ganz, siehe ETags: http://en.wikipedia.org/wiki/HTTP_ETag Was Sie tun würden, ist, verwenden Sie Ihren Hash als ETag der Ressource. – Douglas