状态:建议执行方案 目标栈:保留 React + Vite + React Router,逐步引入 Tailwind CSS + shadcn/ui + Lucide Icons 适用范围:首页、设置、弹层、项目卡片、工作台壳层、后续高复杂工作台组件
当前前端并不落后,但已经明显进入 “设计系统不够统一、样式维护成本偏高” 的阶段。
当前问题不是框架本身,而是:
styles.css已经变大,视觉规则容易重复和互相覆盖- 首页、工作台、弹层虽然方向已经明确,但 UI primitives 还没有统一系统
- 图标语言正在从临时符号往正式产品图标过渡,需要统一落点
- 后续如果继续做首页、工作台、弹层和内容区优化,继续靠全局 CSS 手工扩张,维护成本会继续上升
所以这次迁移的重点不是“框架换代”,而是:
先把 UI 系统升级成现代、稳定、可复用的体系。
当前项目最值得升级的是:
- Tailwind CSS
- shadcn/ui
- Lucide Icons
而不是立刻切到 Next.js。
- 现有前端已经是 React 19 + Vite 7 + React Router 7
- 当前核心问题是 UI 体系,不是 SSR / App Router / 服务端渲染能力
- 如果现在直接全量迁 Next.js,收益不一定大于成本
迁移采用:
- 先底座
- 再低风险页面
- 再工作台外壳
- 最后高复杂交互区
这不是“保守”,而是为了保证:
- 工作流不中断
- 现有测试可以持续跟上
- UI 收益可以尽快显现
适合用 shadcn 的:
- Button
- Dialog
- Tabs
- Input / Textarea
- Select / Switch / Checkbox
- Tooltip
- DropdownMenu
- Badge / Alert / Card(低差异场景)
不适合直接拿 shadcn 当主骨架的:
- FileTree
- ChatPanel
- DocumentEditor
- WorkflowPanel
- 整个 Workbench shell
结论:
shadcn 是 primitives,不是你整个产品的形态语言。
- Claude + Stripe
- 目标:更像产品首页,而不是项目中心
借:
- Claude 的创作气质
- Stripe 的结构与 CTA 秩序
- Linear
- 目标:稳定、清晰、有秩序
借:
- 壳层结构
- rail / tabs / badge / status 层级
- Notion
- 目标:温和、低压、适合久写
借:
- 内容面的安静感
- 低压阅读面
- Vercel
- 目标:控件精度高、克制、统一
借:
- 按钮
- 输入
- 对话框
- 交互精度
- Mintlify
- 目标:清晰、轻文档感、好读
先把新 UI 体系搭起来,但不碰业务页面。
apps/web/package.json- 增加 Tailwind / Lucide / shadcn 依赖
apps/web/vite.config.ts- 接 Tailwind
apps/web/src/main.tsx- 接新的全局样式入口
- 新增:
apps/web/src/lib/utils.tsapps/web/src/components/ui/*apps/web/src/styles/globals.cssapps/web/src/styles/tokens.css(可选)
cn()- Button
- Dialog
- Tabs
- Input
- Badge
- Tooltip
- DropdownMenu
- Icon 规则
- 基础 token
- 不修改任何业务页面
- 所有现有测试继续通过
最先把用户可感知收益最大、同时风险最低的区域迁入新体系。
apps/web/src/features/startup/StartupScreen.tsxapps/web/src/features/startup/ProjectManagerPanel.tsxapps/web/src/features/startup/ProjectCard.tsxapps/web/src/features/startup/ProjectSwitchDialog.tsxapps/web/src/features/settings/ModelSettingsPanel.tsxapps/web/src/features/layout/BrandMark.tsx- 对应测试文件
- Button
- Dialog
- Tabs
- Input
- Badge
- Tooltip
- 首页 CTA 图标
- 顶栏图标
- 管理动作图标
- 设置图标
- 弹层图标
- 首页 Hero
- 顶部导航
- 设置弹层
- 项目卡片
- 布局和间距
- 路由行为
- 工作流逻辑
- startup/project API
- dirty draft 保护
- 首页、设置、弹层、项目卡片完成迁移
- 图标语言统一到 Lucide
- 用户主路径不变
- 浏览器 smoke 通过
把整体 shell 迁到新体系,但仍然不动高复杂内容区逻辑。
apps/web/src/App.tsx(视图层部分)apps/web/src/features/layout/TopBar.tsxapps/web/src/features/editor/EditorTabs.tsxapps/web/src/features/files/FileTree.tsx(壳层/toolbar 部分)apps/web/src/features/workflow/WorkflowPanel.tsx(壳层部分)apps/web/src/styles.css中 shell 相关区块
- Tailwind 负责 grid / spacing / shell background / rail layout
- shadcn 只借 Tabs、Tooltip、Badge、Dropdown 等 primitives
- shell 自己写,不套 dashboard 模板
- TopBar / shell / tabs / rail header 完成迁移
- 现有路由和工作流行为不变
- shell 风格统一到新体系
将最复杂的 4 块迁入新体系,但只迁视图层。
apps/web/src/features/chat/ChatPanel.tsxapps/web/src/features/editor/DocumentEditor.tsxapps/web/src/features/files/FileTree.tsx(深交互部分)apps/web/src/features/workflow/WorkflowPanel.tsx(深交互部分)
- 保留业务逻辑
- Tailwind 接管布局和视觉
- shadcn 不主导这 4 块的结构
- 允许拆成更细小的 presenter/view 组件
- 视觉统一
- 路由 / dirty draft / chat stream / workflow 不变
- 高复杂区域和新体系可以共存且无覆盖冲突
真正退役旧系统,而不是看起来迁完。
- 删除已迁页面对应的旧 CSS 块
- 清理重复 class
- 清理过时 icon 规则
- 确保只剩 token / legacy 未迁区块 / 新体系样式三类来源
- 不再出现“新旧两套样式互相覆盖”
- 已迁页面只有新体系负责显示
features/startup/*features/settings/*features/layout/*
features/editor/*features/files/*features/workflow/*features/chat/*
apps/server/*packages/shared/*- 后端 API 行为
- 首页 CTA
- 顶栏
- 管理动作
- 设置面板
- 弹层按钮
- rail 图标
- 文件树工具按钮
- workflow 状态图标
- 强业务语义的自定义图形
不是功能坏,而是进入 新旧样式混搭期。
- 已迁页面:新体系优先
- 未迁页面:旧 CSS 继续接管
- 不允许在同一组件里没有边界地混 Tailwind 和旧全局 class
工作台相关区域存在:
- URL 驱动状态
- dirty draft 保护
- pendingSwitch
- chat session
- workflow guard
这些都说明:
Phase 2 以后必须坚持“先迁视图层,后动状态层”。
如果现在就开始,最推荐的是:
- 完成 Phase 0
- 只做到 Phase 1
也就是:
- 接入 Tailwind
- 接入 shadcn
- 接入 Lucide
- 重做首页
- 重做设置弹层
- 重做项目切换弹层
- 重做项目卡片
这批最容易:
- 快速见效
- 低风险
- 最先把“产品感”和“系统一致性”拉起来
先迁 UI 系统,再迁页面,再考虑框架。
这份迁移方案的正确执行方式不是“赶紧换完”,而是:
让每一阶段都能独立交付、独立验证、独立回退。