2009-05-31 12 views
4

Ich habe ein Problem bei der Entwicklung meiner Seiten bemerkt, das mich immer gestört hat: Während Firefox (mein allgemeiner "Entwickler" -Browser) CSS und Bilder immer aktualisiert, wenn sie sich auf dem Server ändern, tut dies Internet Explorer nicht immer. Normalerweise muss ich die Seite im IE aktualisieren, bevor der Server nach aktualisierten Versionen der Dinge gefragt wird.Wie kann ich verlangen, dass Browser bestimmte Seitenelemente, wie z. B. CSS-Blätter, immer aktualisieren (z. B. niemals zwischenspeichern)?

Wie ich es verstehe, ist nicht der Browser für jede Anforderung zumindest überprüfen Sie die Zeitstempel auf alle serverseitigen Objekte soll, und dann Client-Seite bei Bedarf aktualisieren? Gibt es eine Möglichkeit, die ich ... nicht erzwingen kann, aber ... den Browser dazu ermuntere, dies für bestimmte Dinge zu tun?

Das Hauptproblem ich hier habe, ist, dass ich einige JavaScript auf meinen Seiten haben, dass eine bestimmte Art und Weise initialisiert wird auf dem CSS-basiert, und vice versa. Wenn einer aktualisiert wird und der andere nicht (sehr häufig im Internet Explorer, wenn beide auf seinen eigenen externen Seiten sind), führt dies zu Verwirrung und gelegentlich zu Spritzergebnissen auf der Seite. Ich kann den "refresh the page" -Tanz alleine für die Entwicklung übernehmen, aber ich möchte meine Benutzer nicht dazu ermutigen, die Seite "neu zu laden", wenn ich einen Skript-Spree auf der Seite mache.

Jeder Rat würde sehr geschätzt werden. Die Seite selbst aktualisiert ohne Probleme (es ist PHP), so schlimmster Fall ich nur die CSS und JavaScript in der Seite spucken konnte selbst, aber das ist wirklich wirklich hässlich und natürlich versuche ich es um jeden Preis zu vermeiden .

+1

Denken Sie daran, dass das Erzwingen der Aktualisierung auf einer Live-Site für Benutzer wie mich, die eine langsame Internetverbindung haben, wirklich nervig sein kann. – grawity

+0

@grawity: Programmieren Sie von einem Boot über eine Satellitenverbindung? – erickson

+0

@erickson Nein, aber 256 kbps ist auch keine Faser. (Dividiere durch zwei, da zwei Computer dieselbe Verbindung verwenden, und subtrahiere 33% von dem, was übrig ist, weil der zweite Computer häufig einen DC++ - Client ausführt.) – grawity

Antwort

10

Es ist eine gute Praxis, um Ihre Website so zu gestalten, dass der Kunde.

externe Ressourcen Stellen bis zu 1 Jahr in der Zukunft ab. Fügen Sie jedem Dateinamen eine Versionsnummer hinzu. Verwenden Sie daher anstelle von "style.css" "". Wenn Sie das CSS des Clients aktualisieren möchten, erhöhen Sie die Versionsnummer.

Durch Erhöhen der Versionsnummer wird der Client gezwungen, die aktualisierte Datei herunterzuladen, da diese als vollständig separate Ressource betrachtet wird.

+0

* facepalm * Warum habe ich nicht daran gedacht? –

+1

Das ist in der Tat der richtige Weg, aber wenn man den CSS-Code bei jeder Aktualisierung entwirft und ändert, sind die anderen Lösungen bequemer, solange der Designer nicht "vergißt", später zu einem angemesseneren Weg zurückzukehren. –

+0

Noch eine Sache ist, ein Skript zu haben, das bei jeder Implementierung einen partiellen Hash (oder vollen Hash) des Inhalts an den Dateinamen anhängt, wie GWT es tut. Sie müssten den referenzierten Dateinamen auch ändern, was nicht zu einfach ist, aber kann getan werden, wenn Sie das Know-how haben. –

3

einen kleinen zufällige Abfrage-String am Ende aller URLs hinzufügen. Es ist hässlich, aber es funktioniert bei der Entwicklung. Zum Beispiel:

<link rel="stylesheet" type="text/css" href="/mycss.css?foo=<?php echo rand(); ?>"/> 

