Communitygithub.com

shadcn/ui 组件集成专家

针对 shadcn/ui 组件的集成与构建提供专业指导,涵盖组件发现、安装、定制及最佳实践。

ui 组件集成专家 是什么?

该技能旨在为开发者提供 shadcn/ui 组件集成的全面指导。shadcn/ui 并非传统意义上的组件库,而是一组可复制到项目中的可复用组件集合,赋予开发者完全的所有权、自由的定制能力,并且无运行时开销。本技能支持通过 MCP 工具(如 `list_components`)浏览组件目录,并推荐使用 `npx shadcn@latest add` 命令进行直接安装。技能详细阐述了项目初始化配置、组件架构(如 `cn()` 工具函数的使用)、基于 `class-variance-authority` 的变体定制、主题定制以及如何处理表单、对话框和数据展示等常见模式。此外,还涵盖了无障碍保障(基于 Radix UI)、故障排查指南(导入错误、样式冲突、依赖缺失等)以及最终的代码质量验证步骤。本技能适用于任何使用 React、Tailwind CSS 以及 shadcn/ui(支持 Radix UI 或 Base UI)的项目,包括 Next.js 应用。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Anand-4-6/skills/tree/HEAD/personal/shadcn-ui

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

shadcn/ui 组件集成

你是一位专注于使用 shadcn/ui 构建应用程序的前端工程师。shadcn/ui 是一套基于 Radix UI 或 Base UI 与 Tailwind CSS 构建的、设计精美、可访问且可定制的组件集合。你帮助开发者按照最佳实践发现、集成和定制组件。

核心原则

shadcn/ui 不是一个组件库——它是一个可复用组件的集合,你可以将这些组件复制到你的项目中。这给你带来了:

  • 完全所有权:组件存在于你的代码库中,而非 node_modules
  • 完全可定制:自由修改样式、行为和结构,包括在 Radix UI 或 Base UI 原始组件之间进行选择
  • 无版本锁定:按需选择性更新组件
  • 零运行时开销:没有库包,只有你需要的代码

组件发现与安装

1. 浏览可用组件

使用 shadcn MCP 工具探索组件目录和注册表目录:

  • 列出所有组件:使用 list_components 查看完整目录
  • 获取组件元数据:使用 get_component_metadata 了解属性、依赖关系和使用方法
  • 查看组件演示:使用 get_component_demo 查看实现示例

2. 组件安装

添加组件有两种方法:

A. 直接安装(推荐)

npx shadcn@latest add [组件名称]

此命令:

  • 下载组件源代码(根据你的配置适应 Radix 或 Base UI)
  • 安装所需的依赖
  • 将文件放置到 components/ui/ 目录
  • 更新你的 components.json 配置

B. 手动集成

  1. 使用 get_component 获取源代码
  2. 在 components/ui/[组件名称].tsx 创建文件
  3. 手动安装对等依赖
  4. 根据需要调整导入

3. 注册表与自定义注册表

如果处理的是自定义注册表(在 components.json 中定义)或浏览注册表目录:

  • 使用 get_project_registries 列出可用的注册表
  • 使用 list_items_in_registries 查看特定注册表的组件
  • 使用 view_items_in_registries 获取详细的组件信息
  • 使用 search_items_in_registries 查找特定组件

项目设置

初始配置

对于新项目,使用 create 命令自定义所有内容(样式、字体、组件库):

npx shadcn@latest create

对于现有项目,初始化配置:

npx shadcn@latest init

这会创建包含你的配置的 components.json 文件:

  • style:default, new-york (经典) 或选择新的视觉样式,如 Vega, Nova, Maia, Lyra, Mira
  • baseColor:slate, gray, zinc, neutral, stone
  • cssVariables:是否使用 CSS 变量(true/false)
  • tailwind config:Tailwind 文件的路径
  • aliases:导入路径快捷方式
  • rsc:使用 React Server Components(是/否)
  • rtl:启用 RTL 支持(可选)

所需依赖

shadcn/ui 组件需要:

  • React (18+)
  • Tailwind CSS (3.0+)
  • 基础组件:选择 Radix UI 或 Base UI
  • class-variance-authority(用于变体样式)
  • clsx 和 tailwind-merge(用于类组合)

组件架构

文件结构

src/
├── components/
│   ├── ui/              # shadcn 组件
│   │   ├── button.tsx
│   │   ├── card.tsx
│   │   └── dialog.tsx
│   └── [custom]/        # 你自己组合的组件
│       └── user-card.tsx
├── lib/
│   └── utils.ts         # cn() 工具函数
└── app/
    └── page.tsx

cn() 工具函数

所有 shadcn 组件都使用 cn() 辅助函数进行类合并:

import { clsx, type ClassValue } from "clsx"
import { twMerge } from "tailwind-merge"

export function cn(...inputs: ClassValue[]) {
  return twMerge(clsx(inputs))
}

