React
Come installare shadcn/ui in un progetto esistente
Dalla radice del progetto: `init` configura Tailwind, alias e token, poi `add` copia i componenti. Cosa serve prima e cosa scrive il CLI.
In sintesi
- shadcn/ui non è una dipendenza: `init` copia configurazione e componenti nel progetto, con licenza MIT.
- Servono Tailwind CSS configurato, un alias `@/*` e un file CSS globale: senza questi tre, gli import non risolvono.
- `info` e `--dry-run` mostrano cosa il CLI legge e cosa scriverebbe, prima di toccare i file.
Risposta breve: dalla radice del progetto esegui npx shadcn@latest init, poi aggiungi un componente con npx shadcn@latest add button. Non installi un pacchetto: il CLI copia file TypeScript nel tuo repository.
Cosa serve prima di eseguire init
- Un progetto con
package.jsone Tailwind CSS già configurato: la guida 2026 assume Tailwind CSS 4. - Un alias di import come
@/*intsconfig.jsonojsconfig.json. - Il file CSS globale dove vivono i token del tema.
Se manca uno dei tre, init scrive comunque i file ma gli import non risolvono. L'errore tipico è Cannot find module '@/lib/utils', e la causa è nell'alias, non nel componente.
# 1. inizializza configurazione, dipendenze e token
npx shadcn@latest init
# 2. aggiungi il primo componente
npx shadcn@latest add button
Cosa scrive init nel progetto
components.json: alias, percorso del CSS, base color e stile.lib/utils.ts: la funzionecnche unisce le classi.- Le variabili CSS del tema nel file globale, più le dipendenze richieste dal componente.
Il comando non crea un pacchetto @shadcn/ui: i componenti finiscono in components/ui e da quel momento sono codice tuo. La licenza di shadcn/ui è MIT (repository), come Tailwind CSS e Radix UI, le primitive su cui poggiano i componenti.
L'esempio concreto: components.json
Il file che decide tutto è components.json, scritto da init e letto da ogni add. Se il percorso tailwind.css punta a un foglio che non esiste, i token non arrivano e i componenti escono senza colore.
{
"$schema": "https://ui.shadcn.com/schema.json",
"style": "new-york",
"rsc": true,
"tsx": true,
"tailwind": {
"config": "",
"css": "app/globals.css",
"baseColor": "neutral",
"cssVariables": true
},
"aliases": {
"components": "@/components",
"utils": "@/lib/utils",
"ui": "@/components/ui",
"lib": "@/lib",
"hooks": "@/hooks"
},
"iconLibrary": "lucide"
}
Leggi tre chiavi e sai se il progetto è coerente: aliases.ui decide dove finiscono i componenti, tailwind.css dove finiscono i token, tailwind.config resta vuoto con Tailwind CSS 4. Se una delle tre non corrisponde alla cartella reale, correggi prima di aggiungere il secondo componente.
Il controllo che evita la maggior parte dei problemi
npx shadcn@latest info
npx shadcn@latest add card --dry-run
info stampa la configurazione che il CLI legge davvero: se il percorso CSS o l'alias sono diversi da quelli che hai in testa, fermati qui. --dry-run elenca i file senza scriverli, così vedi in anticipo se il comando vuole toccare qualcosa che hai già modificato.
Monorepo e cartelle annidate
Il CLI cerca components.json nella cartella corrente, non risale l'albero. In un monorepo esegui il comando dal workspace che lo contiene, oppure passa -c con il percorso.
# dalla radice del repository
npx shadcn@latest add card -c apps/web
Limite dichiarato
La scelta cssVariables si fa in fase di init e vale per sempre: per passare da token CSS a utility inline la documentazione ufficiale dice di cancellare e reinstallare i componenti. Decidila prima di costruire dieci schermate, non dopo.
La regola di decisione
Regola: guarda quante registryDependencies dichiara il blocco. Fino a due, add è sicuro; oltre cinque, leggi la lista e aggiungi i componenti uno per volta, così il diff resta leggibile. Il massimo nel catalogo è venti, e un comando solo scriverebbe tutto insieme.
L'errore da evitare
Rieseguire add button su un componente già modificato è l'errore più costoso: il CLI sovrascrive il file senza chiedere e le tue modifiche spariscono senza un avviso. Fai un commit prima di ogni add; se il diff contiene file che non volevi toccare, git checkout li riporta indietro.
Dove continuare
Il catalogo EneUI parte dalla libreria shadcn, con record come la sidebar, e dalle 1.556 anteprime di blocchi. Per il passo successivo leggi come funzionano i blocchi shadcn e i registry privati; per la struttura del progetto, App Router nel 2026. Il confronto tra temi è in temi shadcn gratis o premium.
Domande frequenti
Devo installare shadcn/ui come pacchetto npm?
No. shadcn/ui non è una dipendenza da importare: il CLI copia i file dei componenti nel progetto e da quel momento li modifichi come codice tuo, con licenza MIT.
Funziona in un progetto con Tailwind CSS 3?
Sì, ma con un percorso separato: la documentazione corrente del 2026 assume Tailwind CSS 4 e le sue direttive CSS, mentre per un progetto fermo alla 3 esiste la sezione Legacy. Non mescolare le due guide.
Cosa succede se manca l'alias @/*?
Il CLI scrive i file, ma gli import interni non risolvono e la build fallisce con Cannot find module. Aggiungi il percorso in tsconfig.json e reinstalla il componente.
Posso annullare l'installazione?
Sì, se il progetto è in Git: git diff mostra i file scritti da init, git checkout li riporta indietro. Senza Git fai un backup prima di eseguire il comando.
Quante volte va eseguito init?
Una volta per workspace che contiene un components.json. Rieseguirlo sovrascrive la configurazione solo con --force, quindi non è un comando da lanciare a ogni componente.