Skip to content

11 - UI 开发策略

1. 核心原则

功能骨架先行 → 丑但能用 → 验证商业价值 → AI 一轮美化

理由:

  • 50% 的功能上线后发现不需要,早期美化 = 浪费
  • AI 美化 UI 的效率极高,一轮对话翻新一个页面
  • shadcn/ui 默认样式已经足够专业,不像毛坯房

2. Web 端技术栈

只需要这一套,不引入其他 UI 库:

工具用途为什么选它
shadcn/ui组件库复制到项目中完全可控,默认样式专业,后期改源码不受制于库
Tailwind CSS样式AI 写 Tailwind 极其熟练,实用类不需要命名
Radix UI无头组件shadcn 底层,交互逻辑完备(键盘导航、无障碍)
Lucide图标和 shadcn 风格一致,按需导入

为什么不选 Ant Design / MUI / Chakra

shadcn/uiAnt Design / MUI
代码归属复制到你项目里,完全可控在 node_modules,受制于库的版本
后期美化直接改组件源码要和库的样式系统对抗
AI 兼容性AI 对 Tailwind 极其熟练AI 经常写出过时的 API 用法
包体积按需引入,零冗余整包较重
默认样式简洁现代明显的"后台管理系统"味道

3. 移动端技术栈选型

根据需求复杂度选择,从轻到重:

方案一:响应式 Web(最轻,推荐起步)

适用:不需要原生能力(摄像头、推送、离线)
技术:Next.js + Tailwind 响应式 + PWA
成本:零额外技术栈,只需加响应式样式

做法:在现有 Next.js 项目上加 Tailwind 响应式断点即可。

typescript
// 已有的 PC 页面
<div className="grid grid-cols-4 gap-6">

// 加上移动端适配
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4 md:gap-6">

加 PWA 支持(可安装到手机桌面):

typescript
// next.config.js + next-pwa
const withPWA = require('next-pwa')({ dest: 'public' })
module.exports = withPWA({ /* next config */ })

优点:零学习成本,一套代码,AI 处理响应式很熟练 缺点:无法调用原生能力,体验不如原生 App

方案二:React Native + Expo(原生体验,推荐正式移动端)

适用:需要原生体验、推送通知、摄像头等
技术:React Native + Expo + NativeWind
成本:新项目,但复用 React 技能和后端 API

为什么选 Expo 而不是裸 React Native:

Expo裸 React Native
环境搭建npx create-expo-app 即用需要配 Xcode + Android Studio
构建发布EAS Build 云端构建本地构建,环境问题多
原生模块Expo SDK 覆盖 90% 常用能力需要手动 link 原生模块
AI 开发效率高,结构简单中,原生桥接问题 AI 容易出错
热更新EAS Update 支持 OTA 更新需要 CodePush 等第三方

移动端 UI 组件库选择:

定位推荐度
NativeWind在 React Native 中用 Tailwind 语法强烈推荐 — AI 写 Tailwind 最熟练,Web 端经验直接复用
TamaguiWeb + Native 通用组件推荐 — 如果需要 Web 和 Native 共享组件
React Native PaperMaterial Design 组件可选 — 类似 shadcn 的开箱即用
Gluestack UINativeBase 继任者可选 — 组件丰富,文档完善

推荐组合

Expo + NativeWind + React Native Paper

理由:

  • Expo 简化构建和发布
  • NativeWind 让你用 Tailwind 写样式(和 Web 端一致,AI 效率最高)
  • React Native Paper 提供开箱即用的组件(类似移动端的 shadcn)

项目结构

mobile-app/                    # 独立项目,复用后端 API
├── app/                       # Expo Router(类似 Next.js App Router)
│   ├── (tabs)/                # Tab 导航
│   │   ├── index.tsx          # 首页
│   │   ├── search.tsx         # 搜索
│   │   └── profile.tsx        # 个人中心
│   ├── _layout.tsx            # 根布局
│   └── [id].tsx               # 动态路由
├── components/                # 组件
├── services/                  # API 调用(复用后端接口)
├── hooks/                     # 自定义 Hooks
└── types/                     # 类型定义(可从 Web 端复制)

方案三:Capacitor(Web 套壳,折中方案)

适用:已有 Web 应用,想快速上架 App Store
技术:Next.js + Capacitor
成本:在现有 Web 项目上加壳,改动最小
bash
npm install @capacitor/core @capacitor/cli
npx cap init
npx cap add ios
npx cap add android

