826 Stimmen

Script Tag - async & defer Skript-Tag - async & defer

Ich habe ein paar Fragen zu den Attributen async & defer für das </code> tag, die meines Wissens nur in HTML5-Browsern funktionieren.</p> <p>Eine meiner Websites hat zwei externe JavaScript-Dateien, die sich derzeit direkt über dem <code></body></code>-Tag befinden; die erste stammt von Google und die zweite ist ein lokales externes Skript.</p> <h2>Zur Seitenladegeschwindigkeit</h2> <ol> <li><p>Gibt es einen Vorteil darin, <code>async</code> zu den beiden Skripten hinzuzufügen, die sich am Ende der Seite befinden?</p> </li> <li><p>Gäbe es einen Vorteil darin, die Option <code>async</code> zu den beiden Skripten hinzuzufügen und sie oben auf der Seite im <code><head></code> zu platzieren?</p> </li> <li><p>Würde das bedeuten, dass sie während des Seitenladens heruntergeladen werden?</p> </li> <li><p>Ich gehe davon aus, dass dies Verzögerungen für HTML4-Browser verursachen würde, aber würde es die Seitenladung für HTML5-Browser beschleunigen?</p> </li> </ol> <h2>Verwendung von <code><script defer src=...</code></h2> <ol> <li>Würde das Laden der beiden Skripte im <code><head></code> mit dem Attribut <code>defer</code> den gleichen Effekt haben wie das Platzieren der Skripte vor dem <code></body></code>?</li> <li>Auch hier gehe ich davon aus, dass dies die HTML4-Browser verlangsamen würde.</li> </ol> <h2>Verwendung von <code><script async src=...</code></h2> <p>Wenn ich zwei Skripte mit <code>async</code> aktiviert habe</p> <ol> <li>Würden sie gleichzeitig heruntergeladen werden?</li> <li>Oder eines nach dem anderen mit dem Rest der Seite?</li> <li>Wird dann die Reihenfolge der Skripte zu einem Problem? Beispielsweise hängt ein Skript vom anderen ab, also wenn eines schneller heruntergeladen wird, könnte das zweite möglicherweise nicht korrekt ausgeführt werden usw.</li> </ol> <p>Sollte ich vielleicht besser alles so lassen, bis HTML5 häufiger verwendet wird?</p></x-turndown>

8 Stimmen

async ist neu(ish), aber defer ist seit IE4 Teil des IE. Defer wurde erst kürzlich für andere Browser hinzugefügt, aber ältere Versionen dieser Browser bleiben oft viel weniger erhalten.

5 Stimmen

Jetzt ist HTML5 sehr beliebt!

6 Stimmen

defer entspricht dem Platzieren von Skripten am Ende des HTML-Dokuments, was seit vielen Jahren üblich ist.

1397voto

Prasanth Bendra Punkte 28775

Dieses Bild erklärt das normale Skript-Tag, async und defer

kein Attribut vs async vs defer

  • Async-Skripts werden sofort ausgeführt, sobald das Skript geladen wird, daher wird die Reihenfolge der Ausführung nicht garantiert (ein Skript, das Sie am Ende eingefügt haben, kann vor der ersten Skriptdatei ausgeführt werden)

  • Defer-Skripte garantieren die Reihenfolge der Ausführung, in der sie auf der Seite erscheinen.

Verweis auf diesen Link: async vs defer attributes - Growing with the web

6 Stimmen

Ich glaube, ein Beispiel mit mehreren Skripten wäre besser gewesen, um ihre Reihenfolge zu verdeutlichen.

7 Stimmen

@writofmandamus Sieht aus, als ob async gewinnen wird. Siehe stackoverflow.com/questions/13821151/…

14 Stimmen

Vielen Dank für die gute Erklärung. Allerdings sind die Bilder nicht maßstabsgetreu. Im Falle des nur </code> Tags ist die Gesamtladezeit der Seite länger, da der Skript-Datei heruntergeladen werden muss.</x-turndown>

