Analysieren Browser (IE und Firefox) verknüpfte Javascript-Dateien jedes Mal, wenn die Seite aktualisiert wird?
Sie können die Dateien zwischenspeichern, also werden sie wahrscheinlich nicht jedes Mal versuchen, sie herunterzuladen, aber da jede Seite im Wesentlichen separat ist, erwarte ich, dass sie alten Code abreißen und ihn erneut analysieren.
Dies ist ineffizient, obwohl vollkommen verständlich, aber ich frage mich, ob moderne Browser klug genug sind, um den Parsing-Schritt innerhalb von Websites zu vermeiden. Ich denke an Fälle, in denen eine Site eine Javascript-Bibliothek wie ExtJS oder jQuery usw. verwendet.
Antworten:
Dies sind die Details, die ich ausgraben konnte. Zunächst ist anzumerken, dass JavaScript zwar normalerweise als interpretiert und auf einer VM ausgeführt betrachtet wird, dies jedoch bei modernen Interpreten, die dazu neigen, die Quelle direkt in Maschinencode zu kompilieren (mit Ausnahme des IE), nicht wirklich der Fall ist.
Chrome: V8-Motor
V8 verfügt über einen Kompilierungscache. Hiermit wird kompiliertes JavaScript unter Verwendung eines Hash der Quelle für bis zu 5 Garbage Collections gespeichert. Dies bedeutet, dass zwei identische Teile des Quellcodes einen Cache-Eintrag im Speicher gemeinsam nutzen, unabhängig davon, wie sie enthalten waren. Dieser Cache wird nicht gelöscht, wenn Seiten neu geladen werden.
Quelle
Update - 19/03/2015
Das Chrome-Team hat Details zu seinen neuen Techniken für das Streaming und Caching von JavaScript veröffentlicht .
Oper: Carakan-Motor
Daher wird JavaScript beim erneuten Laden von Seiten zwischengespeichert. Zwei Anforderungen an dasselbe Skript führen nicht zu einer Neukompilierung.
Quelle
Firefox: SpiderMonkey Engine
SpiderMonkey verwendet
Nanojit
als natives Backend einen JIT-Compiler. Der Prozess des Kompilierens des Maschinencodes ist hier zu sehen . Kurz gesagt, es scheint , Skripte beim Laden neu zu kompilieren. Wenn wir uns jedoch die Interna von genauer ansehen,Nanojit
sehen wir, dass der übergeordnete Monitorjstracer
, der zum Verfolgen der Kompilierung verwendet wird, während der Kompilierung drei Phasen durchlaufen kann und folgende Vorteile bietetNanojit
:Dies bedeutet, dass für
hot
Codefragmente der native Code zwischengespeichert wird. Dies bedeutet, dass dies nicht neu kompiliert werden muss. Es wird nicht klargestellt, dass diese nativen Hash-Abschnitte zwischen den Seitenaktualisierungen beibehalten werden. Aber ich würde annehmen, dass sie es sind. Wenn jemand Belege dafür finden kann, dann ausgezeichnet.EDIT : Es wurde darauf hingewiesen, dass Mozilla-Entwickler Boris Zbarsky erklärt hat, dass Gecko kompilierte Skripte noch nicht zwischenspeichert . Entnommen aus dieser SO-Antwort .
Safari: JavaScriptCore / SquirelFish Engine
Ich denke, dass die beste Antwort für diese Implementierung bereits von jemand anderem gegeben wurde .
Dies wurde von Maciej Stachowiak , dem Hauptentwickler von Safari, geschrieben. Ich denke, wir können das als wahr ansehen.
Ich konnte keine andere Informationen finden , aber Sie können mehr über die Verbesserungen in der Geschwindigkeit der neuesten lesen
SquirrelFish Extreme
Motor hier , sehen Sie den Quellcode hier , wenn Sie etwas Zeit mitbringen.IE: Chakra-Motor
In diesem Feld gibt es keine aktuellen Informationen zur JavaScript Engine (Chakra) von IE9. Wenn jemand etwas weiß, bitte kommentieren.
Dies ist ziemlich inoffiziell, aber für die älteren Engine-Implementierungen des IE gibt Eric Lippert ( ein MS-Entwickler von JScript ) in einer Blog-Antwort hier Folgendes an :
Dies deutet darauf hin, dass der Bytecode in keiner Weise bestehen bleibt und der Bytecode daher nicht zwischengespeichert wird.
quelle
Opera macht es, wie in der anderen Antwort erwähnt. ( Quelle )
Firefox (SpiderMonkey-Engine) speichert keinen Bytecode zwischen. ( Quelle )
WebKit (Safari, Konqueror) speichert keinen Bytecode zwischen. ( Quelle )
Ich bin mir nicht sicher über IE [6/7/8] oder V8 (Chrome). Ich denke, IE führt möglicherweise eine Art Caching durch, während V8 dies möglicherweise nicht tut. IE ist eine geschlossene Quelle, daher bin ich mir nicht sicher, aber in V8 ist es möglicherweise nicht sinnvoll, "kompilierten" Code zwischenzuspeichern, da sie direkt in Maschinencode kompiliert werden.
quelle
Soweit mir bekannt ist, speichert nur Opera das analysierte JavaScript zwischen. Siehe den Abschnitt "Zwischengespeicherte kompilierte Programme" hier .
quelle
Es ist nichts wert, dass Google Dart dieses Problem explizit über "Snapshots" angeht. Ziel ist es, die Initialisierung und Ladezeit durch Laden der vorbereiteten Version des Codes zu beschleunigen.
InfoQ hat eine gute Beschreibung unter http://www.infoq.com/articles/google-dart
quelle
Ich denke, dass die richtige Antwort "nicht immer" wäre. Soweit ich weiß, spielen sowohl der Browser als auch der Server eine Rolle bei der Bestimmung, was zwischengespeichert wird. Wenn Sie wirklich jedes Mal Dateien neu laden müssen, sollten Sie dies meiner Meinung nach (z. B.) in Apache konfigurieren können. Natürlich könnte der Browser des Benutzers so konfiguriert werden, dass diese Einstellung ignoriert wird, aber das ist wahrscheinlich unwahrscheinlich.
Daher würde ich mir vorstellen, dass in den meisten praktischen Fällen die Javascript-Dateien selbst zwischengespeichert werden, aber jedes Mal, wenn die Seite geladen wird, dynamisch neu interpretiert werden.
quelle
Der Browser nutzt definitiv das Caching, aber ja, die Browser analysieren das JavaScript jedes Mal, wenn eine Seite aktualisiert wird. Denn wenn eine Seite vom Browser geladen wird, werden zwei Bäume erstellt: 1. Inhaltsbaum und 2. Renderbaum.
Dieser Renderbaum besteht aus Informationen zum visuellen Layout der dom-Elemente. Wenn also eine Seite geladen wird, wird das Javascript analysiert und alle dynamischen Änderungen durch das Javascript mögen das Positionieren des dom-Elements, das Ein- / Ausblenden des Elements und das Hinzufügen / Entfernen des Elements, was dazu führt, dass der Browser den Renderbaum neu erstellt. Aber die modernen Browser wie FF und Chrome gehen etwas anders damit um. Sie haben das Konzept des inkrementellen Renderns. Wenn also wie oben erwähnt dynamische Änderungen durch das js auftreten, werden diese Elemente nur gerendert und neu gestrichen.
quelle