Stop Javascript und HTML vom Laden Aus dem Cache
Baue ich eine single page javascript app und beim Start der Anwendung verwende ich eine einzige javascript-Datei zu laden, die jeder anderen Datei, die ich brauche auf die schnelle. Wenn ich auf aktualisieren, laut firebug mein HTML-Seite sowie javascript-Seiten geladen werden, die mit einem 304 not Modified-Fehler und mein javascript nicht mehr funktioniert.
Ich verstehe, das ist wegen browser-caching, aber wie kann ich diese vermeiden? Ich lade das erste HTML-Seite mit einem einzelnen script-Aufruf
<script src="js/config.js" type="text/javascript"></script>
dann weiter geladen, der rest dynamisch aus in diesem Skript
window.onload = function () {
var scripts = ['http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.1.min.js', 'js/core.js', 'js/sandbox.js']; //Application scripts
var loaded = 0;
//Callback is executed after all scripts have been loaded.
var callback = function () {
if (loaded + 1 == scripts.length) {
//Create Modules
CORE.loader("js/modules/Login.js", function () {
CORE.createModule('loginForm', Login);
});
//Create HTML bindings.
CORE.createBinding('appContainer', '#Login', 'login.html');
CORE.bindHTML(window.location.hash); //Loads hash based page on startup
} else {
loaded++;
loadScript(scripts[loaded], callback);
}
};
loadScript(scripts[0], callback);
function loadScript(scriptSrc, callback) {
var script = document.createElement('script');
script.type = 'text/javascript';
script.async = true;
script.src = scripts[loaded];
if (script.readyState) {
script.onreadystatechange = function () {
if (script.readyState == 'loaded' || script.readyState == 'complete') {
script.onreadystatechange = null;
callback();
}
};
} else {
script.onload = function () {
callback();
};
}
document.getElementsByTagName('head')[0].appendChild(script);
}
};
Ich weiß, dass Gmail verwendet cookies, um dies zu verhindern. Hat jemand eine Idee, wie man diesen Ansatz? Sollte ich das cookie auf dem server und dann überprüfen Sie es mit JS auf jeder Seite laden/aktualisieren und verwenden Sie so etwas wie Fenster.Lage.refresh (), wenn das cookie sagt mir die Seite aus dem cache geladen?
Ich kann nicht erwarten, dass ein Benutzer der Anwendung zu wissen, nicht zu aktualisieren. Dies ist ein Fehler, der gelöst werden muss, nicht funktioniert, um im browser.
304 Not Modified
ist kein Fehler.Es sollte keine Rolle spielen, dass die JavaScript-Dateien werden nicht erneut angefordert. Sie werden trotzdem geladen. Hören Sie auf die richtige Veranstaltung zu initialisieren Ihrer Seite?
InformationsquelleAutor ryandlf | 2012-03-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Caching ist wichtig für die performance-Gründen. Ich würde empfehlen, übergeben Sie eine Versionsnummer in deinem query-string und mit jedem update erhöht die Versionsnummer. Dies zwingt den browser zum erneuten senden der Anfrage und es wird geladen, aus dem cache, wenn es bereits die gleiche version.
InformationsquelleAutor Ramesh
Erweitern @Ramesh Antwort:
erzwingen ein erneutes laden der js-Datei, anstatt den cache, hier der html:
Das nächste mal, wenn Sie änderungen an dieser Datei nur +1 die
v
. Dies funktioniert auch mit css-Dateien durch die Art und Weise.InformationsquelleAutor Eonasdan
Ich Stimme mit den anderen Antworten. 304 ist nicht ein Fehler, und es gibt viele Gründe, warum dieses Verhalten korrekt ist.
That being said, es ist ein einfacher "hack", die Sie verwenden können. Befestigen Sie einfach eine einzigartige URL-parameter an die JS-Aufruf.
Wieder, dies ist ein hack. Leistung klug, das ist ja schrecklich.
InformationsquelleAutor Steve
Fügen Sie diese in Ihren HTML-KOPF.
304 not Modified ist einfach ein "müssen Sie diese im Cache" - Reaktion, es ist nicht ein Fehler.
InformationsquelleAutor Boris Bachovski
Müssen Sie
script.src = scripts[loaded];
nach hinzufügen deronreadystatechange
/onload
Handler. Ansonsten ist der event wird ausgelöst, bevor die Handler Hinzugefügt werden, da die version aus dem Cache lädt sofort.InformationsquelleAutor user123444555621
Nach dem Kampf mit der cache-Problem seit Monaten versucht, einfach über alles (einschließlich Skripts, die änderungen der URLs mit einem parameter) fand ich einen Beitrag, der erklärt, wie zu tun, dass die Verwendung der IIS.
Dies ist die original-Beitrag, die erwähnt, dass es ist relevant für IIS 7.5 (Windows 7)
https://forums.iis.net/t/959070.aspx?How+tun+Sie+deaktivieren+caching+in+IIS+
Eines der Dinge, die ich vorher versucht, war Zugabe .html und .js in Zwischenspeichern der Ausgabe und überprüfung Zwischenspeicherung Verhindern". Also, wenn es nicht funktioniert nach dem IISRESET, versuchen Sie, dass, obwohl, ich bin mir nicht sicher, ob es tatsächlich erforderlich ist.
EDIT:
Wenn es nicht klappt, noch im IIS gehen Sie zu HTTP-Antwort-Header und fügen Sie neue Aktionen:
Name: cache-control, Value: no-cache
Name: abgelaufen, ist-Wert: 0
InformationsquelleAutor Oranit Dar
Ich würde vorschlagen, Javascript zu verwenden, zum generieren einer zufälligen Zahl mit Math.random multiplizieren und dann Mathe.Boden die Rückkehr der integer. Ich möchte dann fügen Sie diese Zahl, um die URL als variable. Da die Zahl ändert sich bei jedem laden der Seite die Datei sollte niemals zwischengespeichert werden.
InformationsquelleAutor Nicolas Guérinet