Los atributos async y defer se utilizan en las etiquetas <script> que enlazan a archivos JavaScript externos (<script src="ruta/al/script.js">) y sirven para controlar cómo y cuándo se descargan y ejecutan dichos scripts, con el objetivo principal de mejorar el rendimiento de carga de la página y la experiencia del usuario.
async ni defer)Para entender la utilidad de async y defer, primero veamos qué ocurre sin ellos:
<script src="..."></script>: a. Detiene el análisis del HTML. b. Descarga el archivo JavaScript desde la red. c. Una vez descargado, ejecuta el script JavaScript. d. Solo después de que el script ha terminado de ejecutarse, el navegador reanuda el análisis del HTML. Este comportamiento se conoce como «bloqueo del parser» («parser-blocking»). Si el script es grande o la conexión de red es lenta, la página puede tardar mucho en mostrarse completamente, ya que el navegador está esperando.asyncEl atributo async (asíncrono) modifica este comportamiento de la siguiente manera:
async se descarga por completo, el análisis del HTML se pausa y el script se ejecuta inmediatamente.async, no hay garantía del orden en que se ejecutarán. Se ejecutarán en el orden en que terminen de descargarse, no necesariamente en el orden en que aparecen en el HTML.Ejemplo:
HTML
<script async src="scripts/analiticas.js"></script>
<script async src="scripts/publicidad.js"></script>
Lenguaje del código: PHP (php)deferEl atributo defer (diferido) también modifica el comportamiento de carga y ejecución:
async, el navegador descarga el archivo JavaScript de forma asíncrona, sin bloquear el análisis del HTML.DOMContentLoaded).defer, se ejecutarán en el orden en que aparecen en el documento HTML. Esto es muy útil si un script depende de otro.defer se ejecutan después de que todo el HTML ha sido analizado, pueden acceder y manipular de forma segura cualquier elemento del DOM.async para la mayoría de los casos de uso.Ejemplo:
HTML
<script defer src="scripts/libreria-jquery.js"></script>
<script defer src="scripts/mi-script-que-usa-jquery.js"></script>
Lenguaje del código: PHP (php)| Característica | Sin Atributo | async | defer |
| Bloqueo del HTML al descargar | Sí | No | No |
| Bloqueo del HTML al ejecutar | Sí | Sí | No (ejecuta después del parseo del HTML) |
| Momento de Ejecución | Inmediato tras la descarga | Inmediato tras la descarga | Después del parseo completo del HTML |
| Orden de Ejecución | En el orden de aparición | Sin orden garantizado | En el orden de aparición |
Importante:
async y defer son atributos booleanos; no necesitan un valor (simplemente <script async src="...">).src). No afectan a los scripts en línea (código JavaScript escrito directamente entre las etiquetas <script>...</script>).Elegir entre async, defer, o ninguno, dependerá de las necesidades específicas de cada script: si es independiente, si necesita acceder al DOM inmediatamente, si depende de otros scripts, y lo crítico que es para la carga inicial de la página. Usarlos correctamente es una técnica clave para la optimización del rendimiento web.