18. Rendimiento y optimización desde HTML
En este punto profundizaremos en técnicas y recomendaciones para optimizar el rendimiento de una página web a nivel de marcado HTML. Abordaremos la priorización de recursos, el manejo de imágenes y fuentes, la minimización del código y el uso de herramientas de auditoría, todo ello con ejemplos detallados.
1. Priorización y carga eficiente de recursos
El navegador sigue una serie de pasos al cargar el HTML y resolver recursos externos (scripts, hojas de estilo, fuentes, etc.). Para mejorar los tiempos de carga y evitar bloqueos, podemos aplicar:
- async y defer en scripts
- <link rel=’preload’>, prefetch, preconnect y dns-prefetch
1.1 Uso de async y defer
Ambos atributos cargan scripts de forma asíncrona, pero con diferencias:
| async | defer |
|---|---|
| Carga en paralelo y se ejecuta tan pronto está listo. Puede interrumpir el parseo HTML. | Carga en paralelo y se ejecuta tras el parseo completo del HTML, manteniendo el orden. |
Ejemplo de uso:
<script src='analytics.js' async></script> <script src='vendor.js' defer></script> <script src='main.js' defer></script>
1.2 Hints de recursos (<link>)
Los hints permiten indicar al navegador que anticipe la carga o la conexión de ciertos recursos.
- preload: Prioriza un recurso crítico (fuentes, scripts, estilos).
- prefetch: Trae recursos para futuras navegaciones.
- preconnect: Abre la conexión TCP/DNS/TLS a un dominio.
- dns-prefetch: Resuelve DNS anticipadamente.
<link rel='dns-prefetch' href='//fonts.gstatic.com'> <link rel='preconnect' href='https://fonts.gstatic.com' crossorigin> <link rel='preload' href='/fonts/miFuente.woff2' as='font' type='font/woff2' crossorigin> <link rel='prefetch' href='/js/gallery-lightbox.js' as='script'>
2. Minimización del HTML
Reducir el tamaño del HTML acelera el parseo y la transferencia. Recomendaciones:
- Eliminar espacios en blanco innecesarios y saltos de línea.
- Compactar condicionales y comentarios que no son críticos en producción.
- Usar atributos booleanos sin valor (
checked,disabled).
<ul> <!-- Lista de navegación principal --> <li><a href='/'>Inicio</a></li> <li><a href='/blog'>Blog</a></li> </ul> <ul> <li><a href='/'>Inicio</a></li><li><a href='/blog'>Blog</a></li> </ul>
3. Optimización de imágenes en HTML
- srcset y sizes para adaptarse a resoluciones y dispositivos.
- Lazy loading nativo con el atributo
loading='lazy'. - <picture> para formatos modernos (
webp,avif).
<!-- Imagen responsiva con srcset y lazy loading -->
<img
src='imagen-pequena.jpg'
srcset='
imagen-pequena.jpg 480w,
imagen-mediana.jpg 800w,
imagen-grande.jpg 1200w
'
sizes='(max-width: 600px) 480px, (max-width: 960px) 800px, 1200px'
alt='Ejemplo de optimización'
loading='lazy'
/>
<!-- Uso de picture para formatos avanzados -->
<picture>
<source type='image/avif' srcset='imagen.avif'>
<source type='image/webp' srcset='imagen.webp'>
<img src='imagen.jpg' alt='Imagen compatible'>
</picture>
4. Manejo eficiente de fuentes web
- Preload de fuentes críticas.
- Utilizar
font-display(swap) para evitar bloqueo de texto invisible. - Subconjunto (subset) de glyphs si sólo se muestran caracteres limitados.
<!-- Prioriza la descarga de la fuente principal -->
<link rel='preload' href='/fonts/OpenSans-Regular.woff2'
as='font' type='font/woff2' crossorigin>
<!-- En el CSS (mencionado sólo a nivel de contexto) -->
/* @font-face {
font-family: 'Open Sans';
src: url('/fonts/OpenSans-Regular.woff2') format('woff2');
font-display: swap;
} */
5. Minimizar peticiones HTTP
A nivel HTML podemos:
- Combinar varios scripts en uno solo cuando sea posible.
- Colocar scripts al final del documento (
defer) para no bloquear el render. - Agrupar iconos (SVG sprite) o usar
<svg>inline.
<!-- Sprite SVG para todos los iconos de la web -->
<svg aria-hidden='true' style='display:none'>
<symbol id='icon-menu' viewBox='0 0 24 24'>
<path d='M4 6h16M4 12h16M4 18h16'/>
</symbol>
<symbol id='icon-close' viewBox='0 0 24 24'>
<path d='M6 6l12 12M6 18L18 6'/>
</symbol>
</svg>
<!-- Reutilización -->
<svg class='icon'><use href='#icon-menu'></use></svg>
6. Carga progresiva y code splitting
Si tu aplicación usa módulos, carga componentes pesados sólo cuando el usuario los necesita (dynamic import). Aunque la configuración se realiza en JavaScript, en HTML puedes:
- Marcar contenedores con atributos
data-para conectar módulos por demanda. - Dejar un esqueleto ligero (skeleton) en HTML que luego se rellena.
<!-- Skeleton de galería --> <div id='galeria' data-module='gallery'> <p>Cargando galería...</p> </div>
7. Herramientas de auditoría
Para medir el impacto de estas optimizaciones, emplea:
- Lighthouse (integrado en Chrome DevTools).
- WebPageTest.
- PageSpeed Insights.
Revisa métricas clave: First Contentful Paint, Largest Contentful Paint, Total Blocking Time.
Conclusión
Una buena estrategia de optimización en HTML combina reducción de pesos, priorización de recursos, carga diferida y uso de etiquetas semánticas. Estas prácticas, acompañadas de auditorías frecuentes, garantizan un sitio rápido y eficiente.
Deja una respuesta
Lo siento, debes estar conectado para publicar un comentario.