479voto

jfriend00 Punkte 632952

Halten Sie Ihre Skripte direkt vor . Async kann in einigen Fällen mit Skripten verwendet werden, die sich dort befinden (siehe unten). Defer macht keinen großen Unterschied für Skripte, die dort platziert sind, weil die DOM-Analyse bereits weitgehend abgeschlossen ist.

Hier ist ein Artikel, der den Unterschied zwischen async und defer erklärt: http://peter.sh/experiments/asynchronous-and-deferred-javascript-execution-explained/.

Ihr HTML wird in älteren Browsern schneller angezeigt, wenn Sie die Skripte am Ende des platzieren. Um die Ladezeit in älteren Browsern zu erhalten, sollten Sie sie nicht woanders platzieren.

Wenn Ihr zweites Skript vom ersten Skript abhängt (z. B. Ihr zweites Skript verwendet das in das erste Skript geladene jQuery), können Sie sie nicht async machen, ohne zusätzlichen Code zur Steuerung der Ausführungsreihenfolge zu verwenden, aber Sie können sie defer machen, da defer-Skripte immer noch in der richtigen Reihenfolge ausgeführt werden, jedoch erst nach dem Parsen des Dokuments. Wenn Sie diesen Code haben und die Skripte nicht sofort ausführen müssen, können Sie sie async oder defer machen.

Sie könnten die Skripte im -Tag platzieren und sie auf defer setzen, und das Laden der Skripte wird so lange verzögert, bis der DOM analysiert wurde, was zu einer schnellen Anzeige der Seite in neuen Browsern führt, die defer unterstützen, was Ihnen in älteren Browsern nicht hilft und in wirklich nicht schneller ist als das Platzieren der Skripte direkt vor , was in allen Browsern funktioniert. Sie sehen also, warum es am besten ist, sie direkt vor zu platzieren.

Async ist nützlicher, wenn es wirklich nicht wichtig ist, wann das Skript geladen wird und nichts anderes, was vom Benutzer abhängt, von dem Laden dieses Skripts abhängt. Das am häufigsten genannte Beispiel für die Verwendung von async ist ein Analyse-Skript wie Google Analytics, für das nichts warten soll und das nicht sofort ausgeführt werden soll und das alleine steht, sodass nichts davon abhängt.

Normalerweise ist die jQuery-Bibliothek kein guter Kandidat für async, da andere Skripte von ihr abhängen und Sie Ereignishandler installieren möchten, damit Ihre Seite auf Benutzerereignisse reagieren kann, und Sie möglicherweise etwas auf jQuery basierenden Initialisierungscode ausführen müssen, um den anfänglichen Zustand der Seite festzulegen. Es kann async verwendet werden, aber andere Skripte müssen so codiert werden, dass sie erst ausgeführt werden, wenn jQuery geladen ist.

0 Stimmen

Und was ist, wenn ich nur ein großes Minifizierungsskript in Auftrag habe?

0 Stimmen

@IdanShechter, das ist schlecht für den Zwischenspeicher.

11 Stimmen

Defer sollte sie immer noch in der Reihenfolge ausführen, aber vor dom-contentloaded ausführen. Heißt das nicht, dass es schneller wäre, sie im Head zu platzieren, da sie bereits heruntergeladen werden können, bevor der Body-HTML analysiert wird?

264voto

Dinesh Punkte 2556

HTML5: async, defer

In HTML5 kannst du dem Browser sagen, wann er deinen JavaScript-Code ausführen soll. Es gibt 3 Möglichkeiten:

 // 1

 // 2

 // 3
  1. Ohne async oder defer wird der Browser dein Skript sofort ausführen, bevor er die Elemente rendert, die unterhalb deines Skript-Tags stehen.

  2. Mit async (asynchron) lädt der Browser die HTML-Seite weiter und rendert sie, während er das Skript gleichzeitig lädt und ausführt.

  3. Mit defer wird der Browser dein Skript ausführen, wenn die Seite fertig geparst ist. (Das heißt nicht notwendigerweise, dass alle Bilddateien fertig heruntergeladen sind. Das ist gut.)

