小岛AI
| ONLINE |

posts/shadcn-ui-skill.md

做后台 UI 别再反复手搓组件,4.9 万人装的 shadcn Skill

小岛AI 2026 / 09 / 08

做后台设置页最磨人的地方,往往不是业务逻辑。

是那一串看着都很小的东西:一个带错误态的邮箱输入框,一组开关,一个确认弹窗,再塞两张卡片。每个都能写,合在一起就开始长出 space-y-*、裸颜色和一堆临时 div。页面能跑,过两周谁也不敢碰。

最近看到 shadcn/ui 的官方 Agent Skill,安装量已经到 4.9 万,仓库有 12.3 万 Star。它不负责替你画页面,只要求 Coding Agent 在加组件前,先弄明白项目已经有什么、该查什么、哪些写法别碰。

安装命令在这里:

npx skills add https://github.com/shadcn-ui/ui --skill shadcn

这不是又多了一份组件目录。它把「加一个表单」这种看似简单、实际最容易写歪的活,变成一条有顺序的工作流。

先别急着写 JSX,先看项目底牌

官方 Skill 的第一步是:

npx shadcn@latest info --json

这条命令会告诉 Agent 这个项目的路径别名、Tailwind 版本、组件目录、底层 primitive、图标库和框架上下文。很多 UI 返工,就是从跳过这一步开始的。

比如同样要做一个设置页,项目也许已经有 CardTabsField,图标库却不是默认的 lucide-react。如果 Agent 不先看上下文,最常见的结局是手写一份看似正常的组件,再留下一条错误 import,或者在旧样式旁边堆出第二套颜色规则。

接着再查组件和文档:

npx shadcn@latest search @shadcn -q "settings"
npx shadcn@latest docs tabs card field
npx shadcn@latest add tabs card

顺序别颠倒。先搜索,确认注册表里有没现成东西;再拿到当前 API 和示例;真的需要时才添加。更新已有组件前还要先用 --dry-run--diff 看改动。

Skill 真正管的是那些小到容易被忽略的规矩

它的规则里有几条特别适合后台页面。

表单不要再拿一个 divlabelspace-y-* 直接拼。官方建议用 FieldGroupFieldFieldLabel 把结构和状态放在该在的位置。校验时,外层 Fielddata-invalid,控件本身用 aria-invalid

下面是官方规则里表达的对照。它是组件约定,不是这篇文章的本地跑分。

// 容易越写越散的写法
<div className="space-y-4">
  <label>邮箱</label>
  <input aria-invalid={hasError} />
</div>

// 让结构和校验状态待在同一处
<FieldGroup>
  <Field data-invalid={hasError || undefined}>
    <FieldLabel htmlFor="email">邮箱</FieldLabel>
    <Input id="email" aria-invalid={hasError || undefined} />
    <FieldDescription>用于接收变更通知</FieldDescription>
 </Field>
</FieldGroup>

这段代码看着没多神。可一旦一个设置页有十几个字段,错误提示、禁用态、辅助文案和无障碍属性不再各写各的,维护成本就开始往下掉。不是哥们,最怕的从来不是少一个组件,是每一个组件都长得像独立创业项目。

从散乱表单块到可组合组件的整理过程

把表单结构和状态放回各自组件,不是让页面更花哨,而是让下一次改动有地方可落。

卡片、弹窗、空状态也是同一思路。Card 该有 CardHeaderCardTitleCardDescriptionCardContentCardFooter;弹窗和抽屉需要标题,哪怕标题只给读屏软件用;空状态用 Empty,不要再复制一个会闪烁的 animate-pulse 盒子冒充加载态。

它还顺手卡住了几个 CSS 小习惯:纵向间距用 flex flex-col gap-*,别用 space-y-*;等宽高用 size-*;状态颜色优先走 Badge 变体和语义 token,别把 text-emerald-600 撒满业务代码。你可以不同意这些取舍,但至少团队不会每个人都在同一张表单上发明一种新方言。

skills.sh 上的 shadcn 官方 Skill 页面

这张图来自 skills.sh 的公开页面。热度只能说明很多人正在关注,不能替你验证它适不适合自己的项目。

它不替你做设计,正好是它的边界

这里得泼一盆小水。shadcn Skill 能让组件组合更一致,不能替你决定「这个设置页到底该露出几项」「用户为什么要看到这个指标」「该不该把危险操作放在主按钮」。它管理的是实现的秩序,不是产品判断。

页面还没想清楚时,直接往里塞 Tabs、Card 和 Dialog,只会得到一套更整齐的迷宫。先把用户动作、信息优先级和空状态想明白,再让 Skill 把已经想明白的部分落成能维护的代码。这个分工挺舒服:设计权还在人手里,重复劳动交给组件和规则。

如果你今天正赶一个后台页面,可以只记住这四步:先跑 info,再 search,接着看 docs,才 add。有现成组件就组合,涉及本地修改就先看 diff。别把「能渲染」误当成「可维护」。

官方资料在 skills.sh 安装页shadcn/ui 的 Skill 源码

你们团队现在最常被手搓的 UI,是表单、空状态,还是确认弹窗?