La vraie réponse est: parce que vous ne pouvez pas faire confiance à différer.
Dans le concept, différer et asynchroniser diffèrent comme suit:
async permet de télécharger le script en arrière-plan sans le bloquer. Ensuite, au moment où il termine le téléchargement, le rendu est bloqué et ce script s'exécute. Le rendu reprend une fois le script exécuté.
reporter fait la même chose, sauf qu'il prétend garantir que les scripts s'exécutent dans l'ordre où ils ont été spécifiés sur la page, et qu'ils seront exécutés une fois l'analyse du document terminée. Ainsi, certains scripts peuvent terminer le téléchargement puis s'asseoir et attendre les scripts téléchargés plus tard mais apparus devant eux.
Malheureusement, en raison de ce qui est vraiment un combat de chats standard, la définition de defer varie selon les spécifications, et même dans les spécifications les plus récentes, n'offre pas de garantie utile. Comme les réponses ici et ce problème le démontrent, les navigateurs implémentent différer différemment:
- Dans certaines situations, certains navigateurs ont un bogue qui provoque le
defer
dysfonctionnement des scripts.
- Certains navigateurs retardent l'
DOMContentLoaded
événement jusqu'à ce que les defer
scripts soient chargés, et d'autres non.
- Certains navigateurs obéissent
defer
à des <script>
éléments avec du code en ligne et sans src
attribut, et certains l'ignorent.
Heureusement, la spécification spécifie au moins que les substitutions asynchrones reportent. Ainsi, vous pouvez traiter tous les scripts comme asynchrones et obtenir une large gamme de support de navigateur comme ceci:
<script defer async src="..."></script>
98% des navigateurs utilisés dans le monde et 99% aux États-Unis éviteront le blocage avec cette approche.
(Si vous devez attendre la fin de l'analyse du document, écoutez l'événement d' DOMContentLoaded
événement ou utilisez la .ready()
fonction pratique de jQuery . Vous voudrez quand même le faire pour vous rabattre gracieusement sur les navigateurs qui ne l'implémentent pas defer
du tout.)