0 Stimmen

Eine blogger.com Vorlage erforderte async="", um die Vorlageänderungen zu validieren und speichern.

2 Stimmen

Hinweis: Es besteht keine Garantie dafür, dass Skripte in der Reihenfolge ausgeführt werden, in der sie mit Async angegeben werden. "Wenn Ihr zweites Skript also von Ihrem ersten Skript abhängt, vermeiden Sie Async."

7 Stimmen

async - Skripte werden sofort ausgeführt, sobald sie heruntergeladen wurden, ohne Rücksicht auf ihre Reihenfolge in der HTML-Datei.

48voto

Zameer Khan Punkte 1086

Sowohl async als auch defer Skripte beginnen sofort mit dem Herunterladen, ohne den Parser zu unterbrechen, und unterstützen beide einen optionalen onload Handler, um das häufige Bedürfnis nach Initialisierung zu erfüllen, das vom Skript abhängt.

Der Unterschied zwischen async und defer liegt darin, wann das Skript ausgeführt wird. Jedes async Skript wird bei erster Gelegenheit nach dem Abschluss des Downloads und vor dem Laden des Fensters ausgeführt. Dies bedeutet, dass es möglich (und wahrscheinlich) ist, dass async Skripte nicht in der Reihenfolge ausgeführt werden, in der sie auf der Seite erscheinen. Im Gegensatz dazu werden die defer Skripte garantiert in der Reihenfolge ausgeführt, in der sie auf der Seite erscheinen. Diese Ausführung beginnt, nachdem das Parsen vollständig abgeschlossen ist, aber vor dem DOMContentLoaded-Ereignis des Dokuments.

Quelle & weitere Details: hier.

0 Stimmen

Ich bin tatsächlich erstaunt, dass in keiner anderen Antwort bisher die Reihenfolge von DOMContentLoaded erwähnt wurde... Das ist äußerst wichtige Information. Erstaunlicherweise wird dies auch nicht auf der Seite zum Skript-Tag erwähnt, aber hier: developer.mozilla.org/de/docs/Web/API/Document/…

0 Stimmen

...wenn sich jemand fragt, warum, liegt es daran, dass DOMContentLoaded !== jQuery.ready(), aka es wird nur einmalig ausgelöst. Daher würde es mit defer nicht funktionieren, aber defer ist garantiert früher, also funktioniert es nicht :-)

41voto

kamesh Punkte 2275

Faced same kind of problem and now clearly understood how both will works.Hope this reference link will be helpful...

Async

Wenn Sie dem Skript-Tag das async-Attribut hinzufügen, wird Folgendes passieren.

  1. Parallele Anfragen zum Abrufen der Dateien durchführen.
  2. Setzen Sie das Parsen des Dokuments fort, als ob es nie unterbrochen worden wäre.
  3. Führen Sie die einzelnen Skripte unmittelbar nach dem Herunterladen der Dateien aus.

Defer

Defer ist dem Async sehr ähnlich, mit einem großen Unterschied. Hier ist, was passiert, wenn ein Browser auf ein Skript mit dem Defer-Attribut trifft.

  1. Parallele Anfragen zum Abrufen der einzelnen Dateien durchführen.
  2. Setzen Sie das Parsen des Dokuments fort, als ob es nie unterbrochen worden wäre.
  3. Beenden Sie das Parsen des Dokuments, auch wenn die Skriptdateien heruntergeladen wurden.
  4. Führen Sie jedes Skript in der Reihenfolge aus, in der es im Dokument gefunden wurde.

Referenz :Unterschied zwischen Async und Defer

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X