J'ai quelques questions sur les attributs async
et defer
la <script>
balise qui, à ma connaissance, ne fonctionnent que dans les navigateurs HTML5.
Un de mes sites a deux fichiers JavaScript externes qui se trouvent actuellement juste au-dessus de la </body>
balise; le premier estjquery provenant de google et le second est un script externe local.
En ce qui concerne la vitesse de chargement du site
Y a-t-il un avantage à ajouter
async
aux deux scripts que j'ai en bas de la page?Y aurait-il un avantage à ajouter l'
async
option aux deux scripts et à les placer en haut de la page dans le<head>
?- Cela signifierait-il qu'ils téléchargent au fur et à mesure que la page se charge?
- Je suppose que cela entraînerait des retards pour les navigateurs HTML4, mais cela accélérerait-il le chargement des pages pour les navigateurs HTML5?
En utilisant <script defer src=...
- Le chargement des deux scripts à l'intérieur
<head>
avec l'attribut aurait-ildefer
le même effet que d'avoir les scripts avant</body>
? - Encore une fois, je suppose que cela ralentirait les navigateurs HTML4.
En utilisant <script async src=...
Si j'ai deux scripts avec async
activé
- Voudraient-ils télécharger en même temps?
- Ou un à la fois avec le reste de la page?
- L'ordre des scripts devient-il alors un problème? Par exemple, un script dépend de l'autre, donc si un téléchargement est plus rapide, le second peut ne pas s'exécuter correctement, etc.
Enfin, est-il préférable de laisser les choses telles qu'elles sont jusqu'à ce que HTML5 soit plus couramment utilisé?
javascript
html
Adam
la source
la source
async
est nouveau (ish), maisdefer
fait partie d'IE depuis IE4.defer
a été ajouté à d'autres navigateurs beaucoup plus récemment, mais les anciennes versions de ces navigateurs ont tendance à beaucoup moins traîner.defer
revient à placer des scripts au bas du code HTML, ce qui est courant depuis de nombreuses années.Réponses:
Conservez vos scripts juste avant
</body>
. Async peut être utilisé avec des scripts qui s'y trouvent dans quelques circonstances (voir la discussion ci-dessous). Le report ne fera pas beaucoup de différence pour les scripts qui s'y trouvent, car le travail d'analyse DOM a déjà été fait de toute façon.Voici un article qui explique la différence entre async et defer: http://peter.sh/experiments/asynchronous-and-deferred-javascript-execution-explained/ .
Votre code HTML s'affichera plus rapidement dans les anciens navigateurs si vous conservez les scripts à la fin du corps juste avant
</body>
. Donc, pour conserver la vitesse de chargement dans les anciens navigateurs, vous ne voulez pas les placer ailleurs.Si votre deuxième script dépend du premier script (par exemple, votre deuxième script utilise le jQuery chargé dans le premier script), vous ne pouvez pas les faire asynchroniser sans code supplémentaire pour contrôler l'ordre d'exécution, mais vous pouvez les faire différer car les scripts différés toujours être exécutées dans l'ordre, juste après l'analyse du document. Si vous disposez de ce code et que vous n'avez pas besoin que les scripts s'exécutent immédiatement, vous pouvez les rendre asynchrones ou différés.
Vous pouvez mettre les scripts dans la
<head>
balise et les définirdefer
et le chargement des scripts sera différé jusqu'à ce que le DOM ait été analysé et cela affichera rapidement la page dans de nouveaux navigateurs qui prennent en charge le report, mais cela ne vous aidera pas du tout dans les anciens navigateurs et ce n'est pas vraiment plus rapide que de simplement placer les scripts juste avant</body>
ce qui fonctionne dans tous les navigateurs. Donc, vous pouvez voir pourquoi il est préférable de les mettre juste avant</body>
.Async est plus utile lorsque vous ne vous souciez vraiment pas du chargement du script et rien d'autre qui dépend de l'utilisateur dépend du chargement de ce script. L'exemple le plus souvent cité pour utiliser async est un script d'analyse comme Google Analytics que vous ne voulez rien attendre et qu'il n'est pas urgent de s'exécuter rapidement et il est autonome, donc rien d'autre n'en dépend.
Habituellement, la bibliothèque jQuery n'est pas un bon candidat pour async car d'autres scripts en dépendent et vous souhaitez installer des gestionnaires d'événements afin que votre page puisse commencer à répondre aux événements utilisateur et vous devrez peut-être exécuter du code d'initialisation basé sur jQuery pour établir l'état initial de la page. Il peut être utilisé en mode asynchrone, mais d'autres scripts devront être codés pour ne pas s'exécuter tant que jQuery n'est pas chargé.
la source
head
dedans et les configurerdefer
ne serait pas plus rapide que de les mettre avant</body>
, mais d'après ce que j'ai lu, c'est incorrect. Pensez-y - si vous mettez les scripts dedans<head>
, alors ils commenceront à télécharger immédiatement, alors que s'ils sont juste avant,</body>
alors tous les autres éléments seront téléchargés en premier.Cette image explique la balise de script normale, l'async et le report
Les scripts asynchrones sont exécutés dès que le script est chargé, il ne garantit donc pas l'ordre d'exécution (un script que vous avez inclus à la fin peut s'exécuter avant le premier fichier de script)
Defer les scripts garantit l'ordre d'exécution dans lequel ils apparaissent dans la page.
Ref ce lien: http://www.growingwiththeweb.com/2014/02/async-vs-defer-attributes.html
la source
async
va gagner. Voir stackoverflow.com/questions/13821151/…<script>
balise, la durée totale de chargement de la page est plus longue au moment du téléchargement du fichier de script.HTML5:
async
,defer
En HTML5, vous pouvez indiquer au navigateur quand exécuter votre code JavaScript. Il y a 3 possibilités:
Sans
async
oudefer
, le navigateur exécutera votre script immédiatement, avant de rendre les éléments situés en dessous de votre balise de script.Avec
async
(asynchrone), le navigateur continuera de charger la page HTML et de la rendre pendant que le navigateur charge et exécute le script en même temps.Avec
defer
, le navigateur exécutera votre script lorsque la page aura terminé l'analyse. (pas besoin de terminer le téléchargement de tous les fichiers image. C'est bien.)la source
async=""
avant de valider et d'enregistrer les modifications du modèle.async
- Les scripts sont exécutés dès leur téléchargement, sans tenir compte de leur ordre dans le fichier HTML.Les deux
async
et lesdefer
scripts commencent à se télécharger immédiatement sans interrompre l'analyseur et les deux prennent en charge unonload
gestionnaire facultatif pour répondre au besoin commun d'effectuer l'initialisation qui dépend du script.La différence entre
async
et estdefer
centrée sur l'exécution du script. Chaqueasync
script s'exécute à la première occasion après la fin du téléchargement et avant l'événement de chargement de la fenêtre. Cela signifie qu'il est possible (et probable) que lesasync
scripts ne soient pas exécutés dans l'ordre dans lequel ils se produisent dans la page. Alors que lesdefer
scripts, d'autre part, sont garantis pour être exécutés dans l'ordre où ils se produisent dans la page. Cette exécution commence une fois l'analyse terminée, mais avant l'DOMContentLoaded
événement du document .Source & détails: ici .
la source
Face au même type de problème et maintenant clairement compris comment les deux fonctionneront.J'espère que ce lien de référence sera utile ...
Async
Lorsque vous ajoutez l'attribut async à votre balise de script, les événements suivants se produisent.
Reporter
Defer est très similaire à async avec une différence majeure. Voici ce qui se passe lorsqu'un navigateur rencontre un script avec l'attribut defer.
Référence: Différence entre Async et Defer
la source
async
etdefer
téléchargera le fichier pendant l'analyse HTML. Les deux n'interrompent pas l'analyseur.Le script avec
async
attribut sera exécuté une fois téléchargé. Alors que le script avecdefer
attribut sera exécuté après avoir terminé l'analyse DOM.Les scripts chargés avec
async
ne garantissent aucune commande. Alors que les scripts chargés avec l'defer
attribut conservent l'ordre dans lequel ils apparaissent sur le DOM.À utiliser
<script async>
lorsque le script ne repose sur rien. quand le script dépend, utilisez.La meilleure solution serait d'ajouter le au bas du corps. Il n'y aura aucun problème de blocage ou de rendu.
la source
Je pense que Jake Archibald nous a présenté quelques idées en 2013 qui pourraient ajouter encore plus de positivité au sujet:
https://www.html5rocks.com/en/tutorials/speed/script-loading/
Pourtant, ce n'est peut-être pas le moyen le plus rapide de charger des scripts:
la source
Il semble que le comportement de différer et async dépend du navigateur, au moins sur la phase d'exécution. REMARQUE, le report s'applique uniquement aux scripts externes. Je suppose que l'async suit le même schéma.
Dans IE 11 et versions antérieures, l'ordre semble être le suivant:
Dans Edge, Webkit, etc., l'attribut async semble être ignoré ou placé à la fin:
Dans les navigateurs plus récents, l'attribut data-pagespeed-no-defer s'exécute avant tout autre script externe. C'est pour les scripts qui ne dépendent pas du DOM.
REMARQUE: utilisez defer lorsque vous avez besoin d'un ordre d'exécution explicite de vos scripts externes. Cela indique au navigateur d'exécuter tous les scripts différés par ordre de placement dans le fichier.
HORS: La taille des javascripts externes importait lors du chargement ... mais n'avait aucun effet sur l'ordre d'exécution.
Si vous êtes préoccupé par les performances de vos scripts, vous voudrez peut-être envisager la minification ou simplement les charger dynamiquement avec un XMLHttpRequest.
la source
data-pagespeed-no-defer
est un attribut utilisé par le module PageSpeed côté serveur . L' attribut par lui-même n'a aucun effet sur aucun navigateur.data-pagespeed-no-defer