๐ ๅฝๅไฝ็ฝฎ: ๆถๆๅพ (2/8) | ๅฏผ่ช: โ ไธไธ็ฏ: ๆป่ง | โ ไธไธ็ฏ: ๆ ธๅฟๅ็ฐ | ๐ ็ฎๅฝ
shadcn-ui ๆถๆๅพ#
ๆฌๆๆกฃไฝฟ็จ Mermaid ๅพ่กจๅ ASCII ๅพๆฅๅฏ่งๅ shadcn-ui ็ๆถๆ่ฎพ่ฎกใ
1. ็ณป็ปๆป่ง#
graph TB
subgraph "็จๆท้กน็ฎ"
A[็จๆทไปฃ็ ] --> B[components/ui/]
A --> C[components.json]
end
subgraph "shadcn-ui ้กน็ฎ"
D[CLI ๅทฅๅ
ท<br/>packages/shadcn] --> E[Registry API]
F[ๅฎ็ฝ<br/>apps/v4] --> G[็ปไปถๆณจๅ่กจ<br/>registry/]
G --> H[public/r/]
end
subgraph "ๅค้จไพ่ต"
I[@radix-ui/react-*]
J[Tailwind CSS]
K[React Hook Form]
end
D -.->|npx shadcn add| B
D -->|่ทๅ็ปไปถ| H
B --> I
B --> J
F -->|ๆๅปบ| H
G -->|build-registry| H
style A fill:#e1f5ff
style D fill:#fff4e6
style F fill:#f3e5f5
style H fill:#e8f5e92. Monorepo ็ปๆ#
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ shadcn-ui Monorepo โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ โโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ apps/v4/ โ โ packages/shadcn/ โ โ
โ โ (Next.js 16) โ โ (CLI ๅทฅๅ
ท) โ โ
โ โโโโโโโโโโโโโโโโโโโโโโค โโโโโโโโโโโโโโโโโโโโโโโโค โ
โ โ โข app/ โ โ โข src/ โ โ
โ โ โข registry/ โ โ โโ commands/ โ โ
โ โ โข components/ โ โ โโ registry/ โ โ
โ โ โข content/docs/ โ โ โโ utils/ โ โ
โ โ โข scripts/ โ โ โโ mcp/ โ โ
โ โ โโ build- โ โ โข dist/ โ โ
โ โ registry.mts โ โ โโ index.js โ โ
โ โ โข public/r/ โโโโโโโโโค โ โ
โ โโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ โ โ
โ โ โ โ
โ โผ โผ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ packages/tests/ โ โ
โ โ (้ๆๆต่ฏ) โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
pnpm workspace + Turbo ๆๅปบ็ฎก้3. Registry ็ณป็ปๆถๆ#
sequenceDiagram
participant User as ็จๆท็ป็ซฏ
participant CLI as shadcn CLI
participant API as Registry API
participant CDN as ui.shadcn.com/r/
participant Local as ๆฌๅฐ้กน็ฎ
User->>CLI: npx shadcn@latest add button
CLI->>Local: ่ฏปๅ components.json
CLI->>API: resolveRegistryDependencies(button)
API->>CDN: GET /r/styles/new-york-v4/button.json
CDN-->>API: {files, dependencies, registryDependencies}
API->>API: ้ๅฝ่งฃๆ registryDependencies
API-->>CLI: ่ฟๅๅฎๆดไพ่ตๆ
CLI->>CLI: ๅๅนถ npm ไพ่ต
CLI->>User: ๅฎ่ฃ
@radix-ui/react-slot
CLI->>Local: ๅๅ
ฅ components/ui/button.tsx
CLI->>Local: ๆดๆฐ components/ui/label.tsx (ไพ่ต)
CLI-->>User: โ ็ปไปถๆทปๅ ๆๅ4. Registry ๆฐๆฎๆต#
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Registry ๆๅปบๆต็จ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ registry/bases/{base}/registry.ts โ
โ (ๅฎไนๅบ็ก็ปไปถๅ้
็ฝฎ) โ
โโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ buildBasesIndex() โ
โ โข ้ช่ฏ Zod schema โ
โ โข ็ๆ __index__.tsx โ
โโโโโโโโโโโโโฌโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Base ร Style ็ฉ้ต็ปๅ โ
โ base-new-york โ
โ base-los-angeles โ
โ base-miami โ
โ radix-new-york โ
โ radix-los-angeles โ
โ radix-miami โ
โโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ transformStyle() โ
โ โข ่ฏปๅ style-*.css โ
โ โข ๅๅปบๆ ทๅผๆ ๅฐ (styleMap) โ
โ โข AST ่ฝฌๆข className โ
โโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ buildRegistry() โ
โ โข ็ๆ JSON ๆไปถ โ
โ โข ๅ็ผฉๆไปถๅ
ๅฎน โ
โโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ public/r/styles/{style}/ โ
โ โข button.json โ
โ โข dialog.json โ
โ โข form.json โ
โ โข ... 55+ ็ปไปถ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
[CDN / Vercel ้จ็ฝฒ]5. ็ปไปถไพ่ตๅ ณ็ณปๅพ#
graph TD
Dialog[Dialog] --> Button
Dialog --> Label
Dialog -.->|npm| RadixDialog[@radix-ui/react-dialog]
Button -.->|npm| RadixSlot[@radix-ui/react-slot]
Label -.->|npm| RadixLabel[@radix-ui/react-label]
Form[Form] --> Button
Form --> Label
Form --> Input
Form -.->|npm| RHF[react-hook-form]
Form -.->|npm| Zod[zod]
Input -.->|npm| RadixSlot2[@radix-ui/react-slot]
Table[Table] --> Badge
Table --> Button
DataTable[Data Table] --> Table
DataTable --> Pagination
DataTable -.->|npm| TanStack[@tanstack/react-table]
style Dialog fill:#ffcdd2
style Form fill:#f8bbd0
style DataTable fill:#e1bee7
style Button fill:#c5e1a5
style Label fill:#c5e1a5
style Input fill:#c5e1a5ๅพไพ๏ผ
- ๅฎ็บฟ็ฎญๅคด๏ผregistryDependencies (็ปไปถไพ่ต)
- ่็บฟ็ฎญๅคด๏ผdependencies (npm ๅ ไพ่ต)
- ็ปฟ่ฒ๏ผๅบ็ก็ปไปถ
- ็บข่ฒ/็ฒ่ฒ๏ผๅคๅ็ปไปถ
6. ไธๅฑไพ่ต็ณป็ป#
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Dialog ็ปไปถไพ่ตๆ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
dialog
โโ dependencies (npm ๅ
)
โ โโ @radix-ui/react-dialog@^1.0.5
โ
โโ registryDependencies (็ปไปถ)
โ โโ button
โ โ โโ dependencies
โ โ โโ @radix-ui/react-slot@^1.0.2
โ โ
โ โโ label
โ โโ dependencies
โ โโ @radix-ui/react-label@^2.0.2
โ
โโ devDependencies
โโ (ๆ )
ๅๅนถๅ็ npm ไพ่ต๏ผ
โข @radix-ui/react-dialog@^1.0.5
โข @radix-ui/react-slot@^1.0.2
โข @radix-ui/react-label@^2.0.2
้่ฆๅคๅถ็ๆไปถ๏ผ
โข components/ui/dialog.tsx
โข components/ui/button.tsx
โข components/ui/label.tsx7. CLI ๅทฅไฝๆต็จ#
stateDiagram-v2
[*] --> Init: npx shadcn@latest init
Init --> ConfigCreated: ๅๅปบ components.json
ConfigCreated --> TailwindSetup: ๅฎ่ฃ
Tailwind CSS
TailwindSetup --> CSSVarsSetup: ้
็ฝฎ CSS ๅ้
CSSVarsSetup --> PathAliasSetup: ่ฎพ็ฝฎ่ทฏๅพๅซๅ
PathAliasSetup --> Ready: ๅๅงๅๅฎๆ
Ready --> Add: npx shadcn@latest add [component]
Add --> ResolveDeps: ่งฃๆไพ่ต
ResolveDeps --> DownloadFiles: ไธ่ฝฝๆไปถ
DownloadFiles --> InstallNpm: ๅฎ่ฃ
npm ๅ
InstallNpm --> UpdateConfig: ๆดๆฐ้
็ฝฎ
UpdateConfig --> WriteFiles: ๅๅ
ฅๆไปถ
WriteFiles --> ComponentAdded: ็ปไปถๆทปๅ ๆๅ
ComponentAdded --> Diff: npx shadcn@latest diff [component]
Diff --> CompareVersions: ๅฏนๆฏๆฌๅฐไธ่ฟ็จ
CompareVersions --> ShowDiff: ๆพ็คบๅทฎๅผ
ShowDiff --> Ready: ๅณๅฎๆฏๅฆๆดๆฐ
ComponentAdded --> Ready
Ready --> [*]8. ็ฝ็ซ่ทฏ็ฑๆถๆ#
apps/v4/app/
โ
โโโ (app)/ # ไธปๅบ็จ่ทฏ็ฑ็ป
โ โโโ page.tsx # ้ฆ้กต
โ โ
โ โโโ docs/[[...slug]]/ # ๆๆกฃ็ณป็ป
โ โ โโโ page.tsx # ๅจๆๆๆกฃ้กต้ข
โ โ โโ /docs/installation
โ โ โโ /docs/components/button
โ โ โโ /docs/...
โ โ
โ โโโ blocks/ # Block ๅฑ็คบ
โ โ โโโ page.tsx # Block ๅ่กจ
โ โ โโโ [name]/
โ โ โโโ page.tsx # ๅไธช Block
โ โ
โ โโโ charts/ # ๅพ่กจ็คบไพ
โ โ โโโ [type]/
โ โ โโโ page.tsx
โ โ
โ โโโ examples/ # ๅฎๆด็คบไพ
โ โโโ [name]/
โ โโโ page.tsx
โ
โโโ (view)/ # ้ข่ง่ทฏ็ฑ็ป (iframe)
โ โโโ view/[style]/[name]/
โ โโโ page.tsx # ็ปไปถ้็ฆป้ข่ง
โ
โโโ (create)/ # ๅๅปบๅๅฏผ
โ โโโ create/[...slug]/
โ โโโ page.tsx
โ
โโโ api/ # API ่ทฏ็ฑ
โโโ og/ # Open Graph ๅพ็
โโโ route.ts9. ็ปไปถ้ข่ง็ณป็ป#
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ComponentPreview ๆธฒๆ็ญ็ฅ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโ
โ type ๅคๆญ โ
โโโโโโโโฌโโโโโโโ
โ
โโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโ
โ โ
โผ โผ
type="block" type="component"
โ โ
โผ โผ
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ
โ ็งปๅจ็ซฏ้ข่ง โ โ ๅฎๆถๆธฒๆ โ
โ โข PNG ๅพ็ โ โ โข <Component/> โ
โ (light/dark) โ โ โข ไปฃ็ ้ซไบฎ โ
โโโโโโโโโโโโโโโโโโโ โ โข ๅคๅถๆ้ฎ โ
+ โโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโโ
โ ๆก้ข็ซฏ้ข่ง โ
โ โข iframe โ
โ โข ๅฎๅ
จ้็ฆป โ
โ โข ็ฌ็ซๆ ทๅผ โ
โโโโโโโโโโโโโโโโโโโ10. ๆๅปบ็ฎก้#
graph LR
A[pnpm build] --> B{Turbo ๅนถ่กๆง่ก}
B --> C[packages/shadcn]
C --> C1[tsup ๆๅปบ]
C1 --> C2[็ๆ dist/]
C2 --> C3[ๅคๅ
ฅๅฃ็นๅฏผๅบ]
B --> D[apps/v4]
D --> D1[registry:build]
D1 --> D2[build-registry.mts]
D2 --> D3[็ๆ public/r/]
D3 --> D4[next build]
D4 --> D5[้ๆ็ๆ]
C3 --> E[ๅฎๆ]
D5 --> E
style A fill:#e3f2fd
style E fill:#c8e6c911. ็ผๅญ็ญ็ฅ#
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๅๅฑ็ผๅญๆถๆ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Registry ็ผๅญ โ
โ โข LRU (max: 500) โ
โ โข TTL: 5 ๅ้ โ
โ โข Key: style:name โ
โ โข ็ผๅญๅฎๆด็ปไปถๆฐๆฎ โ
โโโโโโโโโโโโโโฌโโโโโโโโโโโโโโ
โ
โผ
[getRegistryItem()]
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ไปฃ็ ้ซไบฎ็ผๅญ โ
โ โข LRU (max: 500) โ
โ โข TTL: 1 ๅฐๆถ โ
โ โข Key: sha256(code+lang)โ
โ โข ็ผๅญ HTML ้ซไบฎ็ปๆ โ
โโโโโโโโโโโโโโฌโโโโโโโโโโโโโโ
โ
โผ
[highlightCode()]
โ
โผ
[่ฟๅ้ซไบฎ็ HTML]12. ไธป้ข็ณป็ป#
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ CSS ๅ้ๅฑๆฌก โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
:root (ๅ
จๅฑ)
โโ --background: 0 0% 100%
โโ --foreground: 240 10% 3.9%
โโ --primary: 240 5.9% 10%
โโ --primary-foreground: 0 0% 98%
โโ --secondary: 240 4.8% 95.9%
โโ --muted: 240 4.8% 95.9%
โโ --accent: 240 4.8% 95.9%
โโ --destructive: 0 84.2% 60.2%
โโ --border: 240 5.9% 90%
โโ --input: 240 5.9% 90%
โโ --ring: 240 5.9% 10%
โโ --chart-1 ~ --chart-5
โโ --radius: 0.5rem
โ
โผ
@media (prefers-color-scheme: dark)
โโ --background: 240 10% 3.9%
โโ --foreground: 0 0% 98%
โโ ... (ๆๆ้ข่ฒๅ่ฝฌ)
โ
โผ
tailwind.config.ts ๆ ๅฐ
โโ background: "hsl(var(--background))"
โโ foreground: "hsl(var(--foreground))"
โโ primary: {
โ DEFAULT: "hsl(var(--primary))",
โ foreground: "hsl(var(--primary-foreground))"
โ }
โโ ...
โ
โผ
Tailwind ็ฑปๅ
โโ bg-background
โโ text-foreground
โโ bg-primary
โโ text-primary-foreground
โโ ...13. Form ็ณป็ป Context ๆถๆ#
graph TD
A[FormProvider<br/>react-hook-form] --> B[Form ็ปไปถ]
B --> C[FormField]
C --> D[FormFieldContext<br/>ๆงๅถๅญๆฎตๅ]
D --> E[FormItem]
E --> F[FormItemContext<br/>็ฎก็ ID]
F --> G[FormLabel]
F --> H[FormControl]
F --> I[FormDescription]
F --> J[FormMessage]
H --> K[Input / Select / Textarea]
style A fill:#ffccbc
style B fill:#ffccbc
style C fill:#ffe0b2
style E fill:#ffe0b2
style D fill:#fff9c4
style F fill:#fff9c4
style G fill:#c5e1a5
style H fill:#c5e1a5
style I fill:#c5e1a5
style J fill:#c5e1a5
style K fill:#80deeaARIA ่ชๅจๅ ณ่๏ผ
FormControl (id="field-form-item")
โ
aria-describedby="field-form-item-description field-form-item-message"
โ
FormDescription (id="field-form-item-description")
FormMessage (id="field-form-item-message")14. CVA ๅไฝ็ณป็ป#
buttonVariants
โ
โโ baseClasses (ๅง็ปๅบ็จ)
โ "inline-flex items-center ..."
โ
โโ variants
โ
โโ variant ่ฝด
โ โโ default โ bg-primary text-primary-foreground
โ โโ destructive โ bg-destructive text-white
โ โโ outline โ border bg-background
โ โโ secondary โ bg-secondary text-secondary-foreground
โ โโ ghost โ hover:bg-accent
โ โโ link โ text-primary underline
โ
โโ size ่ฝด
โโ default โ h-9 px-4 py-2
โโ sm โ h-8 px-3
โโ lg โ h-10 px-6
โโ icon โ size-9
โโ icon-sm โ size-8
โโ icon-lg โ size-10
็ปๅ็คบไพ๏ผ
buttonVariants({ variant: "destructive", size: "lg" })
โ
"inline-flex items-center ... bg-destructive text-white h-10 px-6"15. MCP (Model Context Protocol) ้ๆ#
sequenceDiagram
participant AI as AI ๅฉๆ
participant MCP as MCP ๆๅกๅจ<br/>packages/shadcn/src/mcp
participant CLI as shadcn CLI
participant Project as ็จๆท้กน็ฎ
AI->>MCP: ่ฐ็จ add_component ๅทฅๅ
ท
MCP->>CLI: ๆง่ก add ๅฝไปค
CLI->>Project: ๆทปๅ ็ปไปถ
Project-->>CLI: ๆๅ
CLI-->>MCP: ่ฟๅ็ปๆ
MCP-->>AI: ็ปไปถๅทฒๆทปๅ
AI-->>AI: ็ปง็ปญๅฏน่ฏMCP ๅทฅๅ ทๅ่กจ๏ผ
packages/shadcn/src/mcp/tools.ts
โโ add_component # ๆทปๅ ็ปไปถ
โโ init_project # ๅๅงๅ้กน็ฎ
โโ diff_component # ๆฅ็ๅทฎๅผ
โโ list_components # ๅๅบๅฏ็จ็ปไปถ
โโ get_component_info # ่ทๅ็ปไปถไฟกๆฏๆป็ป#
shadcn-ui ็ๆถๆ่ฎพ่ฎกไฝ็ฐไบไปฅไธ็น็น๏ผ
- ๆธ ๆฐ็ๅๅฑ: Monorepo ็ปๆๆธ ๆฐๅ็ฆป CLIใๅฎ็ฝใๆต่ฏ
- ็ตๆดป็ Registry: ๆฏๆๅคๆบใๅค้ฃๆ ผใ็ๆฌ็ฎก็
- ๅผบๅคง็ไพ่ต่งฃๆ: ไธๅฑไพ่ต็ณป็ป่ชๅจๅค็ๅคๆไพ่ต
- ้ซๆง่ฝ: ๅๅฑ LRU ็ผๅญ + React.lazy + Turbopack
- ๅผๅ่ ๅๅฅฝ: CLI + ๆๆกฃ + MCP + ่ฏฆ็ป็คบไพ
- ็ฐไปฃๅๆๆฏๆ : Next.js 16 + React 19 + TypeScript 5.5 + Tailwind 4
่ฟๅฅๆถๆไธบๆๅปบ็ฑปไผผ็็ปไปถๅๅ็ณป็ปๆไพไบๅฎๆด็ๅ่่ไพใ