können Sie tun das gleiche für Skripte, Hintergrundbilder usw. (Und vergessen Sie nicht, diese Dinge zu entfernen, wenn Sie Ihre Website live geschaltet wird;))

3

Dies ist nur ein Problem während der Entwicklung, wenn sich die Dateien häufig ändern. Sobald Sie die Website veröffentlicht haben, erhalten Besucher die aktuelle Version, und die Caching-Mechanismen werden mehr oder weniger Ihren Vorstellungen entsprechen.

Anstatt zu ändern, wie meine Websites funktionieren, habe ich einfach die Gewohnheit entwickelt, meinen Cache vor der Aktualisierung während der Entwicklung zu löschen. In Firefox, wie Sie gesagt haben, ist dies normalerweise kein Problem, aber wenn ich wirklich sicher sein muss, verwende ich Umschalt + Strg + Entf, Enter (und meine Clear Private Data Einstellungen lassen nur "Cache" aktiviert.) Und auf IE Da ist die alte Shift + F5.

Natürlich, wie andere schon erwähnt haben, eine zufällige Abfrage-String auf dem flüchtigen Dateien können Sie ein paar Tastatureingaben speichern. Aber verstehen Sie, dass dies nur zu Ihrer eigenen Bequemlichkeit und nicht wirklich notwendig für die Produktionsstätte ist.

+2

+1 Ctrl-F5 die beste Lösung, wenn es nur für dev ist .. – Nick

+0

Es ist notwendig für die Produktion und ist nicht nur ein Dev-Thema. Mir passiert die ganze Zeit, wenn ich etwas zur Produktion dränge. Zum Beispiel: Ich füge ein div meiner Haupt-HTML-Seite hinzu und in meinem CSS sage ich etwas wie div {display: none}. Client-Browser ziehen oft den neuen HTML-Code, verweisen aber auf das zwischengespeicherte CSS, so dass mein DIV angezeigt wird. Ich sehe aus wie ein Dummy, der jedem sagt, dass er seinen Cache löschen muss (Strg + F5), um alle neuen Änderungen zu sehen. – capdragon

+0

Ich stimme @capdragon zu ... Dies ist definitiv kein Problem nur während der Entwicklung. – FastTrack

1

Wenn Sie Apache verwenden, Datei in der .htaccess für die CSS: external JavaScript und CSS holen muss nur einmal

<FilesMatch "mycssfile\.css$"> 
    Header set Cache-Control: "private, pre-check=0, post-check=0, max-age=0" 
    Header set Expires: 0 
    Header set Pragma: no-cache 
</FilesMatch> 
2

Es ist besser, wenn Sie den Zeitstempel für die letzte Änderung als GET-Daten am Ende der Quelle einfügen - auf diese Weise werden Sie sicher sein, dass es keine Cache-Fehler geben wird.

Es ist einfach dumm, den Cache vollständig zu entfernen, da dies zu langsameren Seiten führen wird.

0

Browser speichern Seiten im internen Cache normalerweise gemäß den Anweisungen, die Ihr Server ihnen mitteilt. Nein, sie müssen die Dateien nicht erneut laden, wenn sie aufgrund der letzten Überprüfung nicht mehr verfügbar sind. Natürlich, wenn Sie neu laden, laden sie die Hauptseite explizit neu, aber ihr Verhalten in Bezug auf js und Stile kann sich unterscheiden.

ich mit Safari entwickeln, die Develop hat ->Disable Caches Menü für genau diesen Grund. Ich bin sicher, Firefox hat etwas ähnliches.

0

Ich verwende eine leichte Wendung auf DanHerbert-Methode. Ich neige dazu, die gleichen Namen für die Stylesheets zu verwenden, aber ich befestige eine Versionsnummer in der Abfragezeichenfolge, so dass der Browser die Dateien als unterschiedlich sieht, wenn man die Version in Beschlag nimmt. Die Dinge werden immer noch zwischengespeichert, aber Sie können sie nach Belieben für ungültig erklären.

Es ist ein wenig sauberer als das Ändern von Dateinamen und bietet sich an, eine zentral verwaltete Lösung zu sein, besonders in komplexen Apps mit vielen Skripten und Stylesheets, die aus allen Himmelsrichtungen kommen.

Verwandte Themen