Ich habe ein paar Fragen zu den Attributen async
und defer
zum <script>
Tag, die meines Wissens nur in HTML5-Browsern funktionieren.
Eine meiner Websites enthält zwei externe JavaScript-Dateien, die sich derzeit direkt über dem </body>
Tag befinden. das erste istjquery von Google bezogen und das zweite ist ein lokales externes Skript.
In Bezug auf die Ladegeschwindigkeit der Baustelle
Gibt es einen Vorteil beim Hinzufügen
async
zu den beiden Skripten, die ich am Ende der Seite habe?Wäre es von Vorteil, die
async
Option zu den beiden Skripten hinzuzufügen und sie oben auf der Seite im zu platzieren<head>
?- Würde dies bedeuten, dass sie beim Laden der Seite heruntergeladen werden?
- Ich gehe davon aus, dass dies zu Verzögerungen bei HTML4-Browsern führen würde, aber würde dies das Laden von Seiten für HTML5-Browser beschleunigen?
Verwenden von <script defer src=...
- Würde das Laden der beiden darin enthaltenen Skripte
<head>
mit dem Attributdefer
die gleichen Auswirkungen haben wie die vorherigen Skripte</body>
? - Ich gehe wieder einmal davon aus, dass dies HTML4-Browser verlangsamen würde.
Verwenden von <script async src=...
Wenn ich zwei Skripte mit async
aktiviert habe
- Würden sie gleichzeitig herunterladen?
- Oder einzeln mit dem Rest der Seite?
- Wird die Reihenfolge der Skripte dann zum Problem? Zum Beispiel hängt ein Skript vom anderen ab. Wenn eines schneller heruntergeladen wird, wird das zweite möglicherweise nicht richtig ausgeführt usw.
Schließlich lasse ich die Dinge so, wie sie sind, bis HTML5 häufiger verwendet wird?
javascript
html
Adam
quelle
quelle
async
ist neu (ish), gehört aberdefer
seit IE4 zum IE.defer
wurde in jüngerer Zeit zu anderen Browsern hinzugefügt, aber ältere Versionen dieser Browser hängen viel weniger herum.defer
ist dasselbe wie das Platzieren von Skripten am unteren Rand des HTML-Codes, was seit vielen Jahren üblich ist.Antworten:
Behalten Sie Ihre Skripte direkt vor
</body>
. Async kann unter bestimmten Umständen mit Skripten verwendet werden, die sich dort befinden (siehe Diskussion unten). Das Aufschieben macht für die dort befindlichen Skripte keinen großen Unterschied, da die DOM-Analyse ohnehin schon so gut wie erledigt ist.Hier ist ein Artikel, der den Unterschied zwischen asynchron und verzögert erklärt: http://peter.sh/experiments/asynchronous-and-deferred-javascript-execution-explained/ .
Ihr HTML wird in älteren Browsern schneller angezeigt, wenn Sie die Skripte direkt am Ende des Textes behalten
</body>
. Um die Ladegeschwindigkeit in älteren Browsern beizubehalten, möchten Sie sie nirgendwo anders platzieren.Wenn Ihr zweites Skript vom ersten Skript abhängt (z. B. wenn Ihr zweites Skript die im ersten Skript geladene jQuery verwendet), können Sie sie nicht ohne zusätzlichen Code asynchronisieren, um die Ausführungsreihenfolge zu steuern. Sie können sie jedoch verschieben, da Skripte verschoben werden noch in der richtigen Reihenfolge ausgeführt werden, nur erst nachdem das Dokument analysiert wurde. Wenn Sie diesen Code haben und die Skripte nicht sofort ausgeführt werden müssen, können Sie sie asynchronisieren oder verschieben.
Sie können die Skripte in das
<head>
Tag einfügen und auf setzen.defer
Das Laden der Skripte wird verzögert, bis das DOM analysiert wurde. Dies wird in neuen Browsern, die das Verschieben unterstützen, schnell angezeigt, aber es hilft Ihnen überhaupt nicht in älteren Browsern und es ist nicht wirklich schneller als nur die Skripte direkt davor zu platzieren,</body>
was in allen Browsern funktioniert. Sie können also sehen, warum es am besten ist, sie vorher richtig zu stellen</body>
.Async ist nützlicher, wenn es Ihnen wirklich egal ist, wann das Skript geladen wird und nichts anderes, was vom Benutzer abhängig ist, vom Laden des Skripts abhängt. Das am häufigsten genannte Beispiel für die Verwendung von Async ist ein Analyseskript wie Google Analytics, auf das Sie nicht warten möchten. Es muss nicht bald ausgeführt werden, und es steht für sich allein, sodass nichts anderes davon abhängt.
Normalerweise ist die jQuery-Bibliothek kein guter Kandidat für Async, da andere Skripte davon abhängen und Sie Ereignishandler installieren möchten, damit Ihre Seite auf Benutzerereignisse reagieren kann und Sie möglicherweise einen jQuery-basierten Initialisierungscode ausführen müssen, um den Anfangszustand herzustellen der Seite. Es kann asynchron verwendet werden, aber andere Skripte müssen codiert werden, damit sie erst ausgeführt werden, wenn jQuery geladen ist.
quelle
head
und Einstellen von Skriptendefer
sei nicht schneller als das Einfügen zuvor</body>
, aber nach dem, was ich gelesen habe, ist das falsch. Denken Sie darüber nach - wenn Sie die Skripte einfügen<head>
, werden sie sofort heruntergeladen, wohingegen</body>
alle anderen Elemente zuerst heruntergeladen werden, wenn sie vorher richtig sind .Dieses Bild erklärt das normale Skript-Tag, Async und Defer
Asynchrone Skripte werden ausgeführt, sobald das Skript geladen wird, sodass die Ausführungsreihenfolge nicht garantiert wird (ein Skript, das Sie am Ende angegeben haben, wird möglicherweise vor der ersten Skriptdatei ausgeführt).
Skripts verschieben garantiert die Ausführungsreihenfolge, in der sie auf der Seite angezeigt werden.
Siehe diesen Link: http://www.growingwiththeweb.com/2014/02/async-vs-defer-attributes.html
quelle
async
wird gewinnen. Siehe stackoverflow.com/questions/13821151/…<script>
Tag verwendet wird, ist die Gesamtlänge des Seitenladens um die Zeit länger, die zum Herunterladen der Skriptdatei benötigt wird.HTML5 :
async
,defer
In HTML5 können Sie dem Browser mitteilen, wann Ihr JavaScript-Code ausgeführt werden soll. Es gibt 3 Möglichkeiten:
Ohne
async
oderdefer
führt der Browser Ihr Skript sofort aus, bevor die Elemente unter Ihrem Skript-Tag gerendert werden.Mit
async
(asynchron) lädt der Browser die HTML-Seite weiter und rendert sie, während der Browser das Skript gleichzeitig lädt und ausführt.Mit
defer
führt der Browser Ihr Skript aus, wenn die Analyse der Seite abgeschlossen ist. (Nicht erforderlich, um das Herunterladen aller Bilddateien abzuschließen. Dies ist gut.)quelle
async=""
bevor Vorlagenänderungen überprüft und gespeichert werden.async
- Skripte werden in dem Moment ausgeführt, in dem sie heruntergeladen wurden, ohne Berücksichtigung ihrer Reihenfolge in der HTML-Datei.Beide
async
unddefer
Skripte werden sofort heruntergeladen, ohne den Parser anzuhalten, und beide unterstützen einen optionalenonload
Handler, um die allgemeine Notwendigkeit zu erfüllen, eine vom Skript abhängige Initialisierung durchzuführen.Der Unterschied zwischen
async
unddefer
dreht sich um die Ausführung des Skripts. Jedesasync
Skript wird bei der ersten Gelegenheit ausgeführt, nachdem der Download abgeschlossen ist und bevor das Fenster geladen wird. Dies bedeutet, dassasync
Skripte möglicherweise (und wahrscheinlich) nicht in der Reihenfolge ausgeführt werden, in der sie auf der Seite vorkommen. Während diedefer
Skripte andererseits garantiert in der Reihenfolge ausgeführt werden, in der sie auf der Seite vorkommen. Diese Ausführung beginnt, nachdem die Analyse vollständig abgeschlossen ist, jedoch vor demDOMContentLoaded
Ereignis des Dokuments .Quelle & weitere Details: hier .
quelle
Konnte mit der gleichen Art von Problem konfrontiert und jetzt klar verstanden, wie beide funktionieren werden. Hoffentlich ist dieser Referenzlink hilfreich ...
Async
Wenn Sie das asynchrone Attribut zu Ihrem Skript-Tag hinzufügen, geschieht Folgendes.
Verschieben
Defer ist Async mit einem großen Unterschied sehr ähnlich. Folgendes passiert, wenn ein Browser auf ein Skript mit dem Attribut defer stößt.
Referenz: Unterschied zwischen Async und Defer
quelle
async
unddefer
lädt die Datei während der HTML-Analyse herunter. Beide unterbrechen den Parser nicht.Das Skript mit
async
Attribut wird ausgeführt, sobald es heruntergeladen wurde. Während das Skript mitdefer
Attribut nach Abschluss der DOM-Analyse ausgeführt wird.Die mit geladenen Skripte
async
garantieren keine Bestellung. Während die mitdefer
Attributen geladenen Skripte die Reihenfolge beibehalten, in der sie im DOM angezeigt werden.Verwenden Sie diese Option,
<script async>
wenn das Skript auf nichts angewiesen ist. Wann hängt das Skript von der Verwendung ab?Die beste Lösung wäre das Hinzufügen am unteren Rand des Körpers. Es wird kein Problem mit dem Blockieren oder Rendern geben.
quelle
Ich denke, Jake Archibald hat uns 2013 einige Einblicke gegeben, die dem Thema noch mehr Positivität verleihen könnten:
https://www.html5rocks.com/de/tutorials/speed/script-loading/
Dies ist jedoch möglicherweise nicht der schnellste Weg, um Skripte zu laden:
quelle
Es scheint, dass das Verhalten von Defer und Async zumindest von der Ausführungsphase browserabhängig ist. HINWEIS: Aufschieben gilt nur für externe Skripte. Ich gehe davon aus, dass Async dem gleichen Muster folgt.
In IE 11 und darunter scheint die Reihenfolge wie folgt zu sein:
In Edge, Webkit usw. scheint das asynchrone Attribut entweder ignoriert oder am Ende platziert zu werden:
In neueren Browsern wird das Attribut data-pagespeed-no-defer vor allen anderen externen Skripten ausgeführt. Dies gilt für Skripte, die nicht vom DOM abhängen.
HINWEIS: Verwenden Sie defer, wenn Sie eine explizite Reihenfolge für die Ausführung Ihrer externen Skripte benötigen. Dies weist den Browser an, alle zurückgestellten Skripte in der Reihenfolge ihrer Platzierung in der Datei auszuführen.
ASIDE: Die Größe der externen Javascripts spielte beim Laden eine Rolle ... hatte jedoch keinen Einfluss auf die Ausführungsreihenfolge.
Wenn Sie sich Sorgen über die Leistung Ihrer Skripte machen, sollten Sie eine Minimierung in Betracht ziehen oder sie einfach dynamisch mit einer XMLHttpRequest laden.
quelle
data-pagespeed-no-defer
ist ein Attribut, das vom serverseitigen PageSpeed-Modul verwendet wird . Dasdata-pagespeed-no-defer
Attribut selbst hat in keinem Browser eine Auswirkung.