Files
th-hotel-simple/docs/import/reusable/frontend-development-guidelines.md

235 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 通用前端开发规范
## 1. 文档定位
本文记录可跨项目复用的前端开发约定,适用于以页面展示、交互、状态管理、接口调用和用户体验为核心的前端项目。
复制到新项目后,应根据实际技术栈、目录结构、启动命令、接口契约、设计系统和业务约束做项目级补充。当前项目的业务专属规则不应写入本文。
## 2. 技术栈原则
具体版本以项目内依赖文件为准,例如 `client/package.json`、锁文件和构建配置。
通用要求:
- 使用 TypeScript 时应开启严格类型检查。
- 构建、Lint、类型检查、测试命令必须可重复执行。
- 不引入与项目规模不匹配的大型模板或重型依赖。
- UI 组件库、路由、状态管理和请求库应在项目级文档中明确。
- 生成代码应进入专门目录,并标记为禁止手工修改。
- 新项目必须明确 Node.js、包管理器、框架、语言、构建工具、Lint、类型检查和测试框架的兼容关系。
- TypeScript 版本必须与类型检查、Lint 和框架工具链支持范围一致。
- Vue 单文件组件项目应配置 `vue-tsc` 或等价工具覆盖 `.vue` 文件类型检查。
## 3. 目录约定
推荐目录:
```text
client/src
├── components
│ └── common
├── composables
├── generated
├── i18n
│ └── locales
├── layouts
├── router
├── services
├── stores
├── styles
├── tests
├── types
└── views
```
目录规则:
- API 请求封装放入 `src/services`
- 手写类型定义放入 `src/types`
- OpenAPI 或其他工具生成代码放入 `src/generated`,禁止手工修改。
- 可复用组合逻辑放入 `src/composables`
- 路由定义放入 `src/router`
- 客户端状态放入 `src/stores`
- i18n 入口和语言包放入 `src/i18n`
- 页面级组件放入 `src/views`
- 可复用组件放入 `src/components`
- 通用布局放入 `src/layouts`
- 全局样式和设计 token 放入 `src/styles`
## 4. 组件规范
- 页面组件负责展示、交互和页面编排,不直接承载复杂业务规则。
- Props、Emits、响应式状态和服务返回值必须有明确类型。
- 避免在模板中写复杂业务逻辑,复杂逻辑放入 computed、composable 或服务层。
- 不在组件里直接拼接后端 URL统一通过 services。
- 不在组件里直接访问浏览器全局存储保存业务事实。
- 不把中文或英文显示文案作为业务判断依据。
- 可复用组件应通过清晰 props 和 emits 对外暴露能力。
- 大组件应按职责拆分,避免一个页面文件同时承担数据请求、复杂表单、表格、弹窗和业务判断。
## 5. 状态管理规则
客户端状态和服务端数据要分开管理。
客户端状态适合保存:
- 当前用户上下文。
- 语言、主题和页面偏好。
- 轻量 UI 状态。
- 当前页面临时筛选条件或展开状态。
服务端数据适合通过请求缓存库或服务层管理:
- 列表、详情、统计、字典和远程配置。
- Mutation 完成后按 query key 或明确缓存规则失效。
- 不把服务端数据长期复制进客户端全局 Store。
- 不用前端状态绕过后端权限、状态机或业务校验。
## 6. API 请求规范
- 浏览器默认只调用本项目后端。
- 所有请求封装到 `src/services`
- 服务函数返回明确 TypeScript 类型。
- 统一处理 JSON、错误结构、超时、取消请求和认证失效。
- 前端不直接调用数据库、对象存储、持有 Secret 的第三方系统或内部 Provider。
- 前端不发送后端 Secret、Provider API Key、数据库凭证或内部访问密钥。
- 调试页面如果需要触发受控后端能力,应由后端提供 debug-only 包装接口Secret 保留在后端。
## 7. 国际化与展示文案
- 新增页面和组件不得把业务逻辑绑定到展示文案。
- 系统固定文案应使用稳定 i18n key。
- 后端应返回稳定业务代码和必要 `labelKey`,前端按 key 显示。
- 用户输入、外部来源原文和备注应保持原文,不做无依据翻译。
- 日期、时间、数字和货币按当前语言、时区和币种配置格式化。
- API 仍传递结构化原始值,不传本地化展示字符串作为业务参数。
如果项目不需要国际化,也应保留“业务判断不依赖展示文本”的规则。
## 8. 类型与业务代码
- TypeScript 类型应贴近后端 API 契约。
- 稳定业务代码使用 string union、枚举型常量或后端生成类型避免散落 magic string。
- 动态字段使用稳定 `fieldKey`
- 表单字段展示使用 `labelKey` 或 i18n key。
- 不用 `label`、中文标题或英文标题做字段标识。
- 接口字段变更时,同步更新 `src/types`、services、页面和测试。
## 9. UI 与交互规范
- UI 应优先服务真实工作流,不堆叠无意义装饰。
- 列表、详情、表单、弹窗、空状态、加载状态和错误状态必须完整。
- 重要操作必须有明确反馈。
- 危险操作必须有确认、权限或后端校验。
- 复杂表单应区分草稿、提交中、提交成功、提交失败和版本冲突。
- 涉及敏感信息时,应默认最小展示。
- 组件样式应遵守项目设计 token避免随意写一次性颜色、间距和字号。
- 页面文本必须在移动端和桌面端都不溢出、不遮挡。
## 10. 前端安全规范
- 公开环境变量会暴露到浏览器构建产物,不能保存 Secret。
- 前端不得保存数据库密码、Provider API Key、访问令牌、内部重放密钥或生产凭证。
- 不在 LocalStorage、SessionStorage 或 URL 中保存敏感业务数据。
- 错误提示不展示 Authorization、Cookie、Token、原始敏感正文或附件 URL。
- 测试夹具不得使用真实客户、真实生产数据或真实支付信息。
## 11. 配置规范
常见公开配置示例:
```text
VITE_API_BASE_URL=http://localhost:8080
VITE_APP_ENV=local
VITE_DEFAULT_LOCALE=zh-CN
VITE_ENABLE_MOCKS=false
```
规则:
- 公开配置可以放入前端环境变量。
- Secret 一律不进入前端环境变量。
- 生产需要运行时配置时,应由部署系统生成公开配置文件,例如 `/app-config.json`
- 需要秘密的外部调用一律经后端代理或适配器。
## 12. 路由规范
- 新增业务路由前确认对应后端 API、权限边界和页面恢复能力。
- 详情页路由参数使用稳定 ID。
- 页面刷新后必须能通过后端详情接口恢复必要状态,不依赖内存临时状态。
- 未确认的业务入口不要提前硬编码到导航。
- 路由守卫只做访问控制和基础上下文检查,不承载复杂业务流程。
## 13. 表单规范
- 表单字段应来自稳定契约或明确的本地模型。
- 保存草稿时使用稳定字段名或 `fieldKey`
- 不把显示文案作为提交字段名。
- 提交前前端可做基础格式校验,但最终业务校验在后端。
- 发生版本冲突时,应提示用户刷新或重新确认,不静默覆盖。
- 表单错误应能定位到字段或操作区域。
## 14. Agent 前端开发 Skill 使用原则
如果当前 agent 环境提供前端、设计、浏览器验证或可视化相关 skill应按任务类型选择使用。Skill 是辅助能力,不替代项目技术栈、组件库、设计 token、接口契约和用户明确要求。
通用原则:
- 新增页面、复杂组件、交互流程或明显视觉调整前,应优先使用设计或前端类 skill 辅助确认方案。
- 重构已有页面视觉时,应优先使用现有项目审视和重构类 skill避免破坏原有功能。
- 根据截图、设计稿或视觉参考还原页面时,应使用图像到代码或视觉分析类 skill。
- 设计 token、组件规范或样式体系调整时应使用设计系统类 skill。
- 需要生成图片资产时,可使用图像生成类 skill但不得替代项目内已有品牌资产或图标规范。
- 涉及可视化结果的前端改动,完成后应通过浏览器、截图或交互测试验证桌面端和移动端表现。
- Skill 建议不得直接引入新的 UI 框架、组件库、状态管理方案或重型依赖;如确有必要,必须先确认。
- 如果相关 skill 不可用,应按同等原则手动完成设计、实现和验证,并在交付说明中说明。
## 15. 测试与检查命令
前端项目应至少提供:
```bash
cd client
pnpm lint
pnpm typecheck
pnpm test
pnpm build
```
如果项目不是 pnpm应在项目级文档中替换为实际命令。
聚焦开发时可运行:
```bash
cd client
pnpm test -- SomeSpecName.spec.ts
```
如果命令尚未配置或因环境问题无法运行,必须明确说明,不能假装通过。
## 16. Git 与协作流程
- 改动前说明目标、范围和将修改的文件。
- 每次只处理一个模块、一个页面或一个纵向切片。
- 不修改与当前任务无关的用户变更。
- 前后端接口变化前,先确认 API 契约和字段映射。
- 修改后运行项目已配置的检查命令。
- Git commit message 使用中文,清楚说明本次提交的业务或技术变更。
## 17. 前端提交前检查清单
- [ ] 是否只调用本项目后端或明确允许的公开服务?
- [ ] 是否没有把 Secret 放入前端环境变量、源码、测试或 URL
- [ ] 新文案是否按项目约定处理?
- [ ] 是否避免用中文或英文显示文本做业务判断?
- [ ] API 请求是否放在 `src/services`
- [ ] 手写类型是否放在 `src/types`
- [ ] 可复用逻辑是否放在 `src/composables`
- [ ] 服务端数据是否没有长期塞进客户端全局 Store
- [ ] 是否没有手工修改 `src/generated`
- [ ] 是否覆盖加载、空状态、错误、成功和权限不足等关键状态?
- [ ] 涉及 UI、交互或视觉变更时是否使用或说明未使用合适的前端 / 设计 skill
- [ ] 涉及可视化结果时,是否做过浏览器、截图或响应式验证?
- [ ] 是否运行了项目前端检查命令或说明了无法运行原因?