Leeren des Cachespeichers erzwingen

Hallo!

Ich habe folgendes Problem - eine Anwendung welche ich anbiete, hat die meisten JS - Funktionen in eine Datei tools.js ausgelagert. Wenn ich die Software auf dem Server dann mal alle paar Wochen aktualisiere und die Datei tools.js durch eine andere Version ersetzt wird, bekommen es die Computer der User teilweise nicht mit - scheinbar haben sie die ältere Version von „tools.js“ irgendwo im Cachespeicher. Das aber führt zu Fehlern.

Ich muss also nach jedem Update der Software die Nutzer darauf hinweisen, dass ein Update erfolgt ist - und sie bitten in ihrem Browser den Cachespeicher zu löschen. Das finde ich sehr unelegant. Gibt es irgendeine Möglichkeit dem Client-PC zu sagen, dass er die Datei „tools.js“ auf jedem Fall vom Webserver neu laden sollte?..

<script src="tools.js?version=1"></script>

Dann jeweils die Version ändern, wenn sich was anpasst… käme mir jetzt so spontan in den sinn

O.k., aber das würde ja bedeuten diese Verlinkung in gefühlt so 40 Dateien jedes mal zu verändern wenn tools.js um eine neue Funktion erweitert wird oder eine Funktion modifiziert wurde, ist auch etwas umständlich! Wäre aber eine Möglichkeit. Dann kann ich die Datei auch gleich tools_v123.js nennen - muss aber wie gesagt überall die Verlinkung modifizieren.

Jetzt muss ich zugeben, dass ich etwas überrascht bin, ich kenne das Angeben von Werten in der URL nach dem Fragezeichen nur aus php, wo ich den dort übermittelten Wert mit der $_GET[„…“]; Methode lesen kann. Hier verwendest du es aber im Zusammenhang mit einer js-Datei - und wie lese ich im JS den in der URL übermittelten Wert für „version“?..

Du kannst das Cache-Verhalten per HTTP beeinflussen oder den Namen der JS Datei dynamisieren. Für letzteres bietet sich ein Timestamp an, der als Query-Parameter übergeben oder Teil des Dateinamens sein kann. In dem Fall kann die Zeile im Head allerdings nicht mehr statisch ‚tools.js‘ heißen, sondern muss auch dynamisch erzeugt werden. Wenn du dazu Verlinkungen in 40 Dateien ändern müsstest, machst du was falsch. JS Files sollten ausschließlich auf der index.html verlinkt sein, in die sämtliche Views geladen werden.

Na ja… es ist eine komplexe Datenbankanwendung welche auch mit Frames arbeitet (ich weiß… überaltet - aber in diesem Falle erfüllen sie prima ihre Rolle) - und wenn ich in einer Datei welche im Frame 1,2,3, oder 4 geladen wird die Funktionen verfügbar haben will, muss ich die tools.js doch dort neu verlinken, nicht wahr?..

Zumindest funktionieren meine Funktionen nicht, wenn dem nicht so ist.

Hätte dann wahrscheinlich etwas mit cross document messaging zu tun. Aber Erfahrungen habe ich damit keine. Um iFrames mache ich einen großen Bogen.

http://www.meta-tags.de/meta_name_cache_control

Hier habe ich eine Möglichkeit gefunden, die betrifft wohl aber nur .html Seiten, keine .js - Dateien, wenn ich es richtig verstehe.

Aber abgesehen von den meta - tags - wenn der Browser einfach das Erstellungsdatum einer Datei mit dem der Datei im Cache vergleicht, dann wäre es doch eine Möglichkeit, indem ich die Datei tools.js vor dem Update neu erstelle und den Inhalt aus der alten Datei dort neu hineinkopiere, oder?

Das funktioniert leider nicht immer und auch nicht in allen Browsern.
Wenn du mit einem Preprocessor arbeitest, lass es mich wissen, dann es gibt die Möglichkeit das ganze also zum Beispiel tools.02.js abzuspeichern - Ist für’s aktive Development aber eher blöd.

Ich würde dir empfehlen, gerade bei einem Update, einfach eine Versionsnummer zu ändern.
Also manuell austauschen. Nicht gerade schön, aber das einzige, was auf jeden Fall funktioniert.

Wäre mir neu.

Ist aber so.
Bei einigen Kunden funktioniert es einfach nicht… Warum, wieso, weshalb, weiß ich nicht so genau, zumal ich es hier nicht replizieren kann.

Nicht wirklich.
Das liegt eher daran dass die HTML-Dateien selbst auch gecached werden.