Skip to content

Stylelint

Stylelint es a los estilos lo que ESLint es a JavaScript: un linter que detecta errores y malas prácticas en CSS, SCSS y en el bloque <style> de los componentes Vue.

.card {
colr: red; /* propiedad que no existe */
width: 100px; /* unidad prohibida en nuestro proyecto */
color: blue !important; /* !important prohibido */
}
.card {
} /* regla vacía y duplicada */
.stylelintrc.json
{
"extends": ["stylelint-config-recommended-vue"],
"rules": {
"unit-allowed-list": ["em", "rem", "vh", "vw", "%", "s", "deg", "fr", "pt", "ch", "ms", "dvh", "dvw", "lh"],
"at-rule-no-unknown": null,
"rule-empty-line-before": null,
"font-family-no-missing-generic-family-keyword": null,
"declaration-no-important": true
}
}

stylelint-config-recommended-vue es un preset que hace dos cosas:

  1. Trae el conjunto de reglas recommended de Stylelint: solo errores objetivos (propiedades inexistentes, colores inválidos, selectores duplicados). No impone estilo.
  2. Enseña a Stylelint a leer archivos .vue: extrae el bloque <style> del componente y lo analiza como si fuera un .css independiente. Sin esto, Stylelint no sabría qué hacer con un Single File Component.

unit-allowed-list — lista blanca de unidades

Section titled “unit-allowed-list — lista blanca de unidades”
"unit-allowed-list": ["em", "rem", "vh", "vw", "%", "s", "deg", "fr", "pt", "ch", "ms", "dvh", "dvw", "lh"]

Esta es la regla con más impacto en el día a día: px no está en la lista, así que está prohibido.

El motivo es la accesibilidad y el diseño responsive. Un tamaño en px ignora el tamaño de fuente que la persona haya configurado en su navegador; rem y em lo respetan.

/* ❌ error de Stylelint */
.titulo {
font-size: 24px;
}
/* ✅ correcto */
.titulo {
font-size: 1.5rem;
}

Las unidades permitidas y para qué sirven:

UnidadUso habitual
remTamaños relativos a la raíz del documento. Es la unidad por defecto.
emTamaños relativos al elemento padre.
%Anchos y altos relativos al contenedor.
vh / vwPorcentaje del viewport.
dvh / dvwIgual, pero dinámico: se ajusta a la barra de navegación del móvil.
lhRelativo al line-height actual.
chAncho del carácter “0” — útil para limitar anchos de texto.
frFracciones de CSS Grid.
s / msDuraciones de transiciones y animaciones.
degÁngulos en rotaciones y gradientes.
ptPuntos, para hojas de estilo de impresión.

declaration-no-important: true — prohibido !important

Section titled “declaration-no-important: true — prohibido !important”
/* ❌ error */
.boton {
background: red !important;
}

!important rompe la cascada de CSS: obliga a que el siguiente que quiera sobrescribir ese estilo use otro !important, y así en escalada. Cuando parece necesario, casi siempre la solución real es un selector más específico o revisar el orden de las hojas de estilo.

Poner una regla a null en Stylelint es desactivarla.

Regla desactivadaPor qué
at-rule-no-unknownTailwind usa at-rules que no existen en el CSS estándar (@tailwind, @apply, @layer). Sin desactivarla, cada una sería un error.
rule-empty-line-beforeEs una regla puramente de formato (líneas en blanco entre bloques) y de eso se encarga Prettier. Se apaga para que no se peleen.
font-family-no-missing-generic-family-keywordExige acabar toda pila de fuentes con un genérico (sans-serif). Las fuentes las gestiona el tema de Tailwind, así que en los bloques <style> sobra la comprobación.
Terminal window
pnpm styles # stylelint "**/*.{vue,css}" → solo reporta
pnpm styles:fix # stylelint "**/*.{vue,css}" --fix → arregla lo que puede

--fix resuelve cuestiones mecánicas (orden, comillas, valores redundantes). No convierte px a rem ni quita !important: esos hay que arreglarlos a mano, porque la herramienta no puede saber cuál era tu intención.

Se necesita stylelint.vscode-stylelint. Y muy importante, hay que desactivar el validador de CSS nativo de VS Code para que no reporte los mismos problemas dos veces (y para que no marque como error la sintaxis de Tailwind):

.vscode/settings.json
{
"css.validate": false,
"scss.validate": false,
"less.validate": false
}