№ · 完成计划
CH.06.24
App 拆表与双壳拆分计划 v1
目标:把
src/App.tsx里的事件、时间、终局、简报、竖版 UI、横版 UI 拆成可协作的独立层,降低后续多会话改动冲突。
1. 现状
src/App.tsx仍然承担过多职责:状态编排、页面切换、事件调度、竖版渲染、横版渲染、终局入口、简报入口、存档入口。src/data/eventTables/已经开始表化,但当前仍偏平铺,不利于继续按主线 / 支线 / 角色线协作推进。- 竖版和横版已经不是同一套布局问题,应该拆成两个壳,而不是继续在一个大组件里堆
if (isPortraitViewport)。 - 当前项目的基础约束已经足够明确:
data放静态内容,utils放规则和判定,components放展示,App.tsx只做编排。
2. 拆表目录
2.1 推荐目录
src/data/eventTables/
index.ts
runtime/
registry.ts
selection.ts
types.ts
mainline/
business.ts
tournament.ts
failure.ts
briefing.ts
time.ts
roles/
guo.ts
bai.ts
li.ts
lu.ts
mobei.ts
wushuang-qian.ts
tong-xiangyu.ts
qian.ts
side/
official.ts
night-risk.ts
jianghu-atmosphere.ts
rumor.ts
system/
version.ts
save-load.ts
endgame.ts
2.2 目录职责
| 目录 | 职责 | 不该放的内容 |
| --- | --- | --- |
| mainline/ | 主线推进、开业节奏、比武招亲、终局主线 | UI JSX、直接的状态修改代码 |
| roles/ | 单角色故事线、羁绊线、人物专属节点 | 全局判定、通用调度逻辑 |
| side/ | 江湖氛围、夜间风险、官府、谣言、路人事件 | 角色专属成长线 |
| system/ | 时间体系、读档、版本、终局系统事件 | 业务渲染、页面组件 |
| runtime/ | 权重选择、注册表、事件路由、类型封装 | 事件文案本体 |
2.3 当前文件的落位原则
background-drift.ts这类氛围事件属于side/。tournamentRuntime.ts这类运行时编排属于runtime/,不属于具体表内容。selection.ts属于runtime/。mainline-business.ts、mainline-tournament.ts保持主线归类。role-*.ts保持角色线归类,不和支线混写。
3. 依赖关系图
flowchart TB
App["src/App.tsx\n编排层"]
Data["src/data/eventTables/*\n静态事件表"]
Utils["src/utils/*Engine.ts\n时间 / 判定 / 终局 / 简报"]
UI["src/components/*\n纯展示组件"]
Data --> Utils
Utils --> UI
App --> Data
App --> Utils
App --> UI
subgraph Portrait["竖版 UI"]
P1["顶部状态条"]
P2["scene-only InnCourt"]
P3["江湖简报 / 消息流"]
P4["底部导航"]
P5["FAB 主动作"]
P6["sheet / drawer / modal"]
end
subgraph Landscape["横版 UI"]
L1["顶部栏"]
L2["主场景区"]
L3["右侧功能栏"]
L4["系统门厅 / 终局 / 存档"]
L5["事件目录 / 简报面板"]
end
App --> Portrait
App --> Landscape
4. 竖版 / 横版拆分
4.1 竖版壳
竖版只保留一个主场景面,所有管理类内容都下沉到 sheet / drawer:
- 顶部状态条:时间、货币、声望、昼夜。
- 中部场景:
InnCourt的scene-only模式。 - 中部消息:江湖简报、事件摘要、预告摘要。
- 底部导航:少量高频入口。
- 悬浮主动作:一个主按钮,最多附带少量次动作。
- 复杂模块:统一进入抽屉或底部面板,不在首页堆多栏。
4.2 横版壳
横版保留高信息密度,但必须清楚分层:
- 左侧或中间固定主场景区。
- 右侧承载系统门厅、简报、事件目录、存档、终局等管理面板。
- 桌面端允许更高密度,但不允许把竖版抽屉逻辑原样搬过去。
- 复杂面板仍然只是内容层,不能回头把规则写进组件。
4.3 壳分工边界
| 壳 | 主要职责 | 允许 | 禁止 | | --- | --- | --- | --- | | 竖版壳 | 单屏经营、快速决策、轻量浏览 | 底部导航、sheet、FAB、简报摘要 | 桌面式左右栏、重型管理面板 | | 横版壳 | 高密度经营、管理与回溯 | 右侧栏、系统门厅、目录、终局回放 | 把所有模块堆进一个纵向长页 |
5. App.tsx 的冻结规则
App.tsx 只保留四类内容:
- 全局状态初始化。
- 事件派发和顶层回调。
- 竖版壳 / 横版壳选择。
- 最少量的布局拼接。
App.tsx 不再承担:
- 大段静态表。
- 复杂判定分支。
- 事件文案堆叠。
- 终局系统规则本体。
- 竖版和横版共用的一堆 JSX 细节。
6. 协作规则
- 新事件先进入
src/data/eventTables/*,不要直接塞进App.tsx。 - 触发条件、权重、时间窗、终局判定先进入
src/utils/*Engine.ts。 - 组件只接 props,不直接读表、不直接写规则。
- 同一类内容只允许一个源头文件,避免多处重复定义。
- 任何新增玩法先判断属于主线、角色线、支线还是系统线,再决定落表位置。
- 多会话协作时,优先按目录分派,不按“谁顺手就改哪”分派。
7. 推荐执行顺序
- 先把
eventTables平铺文件按目录归类。 - 再把事件选择和运行时编排收进
runtime/。 - 然后冻结竖版壳和横版壳的职责。
- 最后再回到
App.tsx,只做编排层收口。
8. 验收标准
App.tsx不再继续膨胀为“表 + 逻辑 + UI”的混合体。- 新增事件可以明确落到某个表目录。
- 竖版和横版的职责边界清楚,可分别迭代。
- 后续会话不会因为争抢同一个大文件而频繁冲突。