14 KiB
Express 后端化并行任务拆分规划(2026-04-08)
1. 目的
这份文档用于把 EXPRESS_BACKEND_REFACTOR_PLAN_2026-04-08.md 进一步拆成可并行推进、尽量互不冲突的任务流。
目标不是把大重构拆成很多零碎 TODO,而是把它拆成:
- 可以同时开工
- 写入边界清晰
- 交付物明确
- 依赖关系稳定
- 最后容易集成
2. 并行拆分原则
2.1 基本原则
- 每条任务尽量拥有独占目录或独占模块,不去抢同一批热点文件。
- 热点集成文件只由“集成岗”或最后一轮集成处理,不作为多个任务的日常编辑目标。
- 先搭协议边界,再迁规则执行,再收缩前端。
- 前端与后端可以并行推进,但前提是先冻结 contract。
- 编辑器链路和正式运行时链路分开拆,避免互相阻塞。
2.2 当前最容易冲突的文件
以下文件建议默认只由集成岗或最后一轮联调处理:
server-node/src/context.tsserver-node/src/routes/runtimeRoutes.tsserver-node/src/app.tssrc/services/apiClient.tssrc/hooks/useStoryGeneration.tssrc/hooks/useGameFlow.tssrc/components/GameShell.tsx
其他任务如果必须影响这些文件,优先通过:
- 新增独立模块
- 新增 adapter
- 新增中间层入口
而不是直接在热点文件中大改。
3. 建议并行批次
批次 A:可立即并行开工
- 任务 0:集成岗与接口冻结
- 任务 1:共享 contract 与目录抽离
- 任务 2:PostgreSQL 持久化基线收口
- 任务 3:服务端 HTTP 基础设施与统一响应壳层
- 任务 8:编辑器 API 归口与工具链隔离
- 任务 9:测试、观测与部署基线
批次 B:在 contract 初版落地后并行开工
- 任务 4:服务端 AI 编排收口
- 任务 5:运行时领域模块 A,Story / Combat / NPC
- 任务 6:运行时领域模块 B,Inventory / Quest / Build / Runtime Item
- 任务 7:前端 SDK、鉴权、持久化瘦身
批次 C:在服务端 action 和 view model 稳定后开工
- 任务 10:前端主流程壳层与大 hook 瘦身
4. 任务拆分
任务 0:集成岗与接口冻结
目标
负责冻结边界、维护接口文档、控制热点文件的合并节奏,避免多人同时改核心入口。
独占范围
docs/planning/**docs/technical/**- 最终集成时的热点入口文件
主要输出
- 统一任务看板
- contract 版本表
- 热点文件编辑规则
- 每日或每阶段集成清单
验收标准
- 团队知道哪些文件不能多人同时改
- 每条任务都有明确的上游 contract 与下游接入点
任务 1:共享 Contract 与目录抽离
目标
先把前后端共同识别的类型、schema、响应结构、错误结构抽出来,切断 server-node -> src/** 的长期反向依赖。
独占范围
packages/shared/**- 新建的共享类型、schema、contract 目录
可改边界
server-node/src/**中的 import 替换入口src/**中的 import 替换入口
暂不负责
- 具体业务规则迁移
- 前端页面行为调整
- 数据库实现细节
主要输出
- 统一 API envelope
- 统一错误对象
- 统一 action / response contract
- 统一领域类型和状态枚举
验收标准
- 新增服务端模块不需要继续直接依赖前端目录里的实现细节
- 前后端都以共享 contract 为边界协作
并行关系
- 可与任务 2、任务 3、任务 8、任务 9 同时启动
- 是任务 4、任务 5、任务 6、任务 7 的上游基础
任务 2:PostgreSQL 持久化基线收口
目标
把“已经切到 PostgreSQL”的状态收成真正稳定的后端基线,清掉 SQLite 残留口径与仓储层耦合问题。
独占范围
server-node/src/config.tsserver-node/src/db.tsserver-node/src/repositories/**server-node/src/app.test.ts.env.example
暂不负责
- 剧情规则
- 选项结算
- 前端状态瘦身
主要输出
- PostgreSQL 连接配置
- 仓储层接口统一
- 数据表初始化/迁移方案
- 运行时持久化测试基线
- 文档中的数据库现状统一
验收标准
- 后端运行时数据完全以后端数据库为准
- 配置、日志、测试、文档里不再把 SQLite 写成当前正式现状
并行关系
- 可与任务 1、任务 3、任务 8、任务 9 同时启动
- 为任务 5、任务 6、任务 7 提供稳定持久化基础
任务 3:服务端 HTTP 基础设施与统一响应壳层
目标
建立统一的服务端响应结构、错误结构、请求链路日志、版本字段和中间件壳层。
独占范围
server-node/src/http.tsserver-node/src/errors.tsserver-node/src/middleware/**server-node/src/app.ts
可改边界
- 为 route 层提供新的响应 helper
- 为后续 action 接口提供统一 envelope
暂不负责
- 具体 story / combat / quest 业务逻辑
- 前端页面层接入
主要输出
- 统一 JSON 响应格式
- 统一错误格式
requestIdlatency与关键日志字段- 路由级版本与元信息壳层
验收标准
- 后端所有新接口都能套用同一层响应约定
- 前端不需要为不同接口写多套错误解析逻辑
并行关系
- 可与任务 1、任务 2、任务 8、任务 9 同时启动
- 是任务 4、任务 5、任务 6、任务 7 的共同基础
任务 4:服务端 AI 编排收口
目标
把正式运行时的 prompt 组装、模型调用、容错、SSE 转发都收回后端,浏览器不再保留正式运行时 AI fallback。
独占范围
server-node/src/services/llmClient.tsserver-node/src/services/chatService.tsserver-node/src/services/storyService.tsserver-node/src/services/customWorldGenerationService.tsserver-node/src/services/questService.tsserver-node/src/services/runtimeItemService.ts
可新增目录
server-node/src/modules/ai/**
暂不负责
- 前端主流程组件
- 数据库存储实现
主要输出
- 后端统一 AI orchestration 层
- 流式接口统一适配
- prompt 复用策略
- 前端 fallback 清理清单
验收标准
- 正式运行时不再依赖浏览器端大体量 AI 实现作为兜底
- AI 失败、超时、流式中断都能在后端统一处理
并行关系
- 建议在任务 1、任务 3 有初版后启动
- 可与任务 5、任务 6、任务 7 并行
任务 5:运行时领域模块 A,Story / Combat / NPC
目标
把剧情推进、战斗结算、NPC 交互这些最核心的运行时状态迁移到后端领域模块。
独占范围
server-node/src/modules/story/**server-node/src/modules/combat/**server-node/src/modules/npc/**
可改边界
- 为 route/action 层提供服务接口
- 为前端提供 view model 所需聚合结果
暂不负责
- 背包、Build、任务奖励编排
- 编辑器接口
主要输出
- story action resolver
- combat resolution service
- npc interaction service
- 统一返回给 UI 的 presentation/view model 结构
验收标准
- 前端不再本地决定 function 合法性、战斗结果、NPC 关键关系变化
- 点击选项时,后端能返回完整下一步展示结果
并行关系
- 依赖任务 1、任务 3
- 可与任务 4、任务 6、任务 7 并行
任务 6:运行时领域模块 B,Inventory / Quest / Build / Runtime Item
目标
把任务推进、运行时物品、背包/装备、Build 收益等剩余核心规则迁到后端。
独占范围
server-node/src/modules/inventory/**server-node/src/modules/quest/**server-node/src/modules/build/**server-node/src/modules/runtime-item/**
可改边界
- 调用任务 2 的仓储层
- 使用任务 1 的共享 contract
暂不负责
- 前端页面层改造
- Story / Combat / NPC 主链路
主要输出
- inventory mutation service
- quest signal progression service
- build calculation service
- runtime item resolution service
验收标准
- 背包、任务、Build、运行时物品不再由前端保留正式结算逻辑
- 这些领域能独立测试,不依赖 UI hook
并行关系
- 依赖任务 1、任务 2、任务 3
- 可与任务 4、任务 5、任务 7 并行
任务 7:前端 SDK、鉴权、持久化瘦身
目标
让前端从“业务执行层”退回“API 消费层 + 表现层状态协调层”。
独占范围
src/services/apiClient.tssrc/services/authService.tssrc/services/storageService.tssrc/services/aiService.tssrc/hooks/useGamePersistence.tssrc/hooks/useGameSettings.ts
暂不负责
- 页面组件大范围重构
useStoryGeneration.ts主流程瘦身
主要输出
- 轻量前端 SDK
- 统一鉴权请求层
- 统一错误态与重试策略
- 远端快照/设置消费层
- 正式运行时浏览器 fallback 下线方案
验收标准
- 前端服务层不再保留完整正式规则或正式 AI 编排
- 存档与设置以后端返回结果为准
并行关系
- 依赖任务 1、任务 3
- 可与任务 4、任务 5、任务 6 并行
- 为任务 10 提供稳定的 API 消费层
任务 8:编辑器 API 归口与工具链隔离
目标
把编辑器的写盘、生成、任务查询能力从“散落接口”整理成清晰的编辑器后端模块,避免继续污染正式运行时。
独占范围
src/editor/shared/**src/components/preset-editor/**src/components/npcVisualEditorPersistence.tssrc/components/preset-editor/characterAssetStudioPersistence.tsscripts/dev-server/**server-node/src/modules/editor/**server-node/src/modules/assets/**
暂不负责
- 主游戏运行时 action 逻辑
- 正式剧情流转
主要输出
/api/editor/*与/api/assets/*命名空间- 统一 editor client SDK
- 写接口权限边界
- 编辑器工具链迁移清单
验收标准
- 编辑器组件不再散落直连多个写接口
- 编辑器 API 与运行时 API 的职责边界清晰
并行关系
- 可与任务 1、任务 2、任务 3、任务 9 同时启动
- 与任务 5、任务 6、任务 10 基本不冲突
任务 9:测试、观测与部署基线
目标
为整个后端化改造提供自动回归、链路日志和部署基线,避免“功能迁过去了但不可验证”。
独占范围
server-node/src/**/*.test.tsscripts/**- 部署与运维相关文档
- 反向代理与 smoke 测试脚本
暂不负责
- 具体业务模块实现
主要输出
- 后端接口测试
- 关键主链路 smoke
- request/response 日志校验
- 同域部署基线
- 回滚、备份、迁移检查清单
验收标准
web + server改造过程有最小自动回归保护- 关键接口失败时能追踪到请求链路
并行关系
- 可与任务 1、任务 2、任务 3、任务 8 同时启动
- 后续持续跟进任务 4、任务 5、任务 6、任务 7、任务 10 的交付
任务 10:前端主流程壳层与大 Hook 瘦身
目标
在服务端 action 和前端 SDK 稳定后,把 GameShell、useStoryGeneration 这一层改成真正的表现层协调器。
独占范围
src/hooks/useStoryGeneration.tssrc/hooks/story/**src/hooks/useGameFlow.tssrc/components/GameShell.tsxsrc/components/AdventurePanel.tsxsrc/components/NpcModals.tsxsrc/components/auth/**
暂不负责
- 数据库、服务端仓储
- 编辑器 API
主要输出
- 面向 action/view model 的前端流程层
- 页面表现态与业务态分离
- 大 hook 拆分后的协调层
- 更容易测试和替换的主流程壳层
验收标准
- 前端主流程不再直接吞下完整运行时规则
- 页面层主要消费后端 view model,而不是本地自算结果
并行关系
- 依赖任务 5、任务 6、任务 7 至少有一轮稳定输出
- 是最后一批大规模前端接入任务
5. 推荐协作顺序
第一步:先定边界
先启动:
- 任务 0
- 任务 1
- 任务 2
- 任务 3
这一轮完成后,团队会得到:
- 统一 contract
- 稳定数据库基线
- 稳定后端响应壳层
- 稳定任务分工边界
第二步:领域层和工具层分头推进
在第一步基础上并行启动:
- 任务 4
- 任务 5
- 任务 6
- 任务 7
- 任务 8
- 任务 9
这一轮是整个改造的主生产阶段。
第三步:最后收前端主流程
最后启动:
- 任务 10
原因很简单:
- 如果太早改
useStoryGeneration和GameShell,前端还没有稳定的 action contract 和 view model,会反复返工。
6. 建议的多人分工方式
如果是 4 人并行,建议:
- 1 人负责任务 1 + 任务 0 的 contract/集成
- 1 人负责任务 2 + 任务 3 的后端基建
- 1 人负责任务 4 + 任务 5 的运行时主链
- 1 人负责任务 8 + 任务 9,之后转入任务 7 或任务 10
如果是 6 人并行,建议:
- 1 人负责任务 0 + 任务 1
- 1 人负责任务 2
- 1 人负责任务 3 + 任务 9
- 1 人负责任务 4
- 1 人负责任务 5
- 1 人负责任务 6 + 任务 8
前端主流程任务 10 建议在第二轮由最熟悉当前 UI 壳层的人接手。
7. 合并规则建议
- 每条任务优先新增目录和新模块,少直接改热点文件。
- 热点文件统一在集成窗口合并,不在多个任务里同步推进。
- 任何任务如果需要改
useStoryGeneration.ts,默认先暂停并和任务 10 对齐。 - 任何任务如果需要改
server-node/src/routes/runtimeRoutes.ts,默认先走任务 0 的接口冻结表。 - 编辑器链路和正式运行时链路不要混在同一个 PR 里。
8. 一句话结论
这次重构最稳的并行方式不是“大家一起改前后端”,而是:
先用 contract、数据库基线和 HTTP 壳层把边界钉死,再让服务端领域迁移、编辑器归口、前端瘦身分轨并行,最后由主流程壳层统一接入。