Al cargar un script en una página HTML, debe tener cuidado de no dañar el rendimiento de carga de la página. Dependiendo de dónde y cómo agregue sus scripts a una página HTML, influirá en el tiempo de carga
- La posición importa
- Asíncrono y aplazado
- Comparación de rendimiento
- Bloqueo de análisis
- Bloqueo de renderizado
- domInteractive
- Manteniendo las cosas en orden
- Solo dime la mejor manera
Al cargar un script en una página HTML, debe tener cuidado de no dañar el rendimiento de carga de la página.
Un script se incluye tradicionalmente en la página de esta manera:
<script src="script.js"></script>
siempre que el analizador HTML encuentre esta línea, se realizará una solicitud para recuperar el script y se ejecutará el script.
Una vez que se realiza este proceso, se puede reanudar el análisis y se puede analizar el resto del HTML.
Como puedes imaginar, esta operación puede tener un gran impacto en el tiempo de carga de la página.
Si la secuencia de comandos tarda un poco más en cargarse de lo esperado, por ejemplo, si la red es un poco lenta o si está en un dispositivo móvil y la conexión es un poco descuidada, es probable que el visitante vea una página en blanco hasta que la secuencia de comandos esté lista. cargado y ejecutado.
La posición importa
Cuando aprende HTML por primera vez, se le dice que las etiquetas de secuencia de comandos se encuentran en el<head>
etiqueta:
<html>
<head>
<title>Title</title>
<script src="script.js"></script>
</head>
<body>
...
</body>
</html>
Como le dije antes, cuando el analizador encuentra esta línea, va a buscar el script y lo ejecuta.Entonces, una vez que ha terminado con esta tarea, pasa a analizar el cuerpo.
Esto es malo porque se introducen muchos retrasos. Una solución muy común a este problema es poner elscript
etiqueta en la parte inferior de la página, justo antes del cierre</body>
etiqueta.
Al hacerlo, el script se carga y ejecuta después de que toda la página ya esté analizada y cargada, lo cual es ungran mejorasobre elhead
alternativa.
Esto es lo mejor que puede hacer si necesita admitir navegadores más antiguos que no admiten dos características relativamente recientes de HTML:async
ydefer
.
Asíncrono y aplazado
Tanto async como defer son atributos booleanos. Su uso es similar:
<script async src="script.js"></script>
<script defer src="script.js"></script>
si especifica ambos,async
tiene prioridad en los navegadores modernos, mientras que los navegadores más antiguos que admitendefer
pero noasync
volverá adefer
.
Para obtener información sobre la tabla de soporte, consulte caniuse.com para obtener información asíncrona.https://caniuse.com/#feat=script-asyncy para aplazarhttps://caniuse.com/#feat=script-defer
Estos atributos solo tienen sentido cuando se utiliza el script en elhead
parte de la página, y son inútiles si pones el guión en elbody
pie de página como vimos arriba.
Comparación de rendimiento
Sin aplazamiento o asincrónico, en la cabeza
Así es como una página carga una secuencia de comandos sin aplazar ni asincronar, poner en elhead
parte de la página:
El análisis se detiene hasta que se obtiene y ejecuta el script. Una vez hecho esto, se reanuda el análisis.
Sin aplazamiento o asincrónico, en el cuerpo
Así es como una página carga una secuencia de comandos sin aplazamiento ni asincrónica, colocada al final de labody
etiqueta, justo antes de que se cierre:
El análisis se realiza sin pausas y, cuando finaliza, se recupera y ejecuta el script. El análisis se realiza incluso antes de que se descargue el script, por lo que la página aparece al usuario mucho antes que el ejemplo anterior.
Con async, en la cabeza
Así es como una página carga un script conasync
, Ponlo enhead
etiqueta:
El script se recupera de forma asincrónica y, cuando está listo, el análisis de HTML se detiene para ejecutar el script y luego se reanuda.
Con aplazamiento, en la cabeza
Así es como una página carga un script condefer
, Ponlo enhead
etiqueta:
La secuencia de comandos se obtiene de forma asincrónica y se ejecuta solo después de que se realiza el análisis de HTML.
El análisis finaliza como cuando colocamos el script al final delbody
, pero en general la ejecución del script termina mucho antes, porque el script se ha descargado en paralelo con el análisis de HTML.
Entonces esta es la solución ganadora en términos de velocidad 🏆
Bloqueo de análisis
async
bloquea el análisis de la página mientrasdefer
no.
Bloqueo de renderizado
Ninguno de los dosasync
nidefer
garantizar cualquier cosa sobre el bloqueo de la representación. Esto depende de usted y su secuencia de comandos (por ejemplo, asegurarse de que sus secuencias de comandos se ejecuten después de laonLoad
) evento.
domInteractive
Guiones marcadosdefer
se ejecutan justo después de ladomInteractive
evento, que ocurre después de que el HTML se carga, analiza y elDOMestá construído.
El CSS y las imágenes en este punto aún deben analizarse y cargarse.
Una vez hecho esto, el navegador emitirá eldomComplete
evento, y luegoonLoad
.
domInteractive
es importante porque su sincronización se reconoce como una medida de la velocidad de carga percibida.Ver el MDNpara más.
Manteniendo las cosas en orden
Otro caso prodefer
: guiones marcadosasync
se ejecutan en orden casual, cuando están disponibles. Guiones marcadosdefer
se ejecutan (después de que se completa el análisis) en el orden en el que se definen en el marcado.
Solo dime la mejor manera
Lo mejor que puede hacer para acelerar la carga de su página cuando usa scripts es ponerlos en elhead
y agregue undefer
atribuir a tuscript
etiqueta:
<script defer src="script.js"></script>
Este es el escenario que desencadena el más rápidodomInteractive
evento.
Considerando las ventajas dedefer
, parece una mejor opción queasync
en una variedad de escenarios.
A menos que esté de acuerdo con retrasar el primer renderizado de la página, asegúrese de que cuando se analice la página, el JavaScript que desea ya esté ejecutado.
Descarga mi gratisManual para principiantes de JavaScript
Más tutoriales de navegador:
- Algunos trucos útiles disponibles en HTML5
- Cómo hice que un sitio web basado en CMS funcionara sin conexión
- La guía completa de aplicaciones web progresivas
- La API de Fetch
- La guía Push API
- La API de mensajería de canal
- Tutorial para trabajadores de servicios
- La guía de la API de caché
- La guía de la API de notificaciones
- Sumérjase en IndexedDB
- La API de selectores: querySelector y querySelectorAll
- Cargue JavaScript de forma eficiente con diferir y asincrónico
- El modelo de objetos de documento (DOM)
- La API de almacenamiento web: almacenamiento local y almacenamiento de sesiones
- Descubra cómo funcionan las cookies HTTP
- La API de historia
- El formato de imagen WebP
- XMLHttpRequest (XHR)
- Un tutorial detallado de SVG
- ¿Qué son las URL de datos?
- Hoja de ruta para aprender la plataforma web
- CORS, intercambio de recursos de origen cruzado
- Trabajadores web
- La guía requestAnimationFrame ()
- Que es el Doctype
- Trabajar con la consola de DevTools y la API de la consola
- La API de síntesis de voz
- Cómo esperar el evento DOM Ready en JavaScript simple
- Cómo agregar una clase a un elemento DOM
- Cómo recorrer los elementos DOM de querySelectorAll
- Cómo eliminar una clase de un elemento DOM
- Cómo comprobar si un elemento DOM tiene una clase
- Cómo cambiar un valor de nodo DOM
- Cómo agregar un evento de clic a una lista de elementos DOM devueltos por querySelectorAll
- WebRTC, la API web en tiempo real
- Cómo obtener la posición de desplazamiento de un elemento en JavaScript
- Cómo reemplazar un elemento DOM
- Cómo aceptar solo imágenes en un campo de archivo de entrada
- ¿Por qué utilizar una versión de vista previa de un navegador?
- El objeto Blob
- El objeto de archivo
- El objeto FileReader
- El objeto FileList
- ArrayBuffer
- ArrayBufferView
- El objeto URL
- Matrices escritas
- El objeto DataView
- La API BroadcastChannel
- La API de Streams
- El objeto FormData
- El objeto del navegador
- Cómo utilizar la API de geolocalización
- Cómo utilizar getUserMedia ()
- Cómo utilizar la API de arrastrar y soltar
- Cómo trabajar con el desplazamiento en páginas web
- Manejo de formularios en JavaScript
- Eventos de teclado
- Eventos del mouse
- Toque eventos
- Cómo eliminar a todos los hijos de un elemento DOM
- Cómo crear un atributo HTML usando Vanilla Javascript
- ¿Cómo verificar si una casilla de verificación está marcada usando JavaScript?
- Cómo copiar al portapapeles usando JavaScript
- Cómo deshabilitar un botón usando JavaScript
- Cómo hacer que una página sea editable en el navegador
- Cómo obtener valores de cadena de consulta en JavaScript con URLSearchParams
- Cómo eliminar todo el CSS de una página a la vez
- Cómo utilizar insertAdjectedHTML
- Safari, avisa antes de salir
- Cómo agregar una imagen al DOM usando JavaScript
- Cómo restablecer un formulario
- Cómo utilizar las fuentes de Google