El auge del CSS Utility-First: Tailwind CSS como ejemplo

3 min

1. Las dificultades de las metodologías CSS tradicionales

Antes de la aparición de Utility-First, contábamos con muchas metodologías CSS excelentes para organizar los estilos, por ejemplo:

  • BEM (Block, Element, Modifier): Utiliza la convención de nombres block__element--modifier para mantener los estilos independientes y fáciles de mantener.
  • OOCSS (Object-Oriented CSS): Promueve la separación entre estructura y apariencia, y entre contenedor y contenido.
  • CSS-in-JS: Escribe CSS directamente dentro de componentes JavaScript para encapsular los estilos a nivel de componente.

Estos métodos resolvieron hasta cierto punto la contaminación global de CSS y la organización del código, pero también suelen traer problemas nuevos: el esfuerzo mental de poner nombre a innumerables clases, la molestia de cambiar entre archivos y el posible coste en tiempo de ejecución de CSS-in-JS.

2. ¿Qué es Utility-First?

Utility-First es una filosofía CSS que propone ofrecer una serie de clases utilitarias de propósito único y nombre estable, y construir interfaces complejas combinando esas clases.

Por ejemplo, en lugar de crear una clase .card y definir su display, padding y box-shadow en un archivo CSS, se escribe directamente lo siguiente en HTML:

<div class="block p-6 rounded-lg shadow-lg bg-white">
  <!-- ... -->
</div>

Aquí, block, p-6, rounded-lg y las demás clases utilitarias se ocupan cada una de una sola tarea pequeña.

3. Tailwind CSS: el modelo de Utility-First

Tailwind CSS es actualmente el framework CSS Utility-First más popular. Ofrece un conjunto extremadamente completo de clases utilitarias que cubre casi todas las propiedades CSS de uso habitual.

Ventajas principales:

  • Desarrollo extremadamente rápido: Casi nunca hay que salir del archivo HTML. Al combinar clases atómicas se puede construir rápidamente prácticamente cualquier diseño, lo que aumenta enormemente la eficiencia del prototipado y el desarrollo.
  • Un sistema de diseño obligatorio: Como todos los estilos —colores, espaciado y tamaños de fuente— proceden de una configuración predefinida (theme), el equipo puede mantener fácilmente la coherencia de la interfaz y evitar los “números mágicos”.
  • Sin preocupaciones por los nombres: “Los dos grandes problemas de la informática son la invalidación de caché y poner nombres.” Tailwind permite olvidarse casi por completo de nombrar clases CSS.
  • Rendimiento excepcional: Durante la compilación de producción, Tailwind analiza los archivos y elimina todas las clases CSS que no se utilizan mediante PurgeCSS (o su motor JIT integrado), por lo que el archivo CSS final suele ser muy pequeño.

4. ¿“Infierno de nombres de clase”? — Otra perspectiva sobre las desventajas

La crítica más habitual a Tailwind es que hace que el HTML sea muy voluminoso y difícil de leer, como si se regresara a la época de los “estilos inline”.

<button class="py-2 px-4 font-semibold rounded-lg shadow-md text-white bg-blue-500 hover:bg-blue-700">
  Click me
</button>

Sin duda requiere un periodo de adaptación. Sin embargo, sus defensores sostienen que:

  1. Los estilos y la estructura ya están estrechamente acoplados, por lo que colocarlos juntos puede facilitar el mantenimiento.
  2. Al extraer componentes reutilizables, como componentes de React o Vue, esta aparente “confusión” se puede encapsular.

Para las combinaciones de estilos que deben reutilizarse, Tailwind ofrece la directiva @apply:

/* in your css file */
.btn-primary {
  @apply py-2 px-4 font-semibold rounded-lg shadow-md text-white bg-blue-500 hover:bg-blue-700;
}

Así se puede utilizar .btn-primary en HTML. No obstante, la recomendación oficial de Tailwind es resolver la reutilización mediante componentes.

Conclusión

El éxito de Utility-First y Tailwind CSS marca un cambio en la idea de la “separación de responsabilidades” en el desarrollo frontend: se pasa de la separación de lenguajes (HTML/CSS/JS) a la separación de componentes. Mediante un enfoque aparentemente “primitivo”, resuelve muchos problemas prácticos del desarrollo web moderno y ofrece a los desarrolladores un atajo hacia interfaces eficientes, coherentes y de alto rendimiento.