verschiebt Skripte und Ausführungsreihenfolge in Browsern

10

Ich habe das Defer-Attribut für externe Skripte hinzugefügt, die im HEAD-Bereich eines meiner Projekte verwendet werden. Ich hatte eine Abfrage über die Ausführungsreihenfolge von mehreren verzögerten Skript-Tags.

Unten sind meine Beobachtungen, die uns helfen werden, meine Frage besser zu verstehen:

Gemäß Ссылка

  

Das Defer-Attribut ist vorhanden, und das Skript wird ausgeführt, wenn die Seite die Analyse beendet hat

Das Defer-Attribut funktioniert. Aber ich bin zweifelhaft in Bezug auf die Reihenfolge der Ausführung. Es sieht so aus, als wäre es bei FF und Chrome anders.

Laut meinem Projekt:

%Vor%

Hier ist deps.js eine riesige Datei von etwa 120kb (gezippt), während script1-3 eine normale Größe von 20-50kb (gezippt) hat.

Bei Firefox wird die Ausführung des verzögerten Skripts in der Reihenfolge des Auftretens gestartet, aber nicht in der gleichen Reihenfolge. In Chrom wird die Ausführung des nächsten Skripts nicht gestartet, wenn das vorherige Skript die Ausführung nicht beendet hat. Es sieht so aus, als ob Chrome Sinn macht.

Um die Ausführungsreihenfolge zu testen, hatte ich console.log in die erste und letzte Zeile jedes Skripts eingefügt, z. in deps.js

%Vor%

Unter der Konsolenausgabe von Firefox:

%Vor%

Unter der Konsolenausgabe in Chrome:

%Vor%

Das Verhalten bei FF ist jedoch nicht immer so, wie oben gezeigt. Manchmal funktioniert es wie Chrome. Es sieht wie ein Problem aus, das nur Firefox ist. Oder möglicherweise ist es, weil die Datei deps.js schwer und minimiert ist und Zeit zum Rendern benötigt.

Kann mir jemand von ähnlichen Erfahrungen mit Defer helfen? Bitte lassen Sie mich wissen, wenn weitere Informationen benötigt werden.

PS: Andere Lösungen wie Verschieben der Skripte am Ende der Seite ist nicht etwas, was ich in diesem Moment sehe.

    
Bijoy Anupam 05.09.2015, 12:54
quelle

2 Antworten

4

HTML5.0-Spezifikation sagt das:

  

Wenn das Element ein src-Attribut hat und das Element ein defer-Attribut hat und das Element als "parser-inserted" gekennzeichnet wurde und das Element kein async-Attribut aufweist

     

Das Element muss am Ende der Liste von Skripten hinzugefügt werden, die ausgeführt werden, wenn das Dokument die Analyse beendet hat, die mit dem Dokument des Parsers verknüpft ist, der das Element erstellt hat.

     

Die Aufgabe, die die Netzwerkaufgabenquelle in die Aufgabenwarteschlange stellt, sobald der Abrufalgorithmus abgeschlossen ist, muss das Flag "Bereit für Parser ausgeführt" des Elements setzen. Der Parser wird das Skript ausführen.

Es heißt also, dass es die Ausführung des Skripts solange verzögert, bis das zugehörige Document geparst ist, und es sagt, dass es in die Liste geschoben wurde. Die Reihenfolge der Liste sollte also so sein, wie die Skript-Reihenfolge syntaktisch eingefügt wird.

Aber der zweite Teil beunruhigt mich. Es besagt grundsätzlich, dass es nur zur Ausführung markiert wird, bis der Netzwerk-Task das Herunterladen des Skripts beendet hat. Dann ... "wird Parser das Skript ausführen".

Was ich in der Spezifikation nicht finden konnte, ist der Fall, der die Skriptausführung nach dem Parsen des Dokuments abdeckt. Führt es weiterhin Skripts in der Listenreihenfolge aus, wenn sie "bereit sind, von einem Parser ausgeführt zu werden"? Oder wird es warten, bis alle Skripte in der Liste "bereit sind, Parser ausgeführt zu werden", dann führe sie aus.

Spezifikation (Schritt 15): Ссылка

    
MinusFour 05.09.2015 13:34
quelle
0

Ich würde sagen, es ist nicht wirklich möglich, es sei denn, das Protokoll "Ausführungsende" wird in einer anderen Ereignisschleife als das Protokoll "Ausführungsstart" ausgeführt.

Können Sie uns dafür sorgen? Wie sonst wird es bedeuten, dass Firefix hier einige Multithreading durchführt, und wie wir wissen, gibt es keine Unterstützung in JS dafür.

    
Mariusz Nowak 09.11.2016 09:55
quelle

Tags und Links