El Atributo ASYNC

Es útil para optimizar el rendimiento de las páginas web. Al permitir la carga asíncrona de los scripts.

El atributo async se utiliza en la etiqueta <script> para cargar y ejecutar scripts de forma asíncrona, mejorando el rendimiento y la velocidad de carga de una página web. Este atributo es clave para optimizar la carga de recursos externos (como archivos JavaScript) sin bloquear el análisis del HTML. A continuación, te explicamos cómo usarlo correctamente.

¿Qué hace el atributo async?

  • Carga el script en segundo plano mientras el navegador sigue analizando el HTML.

  • Ejecuta el script inmediatamente después de que se descargue (sin esperar a que el HTML termine de cargarse).

  • No garantiza el orden de ejecución: Si hay múltiples scripts async, pueden ejecutarse en cualquier orden (el que se descargue primero).

Sintaxis básica

<script src="archivo.js" async></script>

¿Cuándo usar async?

Ideal para scripts que no dependen del DOM o de otros scripts. Ejemplos comunes:

  • Analíticas web (Google Analytics, Hotjar).

  • Publicidad (Google AdSense).

  • Widgets sociales (botones de compartir).

  • Scripts de rendimiento (lazy loading, prefetching).

Ejemplos prácticos

Script de analíticas

<!-- Google Analytics con async -->
<script 
  async 
  src="https://www.googletagmanager.com/gtag/js?id=TU_ID"
></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());
  gtag('config', 'TU_ID');
</script>

Carga de un script externo

<script src="mi-script.js" async></script>

Comparación: async vs defer

Atributo Carga Ejecución Orden
Sin atributo Bloquea el HTML Inmediata (antes de renderizar) Según aparición en el HTML
async No bloqueante (paralela) Inmediata al terminar descarga Sin orden garantizado
defer No bloqueante (paralela) Tras analizar todo el HTML Según aparición en el HTML

Mejores prácticas

Usa async para scripts independientes:

Si el script no necesita acceder al DOM ni depende de otros scripts, async es ideal.

Evita async en scripts críticos:

Si el script es esencial para el renderizado inicial (ej: un framework como React), usa defer o carga el script normalmente.

No uses async en scripts con dependencias:

Si el script A depende del script B, no uses async, ya que no se garantiza el orden de ejecución.

Combina con nomodule para compatibilidad:

Para navegadores antiguos que no soportan módulos ES6:

<script src="moderno.js" type="module" async></script>
<script src="legacy.js" nomodule async></script>

Errores comunes

Usar async en scripts que modifican el DOM:

Si el script necesita elementos HTML que aún no se han cargado, puede fallar.

<!-- Riesgo: El script podría ejecutarse antes de que exista #miElemento -->
<script src="script.js" async></script>
<div id="miElemento"></div>

Asumir orden de ejecución:

Dos scripts con async pueden ejecutarse en orden aleatorio:

<script src="a.js" async></script>
<script src="b.js" async></script> <!-- Puede ejecutarse antes que a.js -->

Compatibilidad

  • Navegadores modernos: Todos soportan async (Chrome, Firefox, Safari, Edge).

  • Internet Explorer: Soporte desde IE10+.

Ejemplo avanzado: Carga asíncrona de scripts dinámicos

Puedes añadir scripts con async mediante JavaScript:

const script = document.createElement('script');
script.src = 'mi-script.js';
script.async = true;
document.body.appendChild(script);

Conclusión

El atributo async es una herramienta poderosa para:

  • Mejorar el rendimiento de carga de la página.

  • Evitar bloqueos en el renderizado inicial.

  • Optimizar scripts no críticos (analíticas, publicidad).

Ejemplo final:

<!DOCTYPE html>
<html>
<head>
  <!-- Scripts no críticos cargados con async -->
  <script async src="https://widgets.example.com/social.js"></script>
  <script async src="https://www.google-analytics.com/analytics.js"></script>
</head>
<body>
  <!-- Contenido de la página -->
  <script src="script-critico.js"></script> <!-- Script crítico sin async -->
</body>
</html>

¡Usa async estratégicamente para equilibrar velocidad y funcionalidad!