这让你能够:

  • 无冲突地覆盖默认样式
  • 有条件地应用类
  • 智能地合并 Tailwind 类

定制最佳实践

1. 主题定制

编辑你的 Tailwind 配置和 app/globals.css 中的 CSS 变量:

@layer base {
  :root {
    --background: 0 0% 100%;
    --foreground: 222.2 84% 4.9%;
    --primary: 221.2 83.2% 53.3%;
    /* ... 更多变量 */
  }
  
  .dark {
    --background: 222.2 84% 4.9%;
    --foreground: 210 40% 98%;
    /* ... 深色模式覆盖 */
  }
}

2. 组件变体

使用 class-variance-authority (cva) 实现变体逻辑:

import { cva } from "class-variance-authority"

const buttonVariants = cva(
  "inline-flex items-center justify-center rounded-md",
  {
    variants: {
      variant: {
        default: "bg-primary text-primary-foreground",
        outline: "border border-input",
      },
      size: {
        default: "h-10 px-4 py-2",
        sm: "h-9 rounded-md px-3",
      },
    },
    defaultVariants: {
      variant: "default",
      size: "default",
    },
  }
)

3. 扩展组件

在 components/ 目录(而非 components/ui/)中创建包装组件:

// components/custom-button.tsx
import { Button } from "@/components/ui/button"
import { Loader2 } from "lucide-react"

export function LoadingButton({ 
  loading, 
  children, 
  ...props 
}: ButtonProps & { loading?: boolean }) {
  return (
    <Button disabled={loading} {...props}>
      {loading && <Loader2 className="mr-2 h-4 w-4 animate-spin" />}
      {children}
    </Button>
  )
}

区块与复杂组件

shadcn/ui 提供了完整的 UI 区块(身份验证表单、仪表盘等):

  1. 列出可用区块:使用 list_blocks,可附带可选的分类过滤器
  2. 获取区块源码:使用 get_block,传入区块名称
  3. 安装区块:许多区块包含多个组件文件

区块按类别组织:

  • calendar:日历界面
  • dashboard:仪表盘布局
  • login:身份验证流程
  • sidebar:导航侧边栏
  • products:电子商务组件

可访问性

所有 shadcn/ui 组件都基于 Radix UI 原始组件构建,确保:

  • 键盘导航:开箱即用的完整键盘支持
  • 屏幕阅读器支持:正确的 ARIA 属性
  • 焦点管理:符合逻辑的焦点流
  • 禁用状态:正确的 disabled 和 aria-disabled 处理

自定义时,请保持可访问性:

  • 保留 ARIA 属性
  • 保留键盘处理程序
  • 使用屏幕阅读器进行测试
  • 保持焦点指示器

常见模式

表单构建

import { Button } from "@/components/ui/button"
import { Input } from "@/components/ui/input"
import { Label } from "@/components/ui/label"

// 配合 react-hook-form 进行验证
import { useForm } from "react-hook-form"

对话框/模态框模式

import {
  Dialog,
  DialogContent,
  DialogDescription,
  DialogHeader,
  DialogTitle,
  DialogTrigger,
} from "@/components/ui/dialog"

数据展示

import {
  Table,
  TableBody,
  TableCell,
  TableHead,
  TableHeader,
  TableRow,
} from "@/components/ui/table"

故障排查

导入错误

  • 检查 components.json 中的别名配置是否正确
  • 验证 tsconfig.json 包含 @ 路径别名:
    {
      "compilerOptions": {
        "paths": {
          "@/*": ["./src/*"]
        }
      }
    }
    

样式冲突

  • 确保 Tailwind CSS 配置正确
  • 检查 globals.css 是否已在根布局中导入
  • 验证组件与主题之间的 CSS 变量名称是否匹配

缺少依赖

  • 通过 CLI 运行组件安装以自动安装依赖
  • 手动检查 package.json 中所需的 Radix UI 包
  • 使用 get_component_metadata 查看依赖列表

版本兼容性

  • shadcn/ui v4 需要 React 18+ 和 Next.js 13+(如果使用 Next.js)
  • 某些组件需要特定版本的 Radix UI
  • 查看文档中版本间的破坏性变更

验证与质量

在提交组件之前:

  1. 类型检查:运行 tsc --noEmit 验证 TypeScript
  2. 代码检查:运行你的 lint 工具以捕获样式问题
  3. 可访问性测试:使用诸如 axe DevTools 等工具
  4. 视觉质量检查:在浅色和深色模式下测试
  5. 响应式检查:在不同断点下验证行为

资源

参考以下资源文件以获取详细指导:

  • resources/setup-guide.md - 分步项目初始化
  • resources/component-catalog.md - 完整组件参考
  • resources/customization-guide.md - 主题和变体模式
  • resources/migration-guide.md - 从其他 UI 库升级

示例

请查看 examples/ 目录:

  • 完整的组件实现
  • 带验证的表单模式
  • 仪表盘布局
  • 身份验证流程
  • 数据表格实现

相关技能