Rendimiento, build y producción
Rendimiento no es optimización tardía, es decisión temprana
El rendimiento no se “arregla al final”. Se condiciona desde el primer día por cómo estructuras el proyecto, cómo usas Tailwind y cómo entiendes el build. Una UI lenta rara vez lo es por una sola causa.
Lo es por acumulación de decisiones pequeñas.
El rendimiento no se optimiza. Se preserva.
El build como frontera entre desarrollo y realidad
En desarrollo:
- Todo funciona.
- Todo parece rápido.
- Todo es permisivo.
En producción:
- El navegador paga cada decisión.
- El CSS se descarga completo.
- El JS se parsea y ejecuta.
- La red es el cuello de botella.
El build es el momento donde:
- El código se reduce.
- El CSS se poda.
- Las decisiones se congelan.
Tailwind en producción: generar solo lo necesario
Tailwind no es pesado por naturaleza. Es pesado si no se configura bien. En producción:
- Solo deben existir las clases realmente usadas.
- No deben existir utilidades huérfanas.
- No deben generarse variantes innecesarias.
La clave no es “usar menos clases”. Es usar clases detectables y estables.
Clases dinámicas: el enemigo silencioso del purge
Uno de los mayores errores en Tailwind es construir clases dinámicamente:
- Concatenaciones de strings
- Valores calculados
- Clases que no existen en el código fuente literal
Esto provoca:
- CSS faltante en producción
- Workarounds peligrosos
- CSS inflado por “safelists” indiscriminadas
Si el build no puede ver la clase, no existe.
Configuración de contenido como decisión crítica
La opción content no es un detalle técnico. Es un contrato con el build. Debe:
- Apuntar solo a archivos reales.
- Incluir JSX/TSX/HTML que renderizan UI.
- Excluir carpetas irrelevantes.
Un content demasiado amplio:
- Genera CSS innecesario.
- Aumenta tiempos de build.
- Oculta errores.
Un content demasiado estrecho:
- Rompe estilos en producción.
CSS final: tamaño, orden y predictibilidad
En producción importa:
- Tamaño del CSS
- Orden de las reglas
- Ausencia de duplicados
Señales de alerta:
- CSS de cientos de KB para una UI simple.
- Diferencias visuales entre dev y prod.
- Overrides inesperados.
Un CSS sano:
- Es pequeño.
- Es predecible.
- No necesita “parches” tras el deploy.
Rendimiento percibido vs rendimiento real
No todo es milisegundos medidos.
El usuario percibe rendimiento cuando:
- El layout no salta.
- El texto aparece rápido.
- Las interacciones responden.
- Los estados son inmediatos.
Tailwind influye en esto indirectamente:
- Clases bien declaradas evitan reflows.
- Layout estable evita CLS.
- Estados visibles reducen incertidumbre.
Componentes y coste de render
En frameworks modernos:
- El coste no es solo CSS.
- Es render, re-render y reconciliación.
Malas prácticas comunes:
- Clases condicionales innecesarias.
- Componentes demasiado genéricos.
- Variantes que disparan re-render.
Un sistema bien diseñado:
- Reduce combinaciones.
- Reduce lógica visual.
- Reduce trabajo del framework.
Producción no es desarrollo con npm run build
Producción implica:
- Variables de entorno correctas.
- Minificación real.
- Eliminación de warnings.
- Verificación visual final.
Errores frecuentes:
- No probar el build local.
- Confiar solo en dev server.
- Detectar errores cuando ya está desplegado.
El build local es la última oportunidad barata de fallar.
Monitorizar lo que importa
No todo se mide con Lighthouse, pero ayuda.
Indicadores útiles:
- Tamaño del CSS final
- Número de reglas generadas
- CLS (layout shift)
- TTI (time to interactive)
Lo importante no es el número perfecto. Es detectar regresiones.
Errores frecuentes en rendimiento con Tailwind
- Safelist masiva “por si acaso”.
- Clases dinámicas sin control.
- Configs copiadas sin entender.
- CSS creciendo sin nadie darse cuenta.
- Pensar que Tailwind es el problema.