Concepto general: carga de scripts en HTML
Cuando el navegador encuentra un elemento <script> sin atributos especiales, detiene la construcción del DOM, descarga el script, lo ejecuta inmediatamente y
luego reanuda el parseo de la página. Esto puede bloquear la representación visual y la interactividad. Para evitar este bloqueo y mejorar el rendimiento se introdujeron
los atributos async y defer.
Atributo async
async es un atributo booleano que indica al navegador:
- Descarga el script en paralelo al parseo del HTML.
- Cuando finaliza la descarga, interrumpe inmediatamente el parseo del documento para ejecutarlo.
- No garantiza el orden de ejecución entre varios scripts con
async. Cada uno se ejecuta cuando su descarga termina.
Usos típicos:
- Carga de bibliotecas de terceros independientes (p.ej., estadísticas, publicidad).
- Scripts que no dependen de otros ni son primordiales para la interacción inicial.
Ejemplo básico de async
<!-- Descarga concurrente, ejecución ante descarga completa, sin orden garantizado --> <script src='analytics.js' async></script> <script src='widget.js' async></script> <!-- Si widget.js termina antes, se ejecuta antes, aunque esté más abajo en el HTML -->
Atributo defer
defer también descarga en paralelo, pero difiere de async en que:
- La ejecución se retrasa hasta después de que se ha parseado todo el documento (antes del evento
DOMContentLoaded). - Mantiene el orden de ejecución: los scripts con
deferse ejecutan en el mismo orden en que aparecen en el HTML.
Usos típicos:
- Bibliotecas propias de la página que dependen unas de otras.
- Scripts que manipulan el DOM y necesitan que esté completamente construido.
Ejemplo básico de defer
<!-- Descarga concurrente, ejecución tras parse completo, orden garantizado --> <script src='lib1.js' defer></script> <script src='lib2.js' defer></script> <script src='app.js' defer></script> <!-- Se ejecutarán lib1.js, luego lib2.js, luego app.js, justo antes de DOMContentLoaded -->
Comparativa práctica
| Característica | Síncrono (por defecto) | async | defer |
|---|---|---|---|
| Descarga | Bloqueada, secuencial | En paralelo | En paralelo |
| Ejecución | Inmediata al encontrar | En cuanto termine la descarga | Tras completar el parse, en orden |
| Orden garantizado | Sí (porque es secuencial) | No | Sí |
| Interrumpe parseo | Sí | Sí, en momento de ejecución | No (solo tras parse completo) |
Aspectos avanzados y compatibilidad
-
Ambos atributos solo aplican a scripts con
src. Si se usan en scripts inline, serán ignorados. -
El atributo
defersiempre retrasa la ejecución hastaDOMContentLoaded, por eso es ideal para acceso al DOM. -
async no garantiza
DOMContentLoadedsincronizado con la ejecución de todos los scripts; unDOMContentLoadedpuede dispararse antes de que algún async restante termine. -
En navegadores antiguos (IE pre-10)
deferfunciona solo para<head>y puede tener inconsistencias;asyncfue estandarizado más tarde.
Conclusión
Emplear async y defer adecuadamente mejora drásticamente el rendimiento al evitar bloqueos innecesarios.
– Usar async para scripts independientes que no requieran orden.
– Usar defer para scripts que dependan del DOM o de otras librerías, manteniendo el orden de ejecución.
La elección correcta acelera la carga y mejora la experiencia de usuario.
Deja una respuesta
Lo siento, debes estar conectado para publicar un comentario.