La verdadera respuesta es: porque no puedes confiar en diferir.
En concepto, diferir y asíncrono difieren de la siguiente manera:
async permite que el script se descargue en segundo plano sin bloquear. Luego, en el momento en que finaliza la descarga, el procesamiento se bloquea y se ejecuta ese script. El procesamiento se reanuda cuando el script se ha ejecutado.
aplazar hace lo mismo, excepto las afirmaciones para garantizar que los scripts se ejecuten en el orden en que se especificaron en la página, y que se ejecutarán una vez que el documento haya finalizado el análisis. Por lo tanto, algunas secuencias de comandos pueden finalizar la descarga y luego sentarse y esperar a que se descarguen más tarde pero aparecieron antes que ellas.
Desafortunadamente, debido a lo que realmente es una pelea de gatos estándar, la definición de diferir varía de especificación a especificación, e incluso en las especificaciones más recientes no ofrece una garantía útil. Como lo demuestran las respuestas aquí y este problema , los navegadores implementan diferir de manera diferente:
- En ciertas situaciones, algunos navegadores tienen un error que hace que los
defer
scripts se salgan de orden.
- Algunos navegadores retrasan el
DOMContentLoaded
evento hasta después de que los defer
scripts se hayan cargado, y otros no.
- Algunos navegadores obedecen
defer
a <script>
elementos con código en línea y sin un src
atributo, y algunos lo ignoran.
Afortunadamente, la especificación al menos especifica que las anulaciones asincrónicas difieren. Por lo tanto, puede tratar todos los scripts como asíncronos y obtener una amplia gama de compatibilidad con el navegador de esta manera:
<script defer async src="..."></script>
El 98% de los navegadores en uso en todo el mundo y el 99% en los EE. UU. Evitarán el bloqueo con este enfoque.
(Si necesita esperar hasta que el documento haya terminado de analizar, escuche el evento del DOMContentLoaded
evento o use la práctica .ready()
función de jQuery . De todos modos, querrá hacer esto para recurrir con gracia a los navegadores que no se implementan defer
en absoluto).