Design system

Migrare da Bootstrap a Tailwind senza riscrivere il sito

Tailwind entra accanto a Bootstrap e lo sostituisce una pagina alla volta. Le tre fasi, cosa converte in modo meccanico, cosa va riscritto e il limite da mettere per iscritto.

In sintesi

  • Si migra in tre fasi: coesistenza con prefisso, conversione pagina per pagina, rimozione di Bootstrap.
  • Griglia e utility si convertono in modo meccanico; modal, dropdown e tooltip vanno riscritti su primitive headless.
  • Il catalogo indicizza 13 file sorgente Bootstrap e 61 componenti shadcn al 1 novembre 2026.
  • La scala di spaziatura di Bootstrap non è quella di Tailwind: la mappa va scritta, non copiata.

Si migra da Bootstrap a Tailwind in tre fasi, non con un big bang: Tailwind entra accanto a Bootstrap, una pagina alla volta, e Bootstrap esce quando l’ultima pagina è convertita. Il sito resta online in ogni fase, ma per un periodo paga due sistemi di stile.

Bootstrap è una libreria completa: griglia, utility, componenti e JavaScript. Tailwind è un generatore di utility: non porta componenti né comportamento. La migrazione non è un cambio di sintassi, è la rinuncia a una parte che qualcuno deve riscrivere.

Le tre fasi

  • Coesistenza: installa Tailwind con prefisso `tw-` e senza Preflight. Bootstrap continua a governare le pagine vecchie, Tailwind le nuove.
  • Conversione: una pagina per volta. Parti dalle pagine con pochi plugin JavaScript: sono quelle dove il cambio si misura in ore, non in settimane.
  • Rimozione: togli il CSS di Bootstrap, poi il bundle JS, poi i plugin. Ogni passo è separato, così un errore si annulla con un revert.

Cosa converte bene e cosa no

BootstrapTailwindLavoroNota
Griglia `.row` / `.col-*`CSS Grid + `max-w-*`MeccanicoI breakpoint vanno rifatti, non copiati
Utility `.d-flex`, `.mt-3``flex`, `mt-3`MeccanicoLa scala Bootstrap va da 0 a 5, Tailwind da 0 a 96: la mappa non è 1:1
Form `.form-control`Classi Tailwind + statoMedioValidazione e stati vanno riscritti a mano
Modal, dropdown, tooltipPrimitive headless (Radix, Base UI)Non meccanicoComportamento, focus e tastiera sono lavoro nuovo
Tema `$primary`Variabili CSS + `@theme`Una voltaRinomina i token prima di convertire le pagine

La configurazione che evita il conflitto

Due sistemi di utility nello stesso documento si sovrascrivono. Bootstrap definisce `.container`, `.border`, `.shadow` e `.rounded`; Tailwind definisce classi con gli stessi nomi. Il prefisso non è eleganza: è l’unico modo per non fare debug su un bottone che cambia bordo da solo.

Con Tailwind 4 il prefisso si dichiara nell’import del CSS. Se togli anche Preflight, Bootstrap mantiene i suoi reset e Tailwind non riscrive `margin`, `border` e `font-size` su ogni elemento.

npm install tailwindcss @tailwindcss/postcss postcss

# build una volta, poi --watch durante la conversione
npx @tailwindcss/cli -i ./src/app.css -o ./public/app.css

# quante pagine usano ancora una classe Bootstrap
rg -l "btn |card |navbar |modal |col-" src | wc -l

La terza riga è il cruscotto: il numero deve scendere a ogni pagina convertita. Quando arriva a zero, Bootstrap può uscire.

La pagina da cui partire

Scegli una pagina statica con un form e nessun modal. La pagina contatti è il test migliore: griglia, campi, validazione e messaggi di errore. Se il risultato regge il confronto visivo e il form funziona, la mappa è pronta per le altre.

Il limite da mettere per iscritto

Limite dichiarato: Tailwind non porta componenti JavaScript. Chi usa modal, dropdown e tooltip di Bootstrap deve riscriverli su primitive headless, e quel lavoro non è incluso nella conversione delle classi. Se il sito dipende da cinque plugin, la migrazione costa più della parte CSS.

Le licenze sono semplici: Bootstrap è MIT, Tailwind è MIT, Radix e Base UI sono MIT. La licenza non decide la migrazione; la decide quanto JavaScript usi.

Il record di partenza è /components/lib/bootstrap, l’arrivo è /components/lib/shadcn e i form convertiti si cercano in /components/cat/form. Per capire Tailwind prima di toccare il sito leggi che cos’è Tailwind CSS; per il layout Flexbox o Grid; per l’errore più comune la classe non viene applicata. Il confronto misurato tra librerie è in React UI libraries 2026.

Domande frequenti

Quanto tempo richiede la migrazione da Bootstrap a Tailwind?

Dipende dal numero di pagine e di plugin JavaScript, non dal numero di classi. Conta le pagine con modal o dropdown: quelle decidono il costo.

Posso usare Bootstrap e Tailwind insieme?

Sì, con un prefisso Tailwind e senza Preflight. Senza prefisso le classi con lo stesso nome si sovrascrivono e il debug diventa casuale.

Devo riscrivere tutti i componenti?

No. Griglia e utility si convertono in modo meccanico; i componenti JavaScript vanno riscritti perché Tailwind non porta comportamento.

Tailwind sostituisce la griglia di Bootstrap?

Sì, con CSS Grid e utility responsive. I breakpoint però vanno rifatti: quelli di Bootstrap non corrispondono per nome né per valori.

Bootstrap è morto?

No. Bootstrap 5 è stabile e mantenuto con licenza MIT. La scelta dipende dal progetto, non dalla popolarità.