ð åœåäœçœ®: äžé¡µçºžæ»ç» (7/8) | 富èª: â äžäžç¯: æŠå¿µå°åŸ | â äžäžç¯: å¯è§åæå | ð ç®åœ
shadcn-ui äžé¡µçºžæ»ç»#
äžåŒ çºžçæ shadcn-ui çæææ žå¿æŠå¿µ
ð¯ äžå¥è¯æ»ç»#
- shadcn-ui æ¯ä»ä¹ïŒ äžäžªå€å¶ç²èŽŽåŒç React ç»ä»¶ç³»ç»ïŒéè¿ CLI å°æºä»£ç çŽæ¥å€å¶å°äœ ç项ç®äž
- æ žå¿åæ°æ¯ä»ä¹ïŒ Registry ç³»ç» + BaseÃStyle ç©éµïŒå®ç°ç»ä»¶åååå€è®Ÿè®¡ç³»ç»å Œå®¹
- 䞺ä»ä¹è¿æ ·è®Ÿè®¡ïŒ å®å šå¯æ§ïŒæºä»£ç åšäœ ç项ç®ïŒ+ é¶è¿è¡æ¶ïŒæå»ºæ¶çæïŒ+ é«åºŠçµæŽ»ïŒå¯éæä¿®æ¹ïŒ
ð æ žå¿æ¶æäžåŸæµ#
çšæ·é¡¹ç®
â
npx shadcn add
â
âââââââŽââââââ
â CLI â
âââââââ¬ââââââ
â
读å components.json
style: "radix-new-york"
â
â
âââââââââââââââââââââââââââ
â Registry URL æš¡æ¿ â
â /r/styles/{style}/{name} â
âââââââââââ¬ââââââââââââââââ
â
GET /r/styles/radix-new-york/button.json
â
â
âââââââââââââââââââââââ
â Registry Item â
â ⢠files â
â ⢠dependencies â
â ⢠registryDeps â
âââââââââââ¬ââââââââââââ
â
éåœè§£æäŸèµ + å®è£
npm
â
â
åå
¥ components/ui/
â
â
ç»ä»¶æ·»å 宿ðïž æ¶æäžå±æš¡å#
âââââââââââââââââââââââââââââââââââââââââââââââ
â 第 1 å±: Base (åºå±å®ç°) â
â ââ radix (åºäº Radix UI) â
â ââ base (åºäº Base UI) â
â â
â äœçš: æäŸåèœåæ éç¢ â
â ç¹ç¹: API ç»äžïŒäœåºå±åºäžå â
ââââââââââââââââââââ¬âââââââââââââââââââââââââââ
â
à (ç¬å¡å°ç§¯)
â
ââââââââââââââââââââŽâââââââââââââââââââââââââââ
â 第 2 å±: Style (è§è§é£æ Œ) â
â ââ new-york (é»è®€) â
â ââ los-angeles (ç°ä»£) â
â ââ miami (掻å) â
â â
â äœçš: å®ä¹è§è§åç° â
â ç¹ç¹: CSS æ ·åŒæ å° â
ââââââââââââââââââââ¬âââââââââââââââââââââââââââ
â
= (æå»ºæ¶çæ)
â
ââââââââââââââââââââŽâââââââââââââââââââââââââââ
â 第 3 å±: æç»ç»ä»¶ (6 ç§ç»å) â
â ââ radix-new-york â
â ââ radix-los-angeles â
â ââ radix-miami â
â ââ base-new-york â
â ââ base-los-angeles â
â ââ base-miami â
â â
â èŸåº: public/r/styles/{style}/{name}.json â
âââââââââââââââââââââââââââââââââââââââââââââââðš 7 倧 API 讟计暡åŒ#
| æš¡åŒ | æ žå¿ä»·åŒ | å žåç»ä»¶ | å ³é®ä»£ç |
|---|---|---|---|
| 1. CVA åäœ | ç±»åå®å šçåäœç®¡ç | Button, Badge | cva("base", { variants: {...} }) |
| 2. 倿ç»ä»¶ | äžäžªç»ä»¶å€ç§çšé | Button, Label | asChild ? Slot : "button" |
| 3. Compound | çµæŽ»ç»å + ç¶æå ±äº« | Dialog, Select | <Dialog><DialogContent /></Dialog> |
| 4. Context | é¿å prop drilling | Form, Sidebar | useFormField() |
| 5. æå°å è£ | ä¿æç®å | Separator, Switch | åªæ·»å æ ·åŒïŒéäŒ props |
| 6. data-slot | æµè¯å奜 | ææç»ä»¶ | data-slot="button" |
| 7. ååºåŒ | ç§»åšç«¯äŒå | Sidebar | isMobile ? Sheet : åºå®äŸ§èŸ¹æ |
ð äžå±äŸèµç³»ç»#
{
// 第 1 å±: npm å
ïŒå€éšåºïŒ
dependencies: ["@radix-ui/react-dialog"],
// 第 2 å±: Registry ç»ä»¶ïŒå
¶ä» shadcn ç»ä»¶ïŒ
registryDependencies: ["button", "label"],
// 第 3 å±: åŒåäŸèµïŒç±»åå®ä¹çïŒ
devDependencies: []
}
// CLI èªåšéåœè§£æåå®è£
dialog â button â @radix-ui/react-slot
â label â @radix-ui/react-labelð¯ æ žå¿è®Ÿè®¡å³ç#
å³ç 1: å€å¶ç²èŽŽ vs npm å ïŒ#
| 绎床 | npm å | shadcn-ui |
|---|---|---|
| æ§å¶æ | â æé | â å®å š |
| å®å¶æ§ | â props | â æºä»£ç |
| Bundle | â å 嫿æ | â æé |
| æŽæ° | â èªåš | â ïž æåš diff |
éæ©: shadcn-uiïŒçºç²äŸ¿æ·æ§ïŒæ¢å坿§æ§ïŒ
å³ç 2: Radix UI vs Base UIïŒ#
| æ¹æ¡ | äŒå¿ | å£å¿ |
|---|---|---|
| åªçš Radix | æççš³å® | æäºç»ä»¶çŒºå€± |
| åªçš Base UI | åèœå®æŽ | èŸæ°ïŒçæå° |
| 䞀è éœæ¯æ | â åèœäºè¡¥ | â ïž ç»Žæ€ææ¬ |
éæ©: 䞀è éœæ¯æïŒBase à Style ç©éµïŒ
å³ç 3: Compound Components vs PropsïŒ#
// â Props æš¡åŒïŒäžçµæŽ»ïŒ
<Dialog title="Confirm" footer={<Button>OK</Button>} />
// â
Compound ComponentsïŒçµæŽ»ïŒ
<Dialog>
<DialogContent>
<DialogTitle>Confirm</DialogTitle>
<DialogFooter><Button>OK</Button></DialogFooter>
</DialogContent>
</Dialog>éæ©: Compound ComponentsïŒçµæŽ»æ§ > äŸ¿æ·æ§ïŒ
ð å ³é®å®ç°æºå¶#
æºå¶ 1: æ ·åŒèœ¬æ¢#
bases/radix/ui/button.tsx
â å
å« cn-button å äœç¬Š
transformStyle(source, styleMap)
â AST 蜬æ¢
radix-new-york/ui/button.tsx
â æ¿æ¢äžºå®é
Tailwind ç±»æºå¶ 2: API å·®åŒæ¹å¹³#
Radix UI API Base UI API
asChild render
Overlay Backdrop
Content Popup
â â
ç»äžå
è£
䞺 shadcn API
â â
DialogOverlay DialogOverlay
DialogContent DialogContentæºå¶ 3: éåœäŸèµè§£æ#
add dialog
ââ è§£æ registryDependencies: ["button", "label"]
ââ éåœå€ç button
â ââ dependencies: ["@radix-ui/react-slot"]
ââ éåœå€ç label
â ââ dependencies: ["@radix-ui/react-label"]
ââ åå¹¶å»é
ââ æ¹éå®è£
ð¡ 10 å€§æ žå¿æŽå¯#
- å€å¶ç²èŽŽæ¯èåŒèœ¬å - ä»äŸèµèœ¬åæºä»£ç æ§å¶
- Registry äžä» æ¯ååš - æ¯ååç³»ç» + äŸèµç®¡ç + çæ¬æ§å¶
- Base à Style æ¯å ³æ³šç¹å犻 - å®ç°åæ ·åŒå®å šè§£èŠ
- CVA + Tailwind æ¯å®çŸç»å - ç±»åå®å š + é¶è¿è¡æ¶
- Radix UI æäŸæ éç¢åºç¡ - WAI-ARIA + é®ç富èª
- Form ç³»ç»å±ç€º Context é«çº§çšæ³ - åå± Context + èªåš ARIA
- æ§èœäŒååšç»èäž - LRU çŒå + React.lazy + å¹¶è¡è¯»å
- data-slot æ¯æµè¯å奜讟计 - çš³å®çéæ©åš + æ ·åŒé犻
- ç°ä»£ CSS ç¹æ§åºçš - has-[]ã[&_svg]ãå®¹åšæ¥è¯¢
- MCP åè®®æ¯åç»æ§è®Ÿè®¡ - AI åççç»ä»¶æ·»å äœéª
ð åŠä¹ è·¯åŸéæ¥#
30 åéå¿«éçè§£#
00-START-HERE â 03-key-findings (第äžè) â 06-concept-map2-3 å°æ¶ç³»ç»åŠä¹ #
00-START-HERE â 01-README (åäžç« ) â 04-api-design (第äºç« )
â 05-multi-base â 03-key-findings1-2 倩深床ç ç©¶#
第äžå€©: 01-README + 02-architecture + 05-multi-base
第äºå€©: 04-api-design + 03-key-findings + æºç é
读ð ç¥è¯åŸè°±#
shadcn-ui
â
âââââââââââââââââŒââââââââââââââââ
â â â
讟计ç念 å®ç°æ¶æ 讟计暡åŒ
â â â
ââââââŽâââââ ââââââŽâââââ ââââââŽâââââ
â â â â â â
å€å¶ç²èŽŽ 坿§æ§ Registry BaseÃStyle 7倧暡åŒ
â â â â â â
ââââââ¬âââââ ââââââ¬âââââ ââââââ¬âââââ
â â â
çšæ·å®å
šæ§å¶ ç»ä»¶åå APIç»äžð å ³é®æä»¶çŽ¢åŒ#
æ¶ææ žå¿#
apps/v4/registry/bases/- Base å®ç°æºæä»¶apps/v4/registry/styles/- Style æ ·åŒå®ä¹apps/v4/scripts/build-registry.mts- æå»ºèæ¬
CLI æ žå¿#
packages/shadcn/src/commands/add.ts- æ·»å ç»ä»¶packages/shadcn/src/registry/schema.ts- Registry Schemapackages/shadcn/src/registry/api.ts- Registry API
ç»ä»¶ç€ºäŸ#
apps/v4/registry/bases/radix/ui/button.tsx- Radix æé®apps/v4/registry/bases/base/ui/dialog.tsx- Base å¯¹è¯æ¡apps/v4/registry/bases/radix/ui/form.tsx- Form ç³»ç»
â çè§£æ£éªæž å#
åŠä¹ 宿åïŒäœ åºè¯¥èœå€åçïŒ
- 䞺ä»ä¹éæ©å€å¶ç²èŽŽèé npm å ïŒ
- Registry ç³»ç»è§£å³äºåªäºé®é¢ïŒ
- Base à Style ç©éµåŠäœå·¥äœïŒ
- åŠäœæ¹å¹³ Radix UI å Base UI çå·®åŒïŒ
- 7 倧 API 讟计暡åŒåèªçéçšåºæ¯ïŒ
- äžå±äŸèµç³»ç»äžºä»ä¹èŠåå±ïŒ
- æå»ºæµçšçèŸå ¥åèŸåºæ¯ä»ä¹ïŒ
- åŠäœå®ç°é¶è¿è¡æ¶ææ¬ïŒ
- data-slot 屿§æä»ä¹çšïŒ
- shadcn-ui ç讟计çå¿µå¯¹äœ æä»ä¹å¯åïŒ
ð äžäžæ¥è¡åš#
-
å®è·µ
npx create-next-app my-app cd my-app npx shadcn@latest init npx shadcn@latest add button dialog form -
ä¿®æ¹
- æåŒ
components/ui/button.tsx - ä¿®æ¹åäœææ ·åŒ
- ççææ
- æåŒ
-
æ¢çŽ¢
- 䜿çš
npx shadcn diff buttonæ¥çåæŽ - é è¯»å ¶ä»ç»ä»¶æºç
- çè§£æ¯äžªè®Ÿè®¡å³ç
- 䜿çš
-
莡ç®
- å建èªå·±ç Base æ Style
- æäº€ PR æ¹è¿ç»ä»¶
- åäº«äœ ççè§£
ð ææ¯æ æ»ç»#
åç«¯æ¡æ¶: React 19.2.3
Next.js: 16.0.10 (Turbopack)
æ ·åŒ: Tailwind CSS 4.1.11
æ 倎ç»ä»¶:
ââ Radix UI (äž»èŠ)
ââ Base UI (è¡¥å
)
ç±»å: TypeScript 5.5.3+
éªè¯: Zod
åäœ: CVA (class-variance-authority)
æå»º: pnpm + Turboð¯ æ žå¿ä»·åŒäž»åŒ #
å¯¹çšæ·#
- â å®å šæ§å¶ç»ä»¶æºä»£ç
- â é¶äŸèµïŒäžå¢å node_modules
- â é«åºŠå¯å®å¶
- â ç±»åå®å š
- â æ éç¢å 眮
对åŒåè #
- â åŠä¹ äŒç§çç»ä»¶è®Ÿè®¡
- â çè§£æ¶æè®Ÿè®¡æ¹æ³è®º
- â ææ¡ API 讟计æäœ³å®è·µ
- â äºè§£æè¡¡åå³çæè·¯
对瀟åº#
- â åæ°çç»ä»¶ååæš¡åŒ
- â åŒæºåéæ
- â æŽ»è·ç瀟åº
- â å®åçææ¡£å瀺äŸ
ð æéèŠç 5 䞪讟计åå#
- çšæ·è³äž - å®å šå¯æ§ïŒæ é»ç
- ç±»åå®å š - TypeScript äŒå
- ç»åäŒäºç»§æ¿ - Compound Components + Radix Primitive
- æå»ºæ¶äŒäºè¿è¡æ¶ - é¶è¿è¡æ¶ææ¬
- å¡å®äž»ä¹ - éæ©æå¥œçå·¥å ·å®æä»»å¡
ð¯ äžäŒ ç»ç»ä»¶åºçæ¬èŽšåºå«#
äŒ ç»ç»ä»¶åºæç»Ž:
ç»ä»¶ = npm å
â node_modules â import â 䜿çš
æ§å¶æ¹åŒ: props
å®å¶èœå: æé
äŸèµç®¡ç: package.json
shadcn-ui æç»Ž:
ç»ä»¶ = æºä»£ç â å€å¶å°é¡¹ç® â å®å
šå¯ä¿®æ¹ â 䜿çš
æ§å¶æ¹åŒ: çŽæ¥ä¿®æ¹æºç
å®å¶èœå: æ é
äŸèµç®¡ç: Registry + CLIæ¬èŽš: ä»"䜿çš"ç»ä»¶èœ¬å䞺"æ¥æ"ç»ä»¶
ð» åœä»€éæ¥#
# åå§åïŒéæ© Base å StyleïŒ
npx shadcn@latest init
# æ·»å ç»ä»¶
npx shadcn@latest add button
# æ¥çå·®åŒ
npx shadcn@latest diff button
# æŽæ°ç»ä»¶ïŒæåšç¡®è®€åïŒ
npx shadcn@latest add button --overwriteð 宿Žå·¥äœæµçš#
1. åå§å
npx shadcn init
ââ å建 components.json
ââ é
眮 style: "radix-new-york"
2. æ·»å ç»ä»¶
npx shadcn add button
ââ æå»º URL: /r/styles/radix-new-york/button.json
ââ è·åæ°æ®: { files, dependencies, registryDependencies }
ââ éåœè§£æäŸèµ
ââ å®è£
npm å
: @radix-ui/react-slot
ââ åå
¥æä»¶: components/ui/button.tsx
3. 䜿çšç»ä»¶
import { Button } from "@/components/ui/button"
<Button variant="destructive">Delete</Button>
4. èªå®ä¹ä¿®æ¹
æåŒ components/ui/button.tsx
ââ ä¿®æ¹ CVA åäœ
ââ æ·»å æ°æ ·åŒ
ââ å®å
šç±äœ æ§å¶
5. æ£æ¥æŽæ°
npx shadcn diff button
ââ æ¥çæ¬å°çæ¬ vs Registry çæ¬
ââ å³å®æ¯åп޿°ð è¯Šç»ææ¡£çŽ¢åŒ#
æ³äºè§£æ¶æïŒ#
â 01-README.md - MonorepoãRegistryãæå»ºç³»ç»
æ³çå¯è§åïŒ#
â 02-architecture-diagram.md - 15 äžªæ¶æåŸ
æ³å¿«éææ¡ïŒ#
â 03-key-findings.md - 10 äžªæ žå¿æŽå¯
æ³åŠ API 讟计ïŒ#
â 04-api-design-analysis.md - 7 倧讟计暡åŒ
æ³äºè§£å€ BaseïŒ#
â 05-multi-base-system-analysis.md - å Œå®¹æ¶æ
æ³çè§£å ³èïŒ#
â 06-concept-map.md - æŠå¿µå ³èåŸ
ð åŠä¹ 建议#
- äžèŠæ»è®°ç¡¬è - çè§£"䞺ä»ä¹"èäžæ¯"æ¯ä»ä¹"
- ç»åŸèŸ å©çè§£ - èªå·±ç»æ¶æåŸåæµçšåŸ
- å®è·µéªè¯ - å建æµè¯é¡¹ç®ïŒå®é 䜿çš
- 对æ¯åŠä¹ - 对æ¯äŒ ç»ç»ä»¶åºçå·®åŒ
- æºç é 读 - åšçè§£æ¶æååçæºç
ð æ»ç»#
shadcn-ui éè¿ä»¥äžåæ°éæ°å®ä¹äº React ç»ä»¶åºïŒ
- å€å¶ç²èŽŽæš¡åŒ - å°æ§å¶æäº€è¿ç»åŒåè
- Registry ç³»ç» - çµæŽ»çç»ä»¶ååæºå¶
- Base à Style ç©éµ - å®ç°åæ ·åŒå®å šè§£èŠ
- 7 å€§è®Ÿè®¡æš¡åŒ - ç±»åå®å š + çµæŽ»æ§ + äžèŽæ§
- æå»ºæ¶çæ - é¶è¿è¡æ¶ææ¬
- æ éç¢å 眮 - 宿Žç ARIA æ¯æ
è¿äžä» æ¯äžäžªç»ä»¶åºïŒæŽæ¯äžå¥ç»ä»¶ååå管ççæ°èåŒã
ð åŒå§æ·±å ¥åŠä¹ #
ç¹å»è¿éåŒå§ â 00-START-HERE.md
åæå®æäº 2026-01-17
åºäº shadcn-ui commit 1c989f91
åæå·¥å
·: Claude Code
ææ¡£äœçœ®: /Users/neoyusaki/developer/AI/shadcn-ui-analysis/