优点:现有 Web 代码几乎不改,能调用部分原生能力 缺点:性能和体验不如 React Native,复杂交互有卡顿

方案四:Taro(推荐国内多端场景)

适用:需要微信小程序 + H5,可选 React Native
技术:Taro 3.x + React + NutUI
成本:一套代码编译到多端,React 技能直接复用

为什么选 Taro:

Tarouni-app
语法React/Vue 均支持,推荐 ReactVue 为主
TypeScript原生支持,开发体验好支持但生态偏弱
小程序微信/支付宝/百度/字节全覆盖同样全覆盖
AI 兼容性React 语法 AI 最熟练Vue 语法 AI 也熟练
社区京东维护,中文生态完善DCloud 维护,中文生态完善

推荐组合

Taro 3.x + React + NutUI + TypeScript

项目结构

taro-app/
├── src/
│   ├── pages/              # 页面
│   │   ├── index/
│   │   └── detail/
│   ├── components/         # 组件
│   ├── services/           # API 调用(复用后端接口)
│   ├── types/              # 类型定义
│   └── app.config.ts       # 多端配置
├── config/                 # 编译配置
└── project.config.json     # 小程序项目配置

优点:一套代码多端运行,React 生态 + 中文社区完善 缺点:复杂原生能力不如 React Native,调试链路较长

选择决策树

需要移动端吗?
├── 不确定 → 先做响应式 Web + PWA(方案一)
├── 需要微信小程序 → Taro(方案四,推荐国内场景)
├── 需要上架 App Store,原生要求不高 → Capacitor 套壳(方案三)
└── 需要原生体验/推送/摄像头 → React Native + Expo(方案二)

推荐技术栈总览

Web 端:   React / Next.js + TypeScript + Tailwind + shadcn/ui + Prisma
移动端:   Taro 3.x + React + NutUI(国内多端)
          React Native + Expo + NativeWind(海外/原生体验)
后端:     Node.js + TypeScript + Prisma + PostgreSQL/SQLite

4. 三阶段 UI 开发工作流

第一阶段:功能骨架(不关心好不好看)

目标:数据流跑通,交互逻辑正确。

提示词:
"用 shadcn/ui 实现 [页面名] 页面的功能骨架:
- 数据展示用 Table
- 表单用 Form + zod 校验
- 操作反馈用 Toast
- 不需要花时间在样式上,能用就行
- 先跑通数据流:组件 → API → Service → 数据库"

防止 AI 过度设计的关键提示词:

功能优先,不要花时间在样式上。
使用 shadcn/ui 默认样式,不要自定义。
只做 [具体功能],不要加额外的 UI 优化。
不要加动画、渐变、阴影等装饰性样式。

这个阶段的组件选择:

要展示列表     → Table(简单)/ DataTable(带分页排序)
要用户填表     → Form + zod
要确认操作     → AlertDialog(危险操作)/ Dialog(普通弹窗)
要反馈结果     → Toast
要选择选项     → Select(单选)/ Combobox(可搜索)
要开关设置     → Switch
要导航菜单     → 顶部 NavigationMenu / 侧边 Sidebar
要展示卡片     → Card
要加载等待     → Skeleton
要标签分类     → Badge
要分步操作     → Tabs

每个页面必须处理三种状态:

tsx
// 加载中
if (isLoading) return <Skeleton />

// 空数据
if (data.length === 0) return <EmptyState message="暂无数据" />

// 错误
if (error) return <Alert variant="destructive">{error.message}</Alert>

// 正常展示
return <DataTable data={data} />

第二阶段:功能验证(跑真数据)

关注:数据流正确、校验完整、错误状态处理 不关注:颜色、间距、动画、响应式

第三阶段:UI 美化(功能稳定后)

这是 AI 效率最高的环节。功能已经稳定,改的是样式不是逻辑,风险很低。

推荐做法:先用 /product-design 生成 docs/design-spec.md,AI 美化时直接读取 Token 系统获取确定的色值/间距/字体,多页面视觉自动统一。无 design-spec.md 时回退到自然语言描述(每次会话可能不一致)。

提示词模板(有 design-spec.md 时):
"按 docs/design-spec.md 的 Token 系统做 UI 美化,保持现有功能不变,只改样式,加基础响应式"

