Tengo un par de preguntas sobre los atributos async
y defer
la <script>
etiqueta que, a mi entender, solo funcionan en los navegadores HTML5.
Uno de mis sitios tiene dos archivos JavaScript externos que actualmente se encuentran justo encima de la </body>
etiqueta; el primero esjquery proviene de google y el segundo es un script externo local.
Con respecto a la velocidad de carga del sitio
¿Hay alguna ventaja en agregar
async
a los dos scripts que tengo al final de la página?¿Sería ventajoso agregar la
async
opción a los dos scripts y colocarlos en la parte superior de la página en el<head>
?- ¿Significaría esto que se descargan cuando se carga la página?
- Supongo que esto causaría retrasos en los navegadores HTML4, pero ¿aceleraría la carga de la página para los navegadores HTML5?
Utilizando <script defer src=...
- ¿Cargar los dos scripts dentro
<head>
con el atributodefer
afectaría lo mismo que tener los scripts antes</body>
? - Una vez más, supongo que esto ralentizaría los navegadores HTML4.
Utilizando <script async src=...
Si tengo dos scripts con async
habilitado
- ¿Se descargarían al mismo tiempo?
- ¿O uno a la vez con el resto de la página?
- ¿El orden de los scripts se convierte en un problema? Por ejemplo, un script depende del otro, por lo que si uno se descarga más rápido, el segundo podría no ejecutarse correctamente, etc.
Finalmente, ¿es mejor dejar las cosas como están hasta que HTML5 se use más comúnmente?
javascript
html
Adán
fuente
fuente
async
es nuevo (ish), perodefer
ha sido parte de IE desde IE4.defer
se agregó a otros navegadores mucho más recientemente, pero las versiones anteriores de esos navegadores tienden a quedarse mucho menos.defer
es lo mismo que colocar scripts en la parte inferior del HTML, que ha sido común durante muchos años.Respuestas:
Mantenga sus guiones justo antes
</body>
. Async se puede usar con scripts ubicados allí en algunas circunstancias (vea la discusión a continuación). Aplazar no hará una gran diferencia para los scripts ubicados allí porque el trabajo de análisis DOM ya se ha hecho de todos modos.Aquí hay un artículo que explica la diferencia entre asíncrono y diferir: http://peter.sh/experiments/asynchronous-and-deferred-javascript-execution-explained/ .
Su HTML se mostrará más rápido en navegadores antiguos si mantiene las secuencias de comandos al final del cuerpo justo antes
</body>
. Por lo tanto, para preservar la velocidad de carga en los navegadores más antiguos, no desea colocarlos en ningún otro lugar.Si su segunda secuencia de comandos depende de la primera secuencia de comandos (por ejemplo, su segunda secuencia de comandos usa el jQuery cargado en la primera secuencia de comandos), entonces no puede hacerlos asíncronos sin un código adicional para controlar el orden de ejecución, pero puede hacerlos diferir porque diferirán las secuencias de comandos aún se ejecutará en orden, solo hasta que se haya analizado el documento. Si tiene ese código y no necesita que los scripts se ejecuten de inmediato, puede hacerlos asíncronos o diferirlos.
Puede colocar las secuencias de comandos en la
<head>
etiqueta y configurarlas,defer
y la carga de las secuencias de comandos se diferirá hasta que se haya analizado el DOM y se obtenga una visualización rápida de la página en los nuevos navegadores que admiten diferir, pero no lo ayudará en absoluto en navegadores antiguos y no es realmente más rápido que simplemente poner los scripts justo antes, lo</body>
que funciona en todos los navegadores. Entonces, puedes ver por qué es mejor ponerlos justo antes</body>
.Async es más útil cuando realmente no te importa cuando se carga el script y nada más que depende del usuario depende de la carga de ese script. El ejemplo más citado para usar async es un script de análisis como Google Analytics que no desea que espere nada y no es urgente ejecutarlo pronto y está solo, por lo que nada más depende de ello.
Por lo general, la biblioteca jQuery no es un buen candidato para la sincronización porque otros scripts dependen de ella y desea instalar controladores de eventos para que su página pueda comenzar a responder a los eventos del usuario y es posible que deba ejecutar un código de inicialización basado en jQuery para establecer el estado inicial de la página. Se puede usar de forma asíncrona, pero habrá que codificar otros scripts para que no se ejecuten hasta que se cargue jQuery.
fuente
head
y configurarlosdefer
no será más rápido que ponerlos antes</body>
, pero por lo que he leído, eso es incorrecto. Piénselo: si coloca los scripts<head>
, comenzarán a descargarse inmediatamente, mientras que si son correctos antes</body>
, todos los demás elementos se descargarán primero.Esta imagen explica la etiqueta de script normal, asíncrono y aplazar
Las secuencias de comandos asíncronas se ejecutan tan pronto como se carga la secuencia de comandos, por lo que no garantiza el orden de ejecución (una secuencia de comandos que incluyó al final puede ejecutarse antes del primer archivo de secuencia de comandos)
Aplazar scripts garantiza el orden de ejecución en el que aparecen en la página.
Ref. Este enlace: http://www.growingwiththeweb.com/2014/02/async-vs-defer-attributes.html
fuente
async
que ganará. Ver stackoverflow.com/questions/13821151/…<script>
etiqueta, la longitud total de la carga de la página es mayor por el tiempo que lleva descargar el archivo de script.HTML5:
async
,defer
En HTML5, puede decirle al navegador cuándo ejecutar su código JavaScript. Hay 3 posibilidades:
Sin
async
odefer
, el navegador ejecutará su secuencia de comandos inmediatamente, antes de representar los elementos que están debajo de su etiqueta de secuencia de comandos.Con
async
(asíncrono), el navegador continuará cargando la página HTML y la procesará mientras el navegador carga y ejecuta el script al mismo tiempo.Con
defer
, el navegador ejecutará su script cuando la página termine de analizarse. (no es necesario terminar de descargar todos los archivos de imagen. Esto es bueno).fuente
async=""
antes de validar y guardar los cambios de plantilla.async
- Las secuencias de comandos se ejecutan en el momento en que se han descargado, sin tener en cuenta su orden en el archivo HTML.Ambos
async
y losdefer
scripts comienzan a descargarse inmediatamente sin pausar el analizador y ambos admiten una opciónonload
controlador para abordar la necesidad común de realizar la inicialización que depende del script.La diferencia entre
async
y sedefer
centra alrededor cuando se ejecuta el script. Cadaasync
secuencia de comandos se ejecuta en la primera oportunidad después de que finaliza la descarga y antes del evento de carga de la ventana. Esto significa que es posible (y probable) que losasync
scripts no se ejecuten en el orden en que aparecen en la página. Mientras que losdefer
scripts, por otro lado, están garantizados para ejecutarse en el orden en que aparecen en la página. Esa ejecución comienza después de que el análisis se haya completado por completo, pero antes delDOMContentLoaded
evento del documento .Fuente y más detalles: aquí .
fuente
Enfrenté el mismo tipo de problema y ahora entendí claramente cómo funcionarán ambos. Espero que este enlace de referencia sea útil ...
Asíncrono
Cuando agrega el atributo asíncrono a su etiqueta de script, sucederá lo siguiente.
Aplazar
El aplazamiento es muy similar al asíncrono con una diferencia importante. Esto es lo que sucede cuando un navegador encuentra un script con el atributo de aplazamiento.
Referencia: Diferencia entre Async y Defer
fuente
async
ydefer
descargará el archivo durante el análisis HTML. Ambos no interrumpirán el analizador.El script con
async
atributo se ejecutará una vez que se haya descargado. Mientras que el script condefer
atributo se ejecutará después de completar el análisis DOM.Los scripts cargados con
async
no garantizan ningún orden. Mientras que los scripts cargados condefer
atributo mantienen el orden en que aparecen en el DOM.Úselo
<script async>
cuando el script no se base en nada. cuando la secuencia de comandos depende de su uso.La mejor solución sería agregar la parte inferior del cuerpo. No habrá problemas con el bloqueo o el renderizado.
fuente
Creo que Jake Archibald nos presentó algunas ideas en 2013 que podrían agregar aún más positividad al tema:
https://www.html5rocks.com/en/tutorials/speed/script-loading/
Aún así, esta podría no ser la forma más rápida de cargar scripts:
fuente
Parece que el comportamiento de diferir y asincrónico depende del navegador, al menos en la fase de ejecución. NOTA: diferir solo se aplica a scripts externos. Supongo que async sigue el mismo patrón.
En IE 11 y versiones posteriores, el orden parece ser así:
En Edge, Webkit, etc., el atributo asíncrono parece ignorarse o colocarse al final:
En los navegadores más nuevos, el atributo data-pagespeed-no-defer se ejecuta antes que cualquier otro script externo. Esto es para scripts que no dependen del DOM.
NOTA: Use aplazar cuando necesite un orden explícito de ejecución de sus scripts externos. Esto le dice al navegador que ejecute todos los scripts diferidos en orden de ubicación en el archivo.
A UN LADO: El tamaño de los javascripts externos importó al cargar ... pero no tuvo ningún efecto en el orden de ejecución.
Si le preocupa el rendimiento de sus scripts, es posible que desee considerar la minificación o simplemente cargarlos dinámicamente con un XMLHttpRequest.
fuente
data-pagespeed-no-defer
es un atributo utilizado por el módulo PageSpeed del lado del servidor . El atributo por sí mismo no tiene ningún efecto en ningún navegador.data-pagespeed-no-defer