2 Commits

Author SHA1 Message Date
ed0257ee2d Merge branch 'codex/wooden-fish-template' into master 2026-05-26 02:44:28 +08:00
kdletters
2d34004e64 架构优化计划书 2026-05-26 01:19:45 +08:00

View File

@@ -0,0 +1,399 @@
# Genarrative陶泥儿项目架构优化计划书
**文档版本**v1.0
**编制日期**2026-05-26
**项目名称**Genarrative陶泥儿
**文档密级**:内部
---
## 一、项目概况
| 维度 | 详情 |
|---|---|
| **项目名** | Genarrative陶泥儿 |
| **项目定位** | AI Native 互动视觉 RPG 平台——支持多种玩法模板的 AI 创作、运行与分享("玩法类型平台" |
| **核心玩法** | 拼图、视觉小说、Match3D、Bark Battle、Big Fish、Jump-Hop、Square Hole、木鱼、教娱等 10+ 种玩法模板 |
| **代码规模** | 前端 ~823 个 TS/TSX 文件,后端 ~1532 个 Rust 文件,属于大型项目 |
### 1.1 计划目的
本计划书基于对 Genarrative 项目当前架构的全面分析,识别架构层面的关键问题,并提出分阶段、可落地的优化方案。旨在:
- 统一前端架构模式,降低团队认知成本和新人上手门槛
- 提升模块内聚性,减少不必要的耦合与依赖
- 建立自动化契约保障机制,降低跨语言同步出错风险
- 优化工程基础设施,提高开发效率和运维可观测性
---
## 二、技术栈总览
| 层级 | 技术选型 | 版本 |
|---|---|---|
| **前端框架** | React + TypeScript + Vite | React 19 / TS 5.8 / Vite 6 |
| **样式** | TailwindCSS | v4 |
| **3D / 动画** | Three.js、Motion、cannon-es | - |
| **后端 HTTP** | Rust + AxumBFF 门面) | Axum 0.8 |
| **游戏状态 DB** | SpacetimeDB实时反应式数据库 | v2.2 |
| **AI / LLM** | LangChain-Rust + LLM Proxy | - |
| **小程序** | 微信小程序(含微信支付) | - |
| **容器化** | Docker ComposeNginx + API Server + OTel Collector | - |
| **运维** | systemd、Nginx、Jenkins CI/CD、k6 压测 | - |
| **可观测性** | OpenTelemetryOTLP → Grafana | - |
---
## 三、当前架构分层图
```
┌──────────────────────────────────────────────────────────────┐
│ 入口层 │
│ index.html → main.tsx → resolveAppRoute() → RouteComponent │
│ (多入口路由:平台主页 / 拼图 / BigFish / Match3D / ...) │
└──────────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────────┐
│ 前端应用层 (src/) │
│ ┌─────────────┐ ┌──────────────┐ ┌──────────────────────┐│
│ │ components/ │ │ services/ │ │ games/ ││
│ │ *-creation │ │ *-creation │ │ bark-battle/ ││
│ │ *-result │ │ *-runtime │ │ domain/ ││
│ │ *-runtime │ │ *-works │ │ application/ ││
│ │ common/ │ │ storyEngine │ │ infrastructure/ ││
│ │ auth/ │ │ payment │ │ ui/ ││
│ └─────────────┘ └──────────────┘ └──────────────────────┘│
│ ┌─────────────┐ ┌──────────────┐ ┌──────────────────────┐│
│ │ hooks/ │ │ data/ │ │ routing/ ││
│ │ persistence/│ │ functionCat. │ │ config/ editor/ ││
│ └─────────────┘ └──────────────┘ └──────────────────────┘│
└──────────────────────────────────────────────────────────────┘
│ Vite Proxy (/api/*)
┌──────────────────────────────────────────────────────────────┐
│ Rust 后端 (server-rs/) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ api-server (Axum HTTP / SSE / BFF 门面) │ │
│ └──────────────────────────────────────────────────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────────┐ ┌──────────────────┐ ┌──────────────┐ │
│ │ platform │ │ module-* │ │ shared │ │
│ │ -auth │ │ -puzzle │ │ -contracts │ │
│ │ -llm │ │ -visual-novel │ │ -kernel │ │
│ │ -image │ │ -match3d │ │ -logging │ │
│ │ -oss │ │ -bark-battle │ └──────────────┘ │
│ │ -speech │ │ -big-fish ... │ │
│ │ -agent │ │ -runtime │ │
│ └──────────┘ │ -combat/npc │ │
│ └──────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ spacetime-module + spacetime-client → SpacetimeDB │ │
│ └──────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────────┐
│ 辅助子系统 │
│ apps/admin-web (React 后台管理) │
│ miniprogram/ (微信小程序) │
│ packages/shared (前后端共享契约/LLM工具) │
│ deploy/ (Docker/Nginx/systemd/OTel) │
│ scripts/ (40+ 构建/部署/检查脚本) │
│ jenkins/ (CI/CD Pipeline) │
└──────────────────────────────────────────────────────────────┘
```
---
## 四、架构亮点
1. **清晰的"玩法模板"平台模式**
每种玩法遵循统一的 `creation → result → runtime` 三段式生命周期,前端 `components/``services/` 均按此模式组织。新增玩法可快速套用模板,极大降低了横向扩展成本。
2. **后端严格的分层约束**
`api-server`(门面)→ `module-*`(领域)→ `spacetime-module`(持久化),`module-*` 不直接依赖 Axum、HTTP、SpacetimeDB table、LLM、文件系统保证了领域纯净性和可测试性。
3. **SpacetimeDB 作为游戏状态核心**
采用反应式实时数据库替代传统 Redis + PostgreSQL 组合,天然适合多人实时游戏状态同步,减少了中间层复杂度和延迟。
4. **前端 DDD 探索**
`src/games/bark-battle/` 采用 `domain / application / infrastructure / ui` 四层 DDD 结构,为复杂玩法的前端架构提供了良好范本。
5. **完善的多入口路由体系**
通过 `resolveAppRoute()` 按 URL path 分发到不同的 lazy-loaded 组件,实现了按需加载和良好的首屏性能。
6. **运维体系完备**
Docker Compose + systemd + Nginx + OpenTelemetry + k6 压测 + Jenkins CI/CD覆盖了构建、部署、监控、压测全链路。
---
## 五、问题诊断与改进方案
### 问题 1前端 services/ 与 components/ 的耦合不统一
**现状**
大部分玩法遵循 `services/` + `components/` 分离模式,但部分玩法运行时直接放在 `components/`services 层职责模糊——有的承担了业务逻辑编排,有的仅作简单 API 调用。
**影响**
- 新人阅读代码时无法预判某个逻辑应位于哪个目录
- 单元测试困难services 与组件耦合的业务逻辑无法独立测试
- 跨玩法复用时需要额外的迁移成本
**改进方案**
1. 制定规范:`services/` 仅负责纯 API 调用和数据转换,不包含业务判断逻辑
2. 业务逻辑统一归到 `hooks/``games/<play-type>/application/`
3. 以 puzzle 玩法为样板,先行重构并形成迁移指南,再推广至其余玩法
4. 在 CI 中增加 ESLint 规则,禁止 `components/` 直接 import `services/` 之外的外部模块
**预期收益**
- 职责边界清晰,降低认知成本约 30%
- services 层可独立单测覆盖率达到 80%+
- 新玩法开发上手时间从 2 天缩短至 0.5 天
---
### 问题 2前端 DDD 与模板模式并存,架构不统一
**现状**
`bark-battle` 采用 DDD 四层结构(`domain/application/infrastructure/ui`),其余玩法散落在 `components/` + `services/` 下,存在两种截然不同的组织范式。
**影响**
- 团队内部对"正确"的代码组织方式缺乏共识
- 代码审查时需要切换判断标准
- DDD 玩法的优势无法在全局范围内发挥
**改进方案**
1. 所有玩法统一迁移到 `src/games/<play-type>/` 下,采用 `domain / application / ui` 三层结构infrastructure 按需保留)
2. 以 puzzle 为样板完成首例迁移,产出迁移 Checklist 和模板生成脚本
3. 新增玩法脚手架直接生成 DDD 结构目录
4. 旧玩法分批次迁移,每批次 2-3 个玩法,在 4 个迭代内完成
**预期收益**
- 架构一致性提升至 100%
- 跨玩法逻辑复用变得可能domain 层可共享)
- 为后续 monorepo 改造打下基础
---
### 问题 3后端 module-* 粒度偏细,存在潜在循环依赖风险
**现状**
后端共 35 个 crate。`module-runtime` 被拆分为 3 个独立 crate`module-combat / npc / inventory` 各自独立。部分紧密协作的模块之间可能存在隐式耦合。
**影响**
- 编译时间增长35 个 crate 独立编译)
- 跨 crate 重构时需要同时修改多处
- 循环依赖风险增加,可能在特定组合下触发编译失败
**改进方案**
1. 评估合并方案:
- `module-runtime-*` 系列合并为单 crate `module-runtime`,内部用 `mod` 做逻辑隔离
- `module-combat / npc / inventory` 评估合并为 `module-combat`npc 和 inventory 作为子模块
2. 保留 trait/interface 抽象层,确保 module 之间不直接依赖具体实现
3. 在 CI 中引入 `cargo-deny` 或自定义脚本,自动检测 module 间的依赖方向是否违反分层约束
4. 目标:将 35 个 crate 精简至 25 个以内
**预期收益**
- 全量编译时间预计缩短 15%-20%
- 循环依赖风险归零
- module 内部重构成本降低
---
### 问题 4根目录 env 文件过多且混乱
**现状**
根目录存在 4 个 env 文件(`.env``.env.example``.env.production` 等),且 `deploy/` 下另有多个 env 文件。配置分散在多处,部分文件之间字段不一致。
**影响**
- 排查配置问题时需要翻阅多个文件
- 新人无法快速确定本地开发需要哪些环境变量
- 部署时可能遗漏或错误覆盖某项配置
**改进方案**
1. 收敛为三层配置体系:
- `.env.example`:包含所有可配置项的说明和默认值(唯一提交到仓库的 env 文件)
- `.env.local`:本地开发覆盖(加入 .gitignore
- `deploy/env/<env-name>.env`:各部署环境专用配置
2. 引入 config crate支持层次覆盖default → local → env-specific启动时自动校验必填字段
3. 在 CI 中加入 env 校验步骤:对比 `.env.example` 与部署环境的 env 文件,标记缺失或多余字段
**预期收益**
- 配置查找时间从分钟级降至秒级
- 部署配置遗漏导致的线上事故减少 90%+
- 新成员本地环境搭建时间从 30 分钟缩短至 10 分钟
---
### 问题 5scripts/ 目录膨胀为"万能工具箱"
**现状**
`scripts/` 目录共 42 个文件,涵盖构建、部署、检查、迁移、生成、压测等,全部平铺在同一层级,缺乏分类。
**影响**
- 难以快速定位所需脚本
- 同类脚本缺乏命名规范
- 新增脚本时不知道放在何处
**改进方案**
1. 按功能域分类重组:
```
scripts/
├── build/ # 构建相关vite、cargo、wasm 等)
├── deploy/ # 部署相关docker、systemd、rsync
├── check/ # 检查/校验lint、format、type-check
├── spacetime/ # SpacetimeDB 相关migration、seed
├── generate/ # 代码生成scaffold、proto、types
└── loadtest/ # 压测脚本k6 配置及辅助)
```
2. 为每个子目录添加 README.md说明各脚本用途和调用方式
3. 将重复逻辑抽取为共享函数库
**预期收益**
- 脚本查找效率提升 60%+
- 降低脚本重复概率
- 便于 CI Pipeline 直接引用标准化路径
---
### 问题 6前端路由系统缺乏统一的"玩法注册"机制
**现状**
`appRoutes.tsx` 中硬编码 `switch-case` 逻辑,每新增一种玩法需手动修改路由文件、入口组件、资源加载等多个位置。
**影响**
- 新增玩法的接入点分散,容易遗漏
- 路由文件随玩法增多持续膨胀
- 无法实现"按需注册"——即使某环境不包含某玩法,路由代码仍然存在
**改进方案**
1. 建立 `PlayTypeRegistry` 模式:每个玩法导出一个注册项对象,包含 `path``lazyComponent``preload` 等字段
2. `resolveAppRoute()` 改为动态聚合所有注册项,替代硬编码 switch-case
3. 支持环境级玩法开关:通过配置控制某环境启用哪些玩法,路由系统自动忽略未启用的
**预期收益**
- 新增玩法零侵入路由系统,只需在玩法目录内添加注册文件
- 路由文件体积与玩法数量解耦
- 灰度发布和 A/B 测试变得可能
---
### 问题 7前端缺少统一的状态管理层
**现状**
前端状态管理依赖 React hooks + props drilling + services 层手动管理。未使用任何状态管理库(如 Zustand、Jotai、Redux
**影响**
- 全局状态(用户认证、会话、通知)通过多层 props 传递,组件耦合度高
- 跨页面状态无法优雅共享
- 状态变更难以追踪和调试
**改进方案**
1. 引入 Zustand轻量、无 boilerplate、TS 友好)管理全局状态:
- `useAuthStore`:认证状态
- `useSessionStore`:当前会话/游戏状态
- `useNotificationStore`:全局通知
2. 玩法内状态继续使用 React hooks + `useReducer`,保持局部自治
3. 全局 store 与玩法内 state 通过事件总线松耦合通信
**预期收益**
- props drilling 层级从 5+ 层降至 1-2 层
- 全局状态可追溯,支持 Redux DevTools 调试
- 跨玩法状态共享(如用户余额、道具)变得自然
---
### 问题 8shared-contracts 的实际复用程度待验证
**现状**
前后端通过 `packages/shared` 共享 DTO 类型定义,但依赖手动同步 TypeScript 类型。可能存在前后端契约不一致但编译期无法检出的情况。
**影响**
- 后端修改 DTO 字段后,前端可能遗漏更新导致运行时错误
- 手动同步耗时且易出错
- Code Review 时难以判断契约一致性
**改进方案**
1. 引入 `ts-rs`:从 Rust 结构体自动生成 TypeScript 类型定义
2. 将生成步骤集成到 CI Pipeline
- 每次 Rust PR 触发 `ts-rs` 重新生成 TS 类型
- 对比生成的类型与仓库中的类型是否一致,不一致则 CI 失败
3. 长期考虑引入 Protobuf / OpenAPI 作为跨语言契约的单一事实来源
**预期收益**
- 前后端契约不一致导致的线上 bug 减少 95%+
- 手动同步工作量归零
- PR Review 时契约一致性问题自动拦截
---
## 六、改进优先级路线图
| 优先级 | 改进项 | 涉及层 | 建议时间 | 预期收益 |
|---|---|---|---|---|
| **P0** | 统一前端 services/hooks/components 职责边界 | 前端 | 第 1-2 周 | 降低认知成本,提升可测试性 |
| **P1** | 建立 PlayType 注册机制 | 前端 | 第 2-3 周 | 新增玩法零侵入路由 |
| **P1** | 评估 module-* 合并方案并执行 | 后端 | 第 3-4 周 | 减少编译时间 15%-20% |
| **P1** | 引入 Zustand 全局状态管理 | 前端 | 第 4-5 周 | 改善状态追踪与跨组件共享 |
| **P2** | 清理 scripts/ 目录结构 | 工程 | 第 5-6 周 | 提高可发现性 |
| **P2** | 前端玩法统一迁移至 DDD 结构 | 前端 | 第 5-8 周 | 架构一致性 100% |
| **P2** | env 配置收敛 | 工程 | 第 6-8 周 | 减少部署配置事故 |
| **P3** | 前后端共享 DTO 自动化ts-rs | 全栈 | 第 6-8 周 | 消除契约不一致风险 |
| **P3** | CI 分层约束检查cargo-deny | 后端 | 第 8-10 周 | 循环依赖归零 |
> **说明**P0 为阻塞项必须最先完成。P1 项可部分并行推进PlayType 注册与 module 合并互不依赖。P2/P3 为优化项,可在日常迭代中穿插推进。
---
## 七、架构健康度评分卡
| 维度 | 评分 | 当前状态 | 目标状态 |
|---|---|---|---|
| **分层清晰度** | ★★★★☆ | 后端分层严格,前端分层存在不一致 | ★★★★★ 前后端均严格分层 |
| **模块化程度** | ★★★★☆ | 后端 35 crate 粒度偏细,前端结构化较好 | ★★★★☆ 后端精简至 25 crate |
| **可扩展性** | ★★★★★ | 玩法模板模式使新增玩法成本低 | ★★★★★ 维持 |
| **代码复用** | ★★★☆☆ | shared 层作用有限services 层有重复 | ★★★★☆ DDD 统一后 domain 可复用 |
| **DevOps 成熟度** | ★★★★★ | Docker + k6 + OTel + Jenkins 覆盖完整 | ★★★★★ 维持 |
| **文档完备性** | ★★★★★ | docs/ 分类清晰,基线文档齐全 | ★★★★★ 维持 |
| **技术债务管控** | ★★★★☆ | 有明确的"历史残留"标记和废弃策略 | ★★★★★ 增加自动化检测 |
**综合评级A-(优秀,存在可优化空间)**
---
## 八、附录:代码规模统计
| 维度 | 数量 |
|---|---|
| **前端 TypeScript/TSX 文件** | ~823 个 |
| **后端 Rust 源文件** | ~1532 个 |
| **后端 Crate 数量** | 35 个 |
| **核心玩法类型** | 10+ 种 |
| **scripts/ 脚本数量** | 42 个 |
| **根目录 env 文件** | 4 个 + deploy 下多个 |
### 模块规模明细(后端)
| Crate | 职责 | 建议 |
|---|---|---|
| `api-server` | Axum HTTP 门面,路由聚合 | 保持 |
| `platform-*` (auth/llm/image/oss/speech/agent) | 平台级跨玩法能力 | 保持 |
| `module-puzzle` | 拼图玩法 | 作为 DDD 迁移样板 |
| `module-visual-novel` | 视觉小说 | 后续迁移 |
| `module-match3d` | Match3D 三消 | 后续迁移 |
| `module-bark-battle` | 犬吠对战 | 已对接前端 DDD |
| `module-big-fish` | Big Fish | 后续迁移 |
| `module-runtime*` (3 crates) | 通用运行时 | **建议合并为单 crate** |
| `module-combat / npc / inventory` | 战斗系统 | **建议合并** |
| `spacetime-module` + `spacetime-client` | SpacetimeDB 接入 | 保持 |
| `shared-contracts / kernel / logging` | 共享基础设施 | 保持 |
---
> **文档结束**
> 本计划书由 Genarrative 架构分析报告衍生,所有改进项均基于对当前项目代码库的实际分析。执行过程中如遇阻力或新发现,应及时更新本计划书并同步相关方。