Ejercicios resueltos — Capítulo 17¶
Volver al índice · Capítulo original
Ejercicio 1: Medir con Lighthouse¶
Mide tu portfolio con Lighthouse.
Solución¶
- Abre DevTools (
F12). - Pestaña Lighthouse.
- Marca Performance, Accessibility, Best Practices, SEO.
- Elige Mobile (más realista).
- Analyze page load.
Anota: - FCP (First Contentful Paint) - LCP (Largest Contentful Paint) - CLS (Cumulative Layout Shift) - TBT (Total Blocking Time)
Ejercicio 2: Imágenes en WebP¶
Convierte tus imágenes a WebP y añade
loading="lazy".
Solución¶
Conversión (con cwebp):
cwebp foto.jpg -q 80 -o foto.webp
HTML con fallback:
<picture>
<source srcset="foto.webp" type="image/webp">
<img src="foto.jpg" alt="Descripción" width="800" height="600" loading="lazy">
</picture>
Sin convertir, con srcset responsive:
<img
src="foto-800.jpg"
srcset="foto-400.jpg 400w, foto-800.jpg 800w, foto-1200.jpg 1200w"
sizes="(max-width: 600px) 400px, (max-width: 1000px) 800px, 1200px"
alt="Descripción"
width="800"
height="600"
loading="lazy"
decoding="async"
>
Ejercicio 3: width y height en imágenes¶
Añade dimensiones a todas las imágenes para evitar CLS.
Solución¶
<!-- ❌ Mal: el navegador no reserva espacio -->
<img src="foto.jpg" alt="...">
<!-- ✅ Bien: el navegador reserva espacio y evita el salto -->
<img src="foto.jpg" alt="..." width="800" height="600">
<!-- Alternativa con CSS aspect-ratio -->
<style>
.video {
aspect-ratio: 16 / 9;
width: 100%;
}
</style>
<iframe class="video" src="..."></iframe>
Ejercicio 4: font-display: swap¶
Configura
font-display: swapen tus fuentes.
Solución¶
@font-face {
font-family: 'Inter';
src: url('/fonts/inter.woff2') format('woff2');
font-weight: 400;
font-style: normal;
font-display: swap;
}
O con Google Fonts:
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;700&display=swap"
rel="stylesheet"
>
display=swap → muestra texto con fuente fallback mientras carga la real.
Ejercicio 5: Analizar el bundle¶
Analiza el bundle con
vite-bundle-visualizer.
Solución¶
npm install -D vite-bundle-visualizer
Añade a package.json:
{
"scripts": {
"analyze": "vite-bundle-visualizer"
}
}
Ejecuta:
npm run analyze
Se abre un gráfico con el tamaño de cada dependencia. Identifica las más pesadas y busca alternativas más ligeras:
| Paquete pesado | Alternativa ligera |
|---|---|
moment (~70 KB) |
dayjs (~2 KB) |
lodash (~70 KB) |
lodash-es con tree shaking |
axios (~50 KB) |
fetch nativo |
jQuery (~90 KB) |
DOM nativo |
Ejercicio 6: preconnect y preload¶
Añade
preconnectypreloadpara recursos críticos.
Solución¶
<head>
<!-- Anticipa la conexión con la CDN de fuentes -->
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<!-- Precarga la fuente principal (usa las que aparecen en el primer render) -->
<link rel="preload" href="/fonts/inter.woff2" as="font" type="font/woff2" crossorigin>
<!-- Precarga el CSS crítico -->
<link rel="preload" href="/estilos.css" as="style">
<!-- DNS prefetch para servicios externos -->
<link rel="dns-prefetch" href="https://analytics.ejemplo.com">
</head>
No abuses del preload
Cada preload compite por ancho de banda. Úsalo solo para recursos críticos que descubrirías tarde.