№ · 完成计划 CH.06.24
主页 · ✔️ 完成计划 · App 拆表与双壳拆分计划 v1

App 拆表与双壳拆分计划 v1

📅 2026-06-24 · 📦 5.5 KB · ✔️ 完成计划 · 📝 MD 文档 🏷️ Buff🏷️ Year1🏷️ 新手🏷️ 剧情🏷️ 计划🏷️ 时间

目标:把 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.tsmainline-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:

  • 顶部状态条:时间、货币、声望、昼夜。
  • 中部场景:InnCourtscene-only 模式。
  • 中部消息:江湖简报、事件摘要、预告摘要。
  • 底部导航:少量高频入口。
  • 悬浮主动作:一个主按钮,最多附带少量次动作。
  • 复杂模块:统一进入抽屉或底部面板,不在首页堆多栏。

4.2 横版壳

横版保留高信息密度,但必须清楚分层:

  • 左侧或中间固定主场景区。
  • 右侧承载系统门厅、简报、事件目录、存档、终局等管理面板。
  • 桌面端允许更高密度,但不允许把竖版抽屉逻辑原样搬过去。
  • 复杂面板仍然只是内容层,不能回头把规则写进组件。

4.3 壳分工边界

| 壳 | 主要职责 | 允许 | 禁止 | | --- | --- | --- | --- | | 竖版壳 | 单屏经营、快速决策、轻量浏览 | 底部导航、sheet、FAB、简报摘要 | 桌面式左右栏、重型管理面板 | | 横版壳 | 高密度经营、管理与回溯 | 右侧栏、系统门厅、目录、终局回放 | 把所有模块堆进一个纵向长页 |

5. App.tsx 的冻结规则

App.tsx 只保留四类内容:

  1. 全局状态初始化。
  2. 事件派发和顶层回调。
  3. 竖版壳 / 横版壳选择。
  4. 最少量的布局拼接。

App.tsx 不再承担:

  • 大段静态表。
  • 复杂判定分支。
  • 事件文案堆叠。
  • 终局系统规则本体。
  • 竖版和横版共用的一堆 JSX 细节。

6. 协作规则

  • 新事件先进入 src/data/eventTables/*,不要直接塞进 App.tsx
  • 触发条件、权重、时间窗、终局判定先进入 src/utils/*Engine.ts
  • 组件只接 props,不直接读表、不直接写规则。
  • 同一类内容只允许一个源头文件,避免多处重复定义。
  • 任何新增玩法先判断属于主线、角色线、支线还是系统线,再决定落表位置。
  • 多会话协作时,优先按目录分派,不按“谁顺手就改哪”分派。

7. 推荐执行顺序

  1. 先把 eventTables 平铺文件按目录归类。
  2. 再把事件选择和运行时编排收进 runtime/
  3. 然后冻结竖版壳和横版壳的职责。
  4. 最后再回到 App.tsx,只做编排层收口。

8. 验收标准

  • App.tsx 不再继续膨胀为“表 + 逻辑 + UI”的混合体。
  • 新增事件可以明确落到某个表目录。
  • 竖版和横版的职责边界清楚,可分别迭代。
  • 后续会话不会因为争抢同一个大文件而频繁冲突。