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/
Le Saint Graal a un ensemble de scripts téléchargés immédiatement sans bloquer le rendu et exécutés dès que possible dans l'ordre où ils ont été ajoutés. Malheureusement, HTML vous déteste et ne vous laissera pas faire ça.
(...)
La réponse se trouve en fait dans la spécification HTML5, bien qu'elle soit cachée au bas de la section de chargement de script. " L'attribut async IDL contrôle si l'élément s'exécutera de manière asynchrone ou non. Si l'indicateur" force-async "de l'élément est défini, puis, lors de l'obtention, l'attribut async IDL doit renvoyer true, et lors de la définition, le" force-async " le drapeau doit d'abord être désactivé… ".
(...)
Les scripts qui sont créés dynamiquement et ajoutés au document sont asynchrones par défaut , ils ne bloquent pas le rendu et ne s'exécutent pas dès leur téléchargement, ce qui signifie qu'ils peuvent sortir dans le mauvais ordre. Cependant, nous pouvons explicitement les marquer comme non asynchrones:
[
'//other-domain.com/1.js',
'2.js'
].forEach(function(src) {
var script = document.createElement('script');
script.src = src;
script.async = false;
document.head.appendChild(script);
});
Cela donne à nos scripts un mélange de comportements qui ne peut pas être obtenu avec du HTML simple. En n'étant explicitement pas asynchrone, les scripts sont ajoutés à une file d'attente d'exécution, la même file d'attente à laquelle ils sont ajoutés dans notre premier exemple HTML brut. Cependant, en étant créés dynamiquement, ils sont exécutés en dehors de l'analyse de documents, donc le rendu n'est pas bloqué pendant le téléchargement (ne confondez pas le chargement de script non asynchrone avec la synchronisation XHR, ce qui n'est jamais une bonne chose).
Le script ci-dessus doit être inclus en ligne dans le haut des pages, mettre en file d'attente les téléchargements de script dès que possible sans perturber le rendu progressif, et s'exécute dès que possible dans l'ordre que vous avez spécifié. "2.js" est téléchargeable gratuitement avant "1.js", mais il ne sera pas exécuté tant que "1.js" n'aura pas été téléchargé et exécuté avec succès, ou ne le fera pas non plus. Hourra! téléchargement asynchrone mais exécution ordonnée !
Pourtant, ce n'est peut-être pas le moyen le plus rapide de charger des scripts:
(...) Avec l'exemple ci-dessus, le navigateur doit analyser et exécuter un script pour découvrir quels scripts télécharger. Cela cache vos scripts des scanners de préchargement. Les navigateurs utilisent ces scanners pour découvrir des ressources sur les pages que vous visiterez probablement la prochaine fois, ou découvrir des ressources de page pendant que l'analyseur est bloqué par une autre ressource.
Nous pouvons ajouter de la découvrabilité en mettant ceci en tête du document:
<link rel="subresource" href="//other-domain.com/1.js">
<link rel="subresource" href="2.js">
Cela indique au navigateur que la page a besoin de 1.js et 2.js. link [rel = subresource] est similaire à link [rel = prefetch], mais avec une sémantique différente. Malheureusement, il n'est actuellement pris en charge que dans Chrome, et vous devez déclarer les scripts à charger deux fois, une fois via les éléments de lien, puis à nouveau dans votre script.
Correction: à l' origine, j'avais déclaré que ceux-ci avaient été récupérés par le scanner de précharge, ils ne le sont pas, ils sont récupérés par l'analyseur ordinaire. Cependant, le scanner de préchargement pourrait les récupérer, ce n'est pas encore le cas, alors que les scripts inclus par le code exécutable ne peuvent jamais être préchargés. Merci à Yoav Weiss qui m'a corrigé dans les commentaires.
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.