提示词模板(无 design-spec.md 时):
"对整个应用做 UI 美化:风格简洁现代,配色中性灰 + [强调色],优化间距/字体/颜色统一,加基础响应式,保持功能不变"
提示词模板(单页面美化):
"美化 [页面名] 页面:
- 参考 [网站/截图](如果有)
- 重点优化视觉层次和间距
- 不改功能逻辑"

如果需要更精细的风格控制,使用 ui-ux-pro-max Skill:

"用 ui-ux-pro-max 给这个应用做整体美化,
风格:minimalism,配色方案:slate + blue accent"

设计参考资源

美化阶段需要设计参考。核心原则:选有现成代码实现的设计系统作基础,再用截图参考指导风格,AI 还原度最高。

可直接出代码的组件库

资源链接用途
shadcn/uiui.shadcn.com首选组件库,复制粘贴即用
Magic UImagicui.design动效组件,适合有动画的界面
Aceternity UIui.aceternity.com炫酷现代组件,含现成代码
Tailwind UItailwindui.com官方付费组件库,设计模式可参考

AI 编程专用工具

工具链接用途
v0.devv0.devVercel 出品,自然语言生成 React UI,可直接复制代码或作参考
21st.dev21st.devAI 友好的组件集合
Realtime Colorsrealtimecolors.com预览配色在真实页面的效果,选好色值告诉 AI

截图参考来源

来源链接最佳用法
Mobbinmobbin.com截取真实 App 界面,让 AI "照这个风格做"
Godlygodly.website截取网页设计,让 AI 还原布局
Dribbbledribbble.com搜具体场景(dashboard UI、pricing page),截图作 prompt
Figma Communityfigma.com/community免费 UI Kit,截图给 AI 生成对应代码

Figma MCP 工作流

配置 Figma MCP 后(见 doc-05 §4.2),支持设计稿与代码的双向流转。

Figma → Code(Design-to-Code):

在 Figma 选中目标 Frame → 复制链接 → 粘贴到 Claude Code → AI 自动调用 get_design_context(结构化布局)+ get_screenshot(视觉参考)→ 审查生成代码 → Playwright 截图对比验证还原度。

Code → Figma(2026 新能力,需 Remote MCP):

调用 generate_figma_design 将运行中的 UI 推送到 Figma → 设计师在 Figma 标注/精修 → 开发者通过 MCP 拉取更新继续迭代。

Code Connect — 组件映射桥梁:

设置后 MCP 响应包含真实 import 语句和属性映射,AI 直接复用已有组件:

  • 无代码方式:Figma 内 Code Connect UI 面板,为组件绑定代码片段
  • CLI 方式npx figma connect setup → 编写映射文件 → npx figma connect publish
  • 自定义指令:在 Figma 组件上添加 "Add instructions for MCP",指导 AI 使用方式

组件优先的渐进式实现:

先用 get_variable_defs 提取设计 tokens,再从小到大逐层实现:Design Tokens → 原子组件(button, input) → 组合组件(card, nav) → 页面区域 → 完整页面。

大文件处理: get_design_context 对复杂页面可能返回 35 万+ token。先用 get_metadata 获取高层节点地图,再按节点 ID 逐段调用 get_design_context 获取特定区域,分段实现。

关键提示:

  • 逐组件生成,不要一次选择整个页面
  • 指定技术栈:"使用 shadcn/ui 组件 + 项目 design token,不要 inline style"
  • 配置 Code Connect 后优先复用已有组件,避免从零生成

美化阶段推荐工作流

1. 找参考 → Mobbin / Godly / Dribbble 找到喜欢的设计,截图保存
2. 定配色 → Realtime Colors 确认配色方案,记录具体色值
3. 给 AI  → 截图 + 文字需求一起发("参考这个风格,做一个后台 Dashboard")
4. 指定栈 → 要求使用 shadcn/ui + Tailwind,生成代码质量最高
5. 迭代   → 先出基础结构,再逐步调整细节

5. 可用的 MCP 和 Skill

MCP 配置

json
{
  "mcpServers": {
    "shadcn": {
      "command": "npx",
      "args": ["-y", "@anthropic/shadcn-ui-mcp@latest"]
    },
    "context7": {
      "command": "npx",
      "args": ["-y", "@upstash/context7-mcp@latest"]
    },
    "playwright": {
      "command": "npx",
      "args": ["@playwright/mcp@latest"]
    },
    "figma": {
      "type": "http",
      "url": "https://mcp.figma.com/mcp"
    }
  }
}
MCPUI 开发中的用途
shadcn MCP查组件用法、获取示例代码、发现可用组件
Context7查 Next.js/React 最新 API、Tailwind 新特性
Playwright美化后截图验证 UI 是否正确渲染
Figma MCP从设计稿提取结构化布局和 design tokens(见 §4.3 和 doc-05 §4.2)

/ui-page Skill

markdown
---
name: ui-page
description: >
  快速生成 UI 页面骨架。新增页面时使用。
  用 shadcn/ui 默认样式,功能优先不美化。
---

# 快速 UI 页面生成

生成页面 "$ARGUMENTS":

## 规则
- 使用 shadcn/ui 组件,不自定义样式
- 使用项目现有的 layout 结构
- 列表用 Table,表单用 Form + zod,弹窗用 Dialog
- 必须处理三种状态:加载中(Skeleton)、空数据、错误
- 必须连接真实 API,不用 mock 数据
- 不做样式美化

## 页面类型速查
| 类型 | 组件组合 |
|------|---------|
| 列表页 | Table + Pagination + 搜索 Input + 新增 Button |
| 详情页 | Card + Tabs + 返回 Button |
| 表单页 | Form + zod schema + Submit Button + Toast |
| 仪表盘 | Card 网格 + 数字统计 |

## 步骤
1. 确认页面类型和数据来源(API 接口)
2. 检查 shadcn/ui 是否已安装需要的组件,未安装则先安装
3. 生成页面组件 + 对应的 API Route(如果还没有)
4. 跑通数据流,验证功能正确

IMPORTANT:功能优先。不要花时间在颜色、间距、动画上。

6. 写入 CLAUDE.md 的 UI 规则

markdown
## UI 开发规则

- 使用 shadcn/ui 组件库,不引入其他 UI 库
- 功能开发阶段使用默认样式,不做自定义美化
- 每个页面必须处理三种状态:加载中、空数据、错误
- 表单必须用 zod 做校验
- 新增页面前先检查 /components/ui 中已有哪些组件
- NEVER 从零写 CSS,全部用 Tailwind 实用类
- NEVER 在功能未稳定时花时间美化 UI
- NEVER 引入 Ant Design / MUI / Chakra 等其他组件库

## Figma MCP 规则(配置 Figma MCP 后添加)

- 使用 MCP 提供的 localhost 图片/SVG 源,不额外引入图标包
- 优先使用项目 src/components/ui 中已有的组件
- 匹配 Figma 设计保真度,布局和间距以设计稿为准
- 使用设计 tokens 而非硬编码颜色/间距值

7. 移动端额外的 CLAUDE.md 规则

如果使用 Taro(推荐国内场景)

markdown
## 移动端规则(Taro)

- 使用 Taro 3.x + React 语法
- 组件使用 NutUI(京东风格,Taro 深度适配)
- 路由使用 Taro Router,页面在 app.config.ts 中注册
- API 调用复用 Web 端相同的后端接口
- 共享类型定义(从 Web 端 types/ 复制)
- 样式用 CSS Modules 或 Tailwind(通过 weapp-tailwindcss 插件)
- NEVER 直接使用 wx.xxx 原生 API,用 Taro.xxx 封装
- NEVER 在页面组件中直接调用接口,统一走 services/ 层

如果使用 React Native

markdown
## 移动端规则(React Native)

- 使用 Expo Router 做路由(类似 Next.js App Router)
- 样式使用 NativeWind(Tailwind 语法)
- 组件使用 React Native Paper
- API 调用复用 Web 端相同的后端接口
- 共享类型定义(从 Web 端 types/ 复制或用 monorepo)
- NEVER 使用 React Native 的 StyleSheet.create(用 NativeWind)
- NEVER 直接操作原生模块,优先使用 Expo SDK

8. 与其他子系统的关系

产品设计契约:/product-design 生成 product-spec.md + design-spec.md,为 UI 开发提供确定性输入
CLAUDE.md:UI 开发规则写入
Skills:/ui-page 读取 product-spec + design-spec 后生成页面骨架
MCP:shadcn MCP 查组件、Context7 查文档、Playwright 截图验证、Figma MCP 提取 Token
Hooks:post-edit-format.sh 自动格式化 TSX 文件
测试:Playwright E2E 覆盖核心用户流程(用例从 product-spec 用户旅程转化)
可靠性:UI 层的测试覆盖要求最低(组件渲染测试即可)

面向个人开发者的 AI 辅助编程工程化方案