Sviluppo web
Tailwind vs CSS Modules: dove vive la scala del design
Tailwind genera utility, CSS Modules isola i nomi: il criterio è dove vive la scala. Numeri dei due tag e il test che misura se avete uno o due sistemi.
In sintesi
- Tailwind e CSS Modules non sono alternative: uno genera utility, l’altro isola i nomi di classe.
- Al 1 novembre 2026 il tag tailwind-css ha 10.551 domande e css-modules 740.
- La domanda più votata su CSS Modules ha 273 voti e riguarda TypeScript, non il design.
- Il limite di CSS Modules è la scala: i token restano una convenzione, non una garanzia.
Tailwind e CSS Modules non sono alternative: uno genera utility, l’altro isola i fogli di stile. La scelta vera è dove vive la scala di spaziatura e tipografia, e chi la controlla quando il progetto cresce.
Il divario di adozione è netto: al 1 novembre 2026 il tag `tailwind-css` conta 10.551 domande su Stack Overflow e `css-modules` 740, quattordici volte meno. La domanda più votata su CSS Modules, misurata sulla stessa API, ha 273 voti e riguarda TypeScript che non trova il modulo.
Due problemi, non due soluzioni
| Asse | Tailwind | CSS Modules | Costo |
|---|---|---|---|
| Cosa produce | Utility nel markup | Nomi di classe locali | Markup contro CSS |
| Ambito | Globale con prefisso | Locale al file | Conflitti contro duplicazione |
| Token | Configurazione e variabili CSS | Convenzione del team | Nessuno dei due li impone |
| Tipizzazione | Classi stringa | Dichiarazione per `*.module.css` | Un file di tipi da mantenere |
| Licenza | MIT | Nessun runtime da licenziare | Nessuna differenza pratica |
Dove finisce il valore
Tailwind mette la scala in un solo posto: spaziatura, tipografia, colori e breakpoint diventano variabili di configurazione. Chi scrive un componente non inventa un `margin`, sceglie un valore della scala. CSS Modules non offre questa garanzia: il nome è locale, il valore è libero.
Con CSS Modules la coerenza dipende dalle convenzioni e dalla review. Un file può definire `padding: 13px` senza che nessuno lo noti. Con Tailwind `p-3` esiste solo se la scala lo prevede, e un valore fuori scala si vede nel markup.
Il test in un’ora
# quanti fogli CSS Modules ha il progetto
rg -n "\.module\.css" src | wc -l
# quanto CSS produce Tailwind dopo il tree-shaking
npx @tailwindcss/cli -i ./src/app.css -o ./dist/app.css --minify
wc -c ./dist/app.css
# la scala esiste una volta sola?
rg -n -- "--space-|--text-" src/app.css
Il secondo numero va letto insieme al primo: se il CSS generato cresce mentre i fogli CSS Modules restano, avete due sistemi che si sommano. Se il numero resta basso e i fogli calano, la migrazione sta funzionando.
La combinazione che funziona
Tailwind per layout, spaziatura e stati; CSS Modules per le parti che hanno bisogno di CSS vero: keyframe complessi, gradienti multipli, selettori di stato che le utility rendono illeggibili. Il confine va scelto una volta e scritto, altrimenti ogni sviluppatore decide per sé.
Il limite da mettere per iscritto
Limite dichiarato di CSS Modules: non porta token né scala. La coerenza resta una convenzione, e la tipizzazione richiede una dichiarazione per `*.module.css` che TypeScript non genera da solo. È il motivo della domanda più votata sul tag: 273 voti per un errore di configurazione, non di stile.
Licenze e dipendenze
Tailwind è MIT. CSS Modules non è un runtime: è una specifica implementata dal bundler o da `postcss-modules`, quindi non aggiunge una licenza da valutare. In entrambi i casi la decisione riguarda il processo di build, non il contratto legale.
Le utility si esplorano in /components/cat/tailwind, i componenti con CSS dichiarato in /components/cat/css e il modello copy-paste in /components/lib/shadcn. Per il modello delle utility leggi che cos’è Tailwind CSS, per i token come tematizzare shadcn; il confronto tra framework CSS è in Tailwind vs Bootstrap.
Domande frequenti
Tailwind sostituisce CSS Modules?
No, risolvono problemi diversi: Tailwind genera utility, CSS Modules isola i nomi di classe. Si possono usare insieme.
CSS Modules è più leggero di Tailwind?
Dipende dal CSS che scrivi. Tailwind produce solo le classi usate, CSS Modules produce tutto il foglio che hai scritto.
Perché TypeScript non trova i file .module.css?
Manca una dichiarazione di tipo per `*.module.css`. È la domanda più votata sul tag, con 273 voti.
Quale dei due gestisce meglio i token?
Nessuno dei due li impone. Tailwind ha una configurazione dove metterli, CSS Modules richiede una convenzione scritta.
Meglio Tailwind o CSS Modules per un design system?
Tailwind se volete una scala unica e verificabile; CSS Modules se i componenti hanno stili complessi e il team preferisce CSS normale.