Vibe Tutorial
界面 UI 与交互 UX

5.3 组件化思维 shadcn ui

Tip

理解组件化思维,学会用shadcn/ui构建可复用的UI组件,让AI能直接修改源码。


1. 为什么要学这个?

你正在做一个像淘宝一样的电商网站。首页有一个"立即购买"的红色按钮,商品详情页也有一个"加入购物车"的红色按钮,结账页还有一个"去支付"的红色按钮。

一开始,你在三个HTML文件里都写了<button class="bg-red-500 rounded p-2 text-white">

第二天,设计师说:"红色太刺眼了,全部换成橙色,圆角改大一点。"

你崩溃了,因为你必须去寻找散落在代码各处的每一个按钮,一个个修改。漏掉一个,网站就显得不伦不类。


2. 核心概念

2.1 组件(Component)

技术定义:组件化(Component-Based Architecture)是将用户界面拆分为独立的、可复用的代码片段。每个组件包含自己的逻辑(JS)、结构(HTML)和样式(CSS)。

就像自定义的HTML标签。

  • 作用:把一长串HTML和CSS封装成一个叫<Button />的新标签
  • 好处:以后在任何地方使用<Button>点击我</Button>,修改样式时只需要修改这个"模具"
  • 效果:全世界所有用它的地方都会自动变样

2.2 shadcn/ui - AI时代的特殊组件库

市面上的组件库:

  • Ant Design、MUI:像黑盒,装在node_modules里,很难修改内部细节

shadcn/ui的特殊之处:

  • 白盒:通过脚本把组件的源代码直接复制粘贴到你的项目里
  • AI友好:AI可以直接读取组件的源码,理解它的构造,并根据你的需求任意修改
  • 完全控制:没有任何黑盒限制

3. shadcn/ui工作流

graph TD
    subgraph VibeCoding["AI驱动的组件开发"]
        User[用户: 我要个登录表单] -->|Prompt| AI[Cursor / Vercel AI]
        AI -->|查阅| Doc[Shadcn文档]
        AI -->|生成命令| CLI[npx shadcn@latest add button input label]
        CLI -->|下载源码| Local[项目目录 /components/ui]
        Local -->|引用| Page[登录页面代码]
        Page -->|渲染| UI[最终界面]
    end
    
    style Local fill:#fff9c4
    style CLI fill:#29b6f6

4. 适用场景

🎯 场景 推荐组件库
快速做个后台管理 Ant Design / MUI:大而全,开箱即用,但长得都一样
Vibe Coding / 极致定制 shadcn/ui:它是代码,不是包,你可以完全控制它
手搓简单的着落页 Headless UI + Tailwind:只提供逻辑,不提供样式

5. AI提示词技巧

❌ 不要说:

"写个表单"

✅ 应该说:

"请使用shadcn/ui的Card, Input, Button组件,构建一个登录表单。
表单使用react-hook-form管理状态,使用zod进行校验。"

6. 避坑指南

✅ 推荐做法 ❌ 禁忌
把通用UI放到/components/ui 每次需要按钮都重写一遍<div className="...">
修改shadcn组件源码 害怕修改下载下来的组件源码(它就是给你改的!)
统一设计系统(Design System) 这个页面用Antd的按钮,那个页面用MUI的输入框(大忌!)

7. 真实案例

Story

2009年,谷歌的"50度蓝"实验

在Material Design统一谷歌的设计语言之前,谷歌的界面是一团乱麻。Marissa Mayer(当时的谷歌高管)做了一个著名的实验:她让设计师无法决定Gmail广告链接到底用哪种蓝色最好,于是让工程师测试了41种不同的蓝色(从深蓝到浅蓝),把它们随机展示给全球用户,看哪种蓝色的点击率最高。虽然这个实验据说帮谷歌多赚了2亿美元,但它也导致了谷歌当时的代码极其混乱。每个页面的蓝色都不一样,因为它们是硬编码的,而不是引用的同一个组件变量。这直接导致了后来谷歌痛定思痛,推出了Material Design——全公司统一的组件系统,结束了视觉上的诸侯割据。

Vibe心法:使用shadcn/ui追求"透明度"——当AI能直接修改底层源码时,你才算真正掌握了界面的主权。


8. 本章小结

  1. 🧩 组件即标签:将复杂的实现封装为<Button />这样的自定义标签
  2. 📦 白盒优势:shadcn/ui允许你直接把源码复制到项目里,拥有完全的控制权
  3. 🎨 一致性:组件化是防止设计分崩离析(如谷歌的41种蓝)的唯一解药
  4. 🤖 AI友好:AI可以直接读取和修改组件源码