# 前端开发规范 ## 技术栈 Next.js + TypeScript + React + Tailwind CSS + Zustand/Jotai + pnpm ### 核心依赖 - **实时通信**: SSE / WebSocket - **可视化**: Mermaid + 图谱可视化库 - **测试**: Vitest + Testing Library - **代码质量**: ESLint (flat config) + Prettier + Husky + lint-staged ## 开发命令 ```bash pnpm install # 安装依赖 pnpm add # 添加依赖 pnpm remove # 移除依赖 pnpm dev # 启动开发服务器 (默认端口 3000) pnpm build # 构建生产版本 pnpm start # 启动生产服务器 pnpm lint # 运行 ESLint 检查 pnpm type-check # TypeScript 类型检查 # 代码格式化(Prettier) pnpm format # 格式化全部文件 pnpm format:check # 检查格式是否合规(CI / 提交钩子使用) # 测试(Vitest) pnpm test # 运行全部测试(单次) pnpm test:watch # 监听模式 pnpm test:coverage # 运行测试并生成覆盖率报告 ``` ## 目录结构 ```text frontend/ ├── src/ │ ├── app/ # Next.js App Router │ │ ├── admin/ # 司命台管理控制台(增强 UI,开关驱动) │ │ ├── archive/ # 归档(记忆时间河) │ │ ├── characters/ # 人物 │ │ ├── chat/ # 对话 │ │ ├── memory/ # 记忆管理 │ │ ├── personality/ # 人格 │ │ ├── runs/[runId]/ # 运行轨迹 │ │ ├── tools/ # 工具调用 │ │ ├── error.tsx # 全局错误边界(Client,reset) │ │ ├── global-error.tsx # 根级错误兜底(自带 html/body) │ │ ├── layout.tsx # 根布局 │ │ ├── loading.tsx # 路由加载态 │ │ ├── not-found.tsx # 404 │ │ ├── page.tsx # 首页(重定向 /chat) │ │ └── template.tsx # 页面过渡动画 │ ├── components/ # React 组件(按功能域组织) │ │ ├── admin/ # 司命台签名组件(StarMap/VermilionAction…) │ │ ├── archive/ characters/ chat/ memory/ personality/ runs/ tools/ │ │ ├── layout/ # 应用壳层 / 侧栏 / 主题初始化 │ │ ├── shared/ # 共享状态视图(Empty/Error/Loading) │ │ └── ui/ # 通用 UI(Button/Card/BronzeMirror/Badge…) │ ├── lib/ │ │ ├── api/ # API 客户端(client.ts 统一出口 + 按域分模块) │ │ ├── constants/ # 枚举标签常量 │ │ ├── hooks/ # 自定义 Hooks │ │ ├── mock/ # Mock 数据层(无后端时驱动全页面) │ │ ├── stores/ # Zustand/Jotai stores │ │ └── utils/ # 工具函数(cn/format/error) │ ├── test/ # Vitest 全局 setup │ ├── types/ # TypeScript 类型定义 │ └── styles/ # 全局样式(琉璃镜 token) ├── .husky/ # Git hooks(pre-commit) ├── public/ # 静态资源 ├── .env.local # 环境变量 (本地) ├── .lintstagedrc.json # lint-staged 配置 ├── eslint.config.mjs # ESLint flat config ├── vitest.config.ts # Vitest 配置 └── next.config.ts # Next.js 配置(rewrites 代理 /api/v1 → 后端) ``` > 组织约定:采用 `src/` 根 + `components` 按功能域分子目录 + `stores` 置于 `lib` 下的方式,不设独立 `features/` 顶层目录。浏览器请求经 `next.config.ts` 的 rewrites 同源代理到后端(规避跨域,含 SSE);认证与鉴权统一走 BFF:token 仅存于 httpOnly cookie,由 App Router 内的 `/api/auth/*`(认证)、`/api/proxy/*`(业务 REST 代理)、`/api/sse/*`(SSE 流式代理)在服务端读取并注入 Authorization,客户端 JS 不接触 token。 ## 代码规范 ### 页面设计 图标:统一使用 Lucide 图标,界面全程禁止使用表情符号。 设计标准:对标 Awwwards 顶级网站水准,达到 Awwwards、FWA、CSS Design Awards 每日最佳网站同等设计品质。 创意自由度:将浏览器视作交互式艺术画布,跳出传统布局框架,追求先锋视觉风格、实验性排版、流畅物理动效、极具冲击力的文字版式。 沉浸式体验:融合代码、高级渲染逻辑、图片素材,打造统一完整的精品页面,做出突破常规 UI 认知、令人惊艳的数字交互体验。 ### 通用规范 - 遵循 ESLint + Prettier 配置,提交前必须通过 lint 与格式检查 - 使用 TypeScript 严格模式 (`strict: true`),禁止使用 `any` 类型 - 组件使用函数式组件 + Hooks,优先使用 Server Components,必要时使用 `'use client'` - 文件命名: 组件使用 PascalCase (`UserProfile.tsx`),工具函数使用 camelCase (`formatDate.ts`) - 使用 `path` 别名 (`@/*`) 导入模块,避免相对路径层级过深 - 状态管理: 全局状态使用 Zustand/Jotai,局部状态使用 React useState/useReducer ### CSS 变量引用 CSS 变量引用遵循 **三层递进规则**,优先级由上至下。 #### 规则 ```text Tailwind 映射类 → 优先使用 Tailwind 任意值 [var(--)] → 仅当变量不在 @theme 映射表中时使用 内联 style → 仅限复合值 / 动态运行时值 ``` #### 具体对照 `globals.css` 的 `@theme inline {}` 块已映射的部分,直接用 Tailwind 类: ```tsx // ✅ 正确:变量在 @theme inline {} 中有 --color-X 映射 → 用 Tailwind 类