本文档定义前端项目的开发规范与最佳实践,供开发与 AI 助手共同遵循。具体依赖与脚本以 package.json 为准。
| 类别 | 技术 |
|---|---|
| 包管理 | Bun |
| 框架 | React 19、TypeScript |
| 数据与请求 | @tanstack/react-query、axios、Zustand |
| 路由 | @tanstack/react-router |
| 表格与列表 | @tanstack/react-table、@tanstack/react-virtual |
| 国际化 | i18next、react-i18next、i18next-browser-languagedetector |
| 日期 | Day.js |
| UI 与样式 | Base UI、Hugeicons、Tailwind CSS、clsx / class-variance-authority |
| 表单 | React Hook Form、Zod |
| 图表 | @visactor/vchart、@visactor/react-vchart |
| 工具 | qrcode.react、prettier、eslint、vitest(可选) |
优先选用成熟、维护良好的开源库;仅在现有库无法满足或需特殊适配时自行实现,并评估可维护性与通用性。
useTranslation() 的 t() 进行翻译。const { t } = useTranslation(),以保证语言切换时组件会重新渲染。import { t } from 'i18next';此类用法不会随语言切换自动更新,仅在不依赖响应式更新的场景使用。useTranslation(),子组件仍应自行使用,以保证独立性。翻译键:使用有层级、语义清晰的键名,如 dashboard.overview.title,并保持命名一致。
枚举与文案(常量中的 i18n)
各 feature 的 constants.ts 中常出现「枚举/状态 + 展示文案」或「成功/错误消息」,须统一约定以免遗漏 i18n、用法混乱:
SUCCESS_MESSAGES、ERROR_MESSAGES):常量值仅表示 i18n 键(与英文 fallback 同字面量)。展示时必须通过 t() 使用,例如 toast.success(t(SUCCESS_MESSAGES.API_KEY_CREATED))、toast.error(t(ERROR_MESSAGES.UNEXPECTED)),禁止直接 toast.success(SUCCESS_MESSAGES.xxx) 当作最终文案。t(config.labelKey) 渲染;或约定用 label 存与 en 一致的 key 字符串,组件用 t(config.label)。同一 feature 内只采用一种方式,避免混用。src/i18n/static-keys.ts 中登记对应 key(若项目用其做提取),或确保文案以 t('...') 字面量形式出现以便扫描,避免遗漏翻译。if-else、提前返回或抽取函数。单层三元可保留,但需简洁。any,优先具体类型或 unknown;为参数与返回值显式标注类型;仅类型用途的导入使用 import type { X } from '...'。bun run typecheck);若出现类型错误,须修复至无错误为止,不得遗留。props.xxx 更清晰,避免不必要的解构增加代码复杂度。props.xxx 访问属性,保持代码清晰(详见 3.2 代码风格与类型)。types 中。useMemo、useCallback 减少无效重渲染;避免在渲染路径中创建新对象/数组;必要时使用 React.memo。React.lazy 与动态 import 做按需加载,控制首屏与路由体积。create 定义 store,并为 state 与 actions 定义清晰类型。const user = useAuthStore((s) => s.auth.user)。src/stores/,单文件职责清晰,命名表意明确。useQuery,变更用 useMutation;为每个查询配置唯一 queryKey(建议数组形式、层级一致);在 onSuccess 中对相关 query 做 invalidateQueries,可配合乐观更新。服务端错误统一通过 handleServerError 处理(详见 3.9 错误处理)。api 实例(含 baseURL、headers、withCredentials: true);GET 默认请求去重,特殊请求可通过配置关闭;认证与通用错误在拦截器中处理。lib/ 下定义 schema,并用 z.infer 导出表单类型;useForm 配合 @hookform/resolvers/zod 做校验。onSubmit,展示加载与错误状态;成功后视场景重置表单或关闭弹窗。服务端校验错误映射到对应字段并展示(字段级错误展示方式见 3.9 错误处理)。src/routes/,通过 createFileRoute 定义;搜索参数用 Zod schema + validateSearch 校验。beforeLoad 中做认证与重定向,避免不必要的请求;嵌套结构用布局路由与 _authenticated 等前缀,子路由通过 <Outlet /> 渲染。useNavigate 或 Link,保持类型安全,避免直接操作 window.location。handleServerError,在 React Query 全局配置与拦截器中接入;按 HTTP 状态码给出合适提示,文案使用 i18n。toast.error 等统一方式;路由级错误由 errorComponent 承接,提供友好错误页并记录便于排查的信息。form.setError 等与表单库一致的方式。cn() 合并;非动态场景避免内联样式。sm:、md:、lg: 等);主题与暗色用 CSS 变量与 dark:,自定义样式集中在 src/styles/,组件内尽量少写自定义 CSS。src/features/<feature>/,内含 components/、lib/、hooks/,以及按需的 api.ts、types.ts、constants.ts、入口组件等。src/components/,通用工具与类型放 src/lib/;组件文件 PascalCase,工具/类型文件 kebab-case 或 types.ts,类型使用 PascalCase 命名并 export type。header、nav、main、footer),表单用 label 关联输入。aria-label、aria-expanded、aria-hidden);装饰性图标加 aria-hidden="true",重要信息提供文本等价。dangerouslySetInnerHTML;跨域与 Cookie 使用 withCredentials 并按后端要求处理 CSRF。*.test.ts;组件用 React Testing Library 测交互与行为,避免测实现细节。bun install、bun add <pkg>、bun add -d <pkg>、bun remove <pkg>、bun pm ls、bun update 等。^/~ 控制,定期更新以获取安全修复。rsbuild.config.ts;脚本以 package.json 为准(如 bun run dev、bun run build、bun run typecheck、bun run lint、bun run format),包管理见 3.15 依赖管理。.env 且以 VITE_ 前缀,不在代码中硬编码。AGENTS.md。