18.1 Orden de carga de recursos (CSS, JS, fuentes)
La forma en que un navegador descarga y procesa los recursos de una página (hojas de estilo, scripts y fuentes) condiciona el rendimiento y la experiencia del usuario. Este apartado detalla el flujo de carga, las diferencias entre recursos bloqueantes y no bloqueantes, y las mejores prácticas para optimizar tiempos de renderizado.
Carga de CSS
Cuando el navegador encuentra una etiqueta <link rel='stylesheet'> en el head, detiene el parseo del HTML hasta descargar y procesar la hoja de estilo. De este modo se construye el CSSOM (CSS Object Model), necesario para combinarlo con el DOM y calcular el render tree.
- Descarga en paralelo: las
<link>permiten descargas concurrentes. - Render-blocking: hasta que la hoja no termina de bajar y parsear, no se dibuja la página.
- Media queries: usando
media='print'o similares, retrasas la descarga/parseo si no aplica la condición.
Ejemplo básico de inclusión:
<!-- Carga convencional, render-blocking --> <link rel='stylesheet' href='styles/main.css'> <!-- Carga condicional: sólo para impresión --> <link rel='stylesheet' href='styles/print.css' media='print'>
Descarga y uso de fuentes web
Las fuentes custom via @font-face pueden generar bloqueo de texto (FOIT: Flash Of Invisible Text) mientras esperan la carga. Para mitigarlo:
font-displaycon valores swap o optional para mostrar texto con fuente fallback rápidamente.- Preload de fuentes críticas usando
<link rel='preload'>. - Preconnect a orígenes de terceros (Google Fonts, CDN de tipografías) para agilizar handshake y DNS.
Ejemplo con preconnect y preload:
<!-- Conexión previa a CDN de tipografías -->
<link rel='preconnect' href='https://fonts.gstatic.com'>
<!-- Precarga de fuente WOFF2 -->
<link rel='preload'
href='/fonts/roboto-v20-latin-regular.woff2'
as='font'
type='font/woff2'
crossorigin>
<!-- Luego la hoja de estilo de Google Fonts o tu propio CSS -->
<link rel='stylesheet' href='https://fonts.googleapis.com/css?family=Roboto:400,700&display=swap'>
Carga de JavaScript
Por defecto, cada <script src='…'> bloquea el parser hasta descargar y ejecutar el archivo. Esto penaliza el First Contentful Paint si se ubican en el head. Disponemos de dos atributos clave:
- async: descarga en paralelo y ejecuta en cuanto esté listo, interrumpiendo el parser.
- defer: descarga en paralelo, pero retrasa la ejecución hasta haber parseado todo el HTML, garantizando orden de aparición.
Comparativa de atributos:
| Atributo | Descarga | Ejecuta | Bloqueo parser | Orden |
|---|---|---|---|---|
| sin atributos | secuencial | inmediata | sí | en lugar |
| async | paralelo | cuando termine descarga | sólo en ejecución | no garantizado |
| defer | paralelo | tras parse completo | no | orden de aparición |
Ejemplo de uso de async y defer en el head:
<!-- Analítica asíncrona: no bloqueante, ejecución inmediata al descargar --> <script src='analytics.js' async></script> <!-- App principal, se ejecuta tras el parse completo y en orden --> <script src='app.js' defer></script>
Además, ubicar scripts críticos justo antes del cierre de </body> con defer o sin atributos puede ser útil cuando dependen de elementos DOM ya existentes.
Resource Hints y Preloading
Los resource hints ayudan a preparar conexiones y descargas óptimas:
dns-prefetch: resuelve DNS anticipadamente.preconnect: realiza handshake TLS y DNS.preload: prioriza descarga de un recurso específico.prefetch: baja recursos para navegaciones futuras, de baja prioridad.
Ejemplo combinando varios hints:
<!-- DNS prefetch a CDN --> <link rel='dns-prefetch' href='//cdn.example.com'> <!-- Preconnect a servidor de imágenes --> <link rel='preconnect' href='https://images.example.com' crossorigin> <!-- Precarga de un script crítico --> <link rel='preload' href='/js/critical.js' as='script'> <!-- Prefetch de script para navegación siguiente --> <link rel='prefetch' href='/js/next-page.js' as='script'>
Resumen de buenas prácticas
- Cargar CSS en el head sin bloqueos innecesarios: media queries y
preloadpara críticos. - Preconnect y DNS prefetch para orígenes externos (tipografías, APIs, CDNs).
- Preload de fonts WOFF2 esenciales antes de la carga del CSS que las utiliza.
- Colocar scripts no críticos con
asyncodefery situar el resto al final de<body>. - Usar
prefetchpara recursos de páginas siguientes y mejorar la percepción de velocidad.
Deja una respuesta
Lo siento, debes estar conectado para publicar un comentario.