14.1 Inserción de scripts (script en head y body)
En HTML, el elemento <script> nos permite incorporar código JavaScript en la página. Podemos insertar este elemento en dos lugares principales:
- Dentro de la sección head (<head>), antes de que se procese el contenido visual.
- Dentro del body (<body>), normalmente al final para optimizar el rendimiento.
1. Script en el head
Colocar scripts en el head bloquea el parser de HTML hasta que el script se descarga y ejecuta, retrasando la representación de la página. Sin embargo, hay atributos que ayudan a mitigar este bloqueo:
defer: Retrasa la ejecución hasta que el DOM esté completamente construido.async: Descarga el script paralelamente al resto de recursos y lo ejecuta tan pronto como esté listo.
a) Script sin atributos (bloqueante)
<head>
<!-- El navegador detiene el parseo de HTML hasta completar este script -->
<script src='utils.js'></script>
</head>
Comentarios:
- Descarga y ejecución se hacen antes de procesar el resto del documento.
- Puede causar render-blocking y empeorar la velocidad percibida de carga.
b) Script con defer
<head>
<!-- Se descarga en paralelo, se ejecuta tras construir el DOM -->
<script defer src='funciones.js'></script>
</head>
Comentarios:
- Se garantizan el orden de ejecución si hay múltiples
defer. - No bloquea la carga de CSS ni de otros recursos.
c) Script con async
<head>
<!-- Se descarga en paralelo, se ejecuta tan pronto como termine la descarga -->
<script async src='analytics.js'></script>
</head>
Comentarios:
- No garantiza el orden de ejecución relativo a otros scripts.
- Buena opción para scripts independientes (p.ej.: analíticas).
2. Script en el body
Insertar el <script> justo antes del cierre de </body> es una práctica común para evitar bloqueos:
<!-- ... contenido HTML ... --> <!-- Al final del body, el DOM ya está listo --> <script src='app.js'></script> </body>
Comentarios:
- El navegador renderiza todo el HTML antes de descargar y ejecutar el script.
- Sin necesidad de
defer, ya que el DOM existe al ejecutarapp.js.
3. Comparativa de localizaciones y atributos
| Ubicación / Atributo | Efecto | Bloqueante | Orden |
|---|---|---|---|
| Head (sin atributos) | Descarga inmediata, ejecuta al parsear | Sí | Orden en el HTML |
| Head + defer | Descarga paralela, ejecuta tras DOMContentLoaded | No | Orden en el HTML |
| Head + async | Descarga paralela, ejecuta al terminar descarga | No | Indeterminado |
| Body (final) | Descarga tras HTML, ejecuta tras parseo | No | Orden en el HTML |
4. Inserción dinámica de scripts
Podemos crear y añadir scripts mediante JavaScript, lo que permite control sobre cuándo y cómo cargarlos:
<script>
// Crear un nuevo elemento