08-cockpit-page-file-shape.md 3.1 KB

# Cockpit page file shape

Type: grilling Status: resolved Labels: wayfinder:grilling Blocked by: None

进度:100%

已关闭。入口为 src/pages/cockpit/index.vue(薄);全部驾驶舱代码收在新建的 src/modules/cockpit;不使用 layout.vue。

Question

Fes.js 约定下,驾驶舱入口文件是 src/pages/cockpit.vue 还是 src/pages/cockpit/ 目录?

已知冲突:

  • ADR 0006 写 src/pages/cockpit.vue 与 src/modules/cockpit
  • ADR 0007 与 spec 写 src/pages/cockpit 与 src/modules/cockpit

需要决定唯一入口形态,以及模块代码是否全部放在 src/modules/cockpit。不要引入 TvT 插件目录作为交付主体。

Fes.js 路由事实(只读核实)

来源:node_modules/@fesjs/preset-built-in/dist/plugins/core/route/index.mjs。

  • 两种入口都产出 /cockpit:src/pages/cockpit.vue(文件名即路径段)与 src/pages/cockpit/index.vue(index 映射为空路径段,目录递归提供 /cockpit 前缀)。
  • 两者不能并存:同一 routePath 冲突时只取先遇到的一个并打警告,因此必须二选一。
  • pages 下的 components 目录不生成路由:isProcessDirectory 明确排除 components。
  • 不要用 .fes.js 的 router.routes:该配置一旦非空,路由生成器直接返回它,整个应用的文件路由(src/pages/index.vue、test.vue、app.jsx 里 /plugins 那套)全部失效。
  • layout.vue 会生成 layout 路由,供带子路由的目录使用;驾驶舱只有 /cockpit 一个路由,用不上。
  • src/modules 目前不存在:现有顶层目录为 .fes、common、components、images、models、pages、plugins、stores。
  • @ 别名指向 src(src/app.jsx 已在用 @/plugins/...),因此 @/modules/cockpit/... 可解析。

Answer

入口形态(Q1=A): src/pages/cockpit/index.vue,保持薄,只挂载外壳组件。目录形态给「入口薄 + 模块厚」留出位置,且改动文档面积最小。不采用 src/pages/cockpit.vue。明确排除在 .fes.js 写 router.routes:那会让全站文件路由失效。两种文件形态不得并存。

模块归属(Q2=A): 新建 src/modules/cockpit 作为驾驶舱唯一领域边界,收纳外壳、面板、地图服务、适配层与 mock。这是新增顶层目录,已在 ADR 0006/0007 记录。不放进 src/common/cockpit,也不拆到 src/components/cockpit 与 src/stores/cockpit。

面板与外壳位置(Q3=A): 全部放模块内,例如 @/modules/cockpit/CockpitShell.vue 与 @/modules/cockpit/panels/...。CockpitShell 是 spec 指定的公共测试 seam,与实现同址。面板不放 src/pages/cockpit/components/——虽然该目录已被路由排除、技术上安全,但会造成第二个边界并让导入方向别扭。

不使用 layout.vue(Q4=A): 外壳是模块里的 CockpitShell.vue,不是路由层 layout。

文档同步: ADR 0006 原写 src/pages/cockpit.vue,已改为 src/pages/cockpit/index.vue;ADR 0007 与 spec 的 src/pages/cockpit 表述补齐为 src/pages/cockpit/index.vue。