02-mapcanvas-persistent-mount.md 2.3 KB

02: MapCanvas 常驻挂载

What to build: 将中央 MapCanvas 作为驾驶舱常驻组件挂载。切换一级模式或面板展开状态时,地图实例不销毁、不重建。

Blocked by: 01

Status: resolved Labels: ready-for-agent

  • MapCanvas 在 /cockpit 中只创建一次。
  • 切换四个一级模式时地图容器保持存在。
  • 收起/展开任意面板时地图不重建。
  • 地图实例生命周期由地图服务层管理,不散落在页面组件中。
  • 有地图生命周期单测或可观测走查记录。

进度:100%

已关闭。 中央一张图改为「常驻宿主组件 + 地图服务层持有实例生命周期」。

改动:

  • 新增 src/modules/cockpit/services/mapService.js —— 实例生命周期的唯一所有者:mountMap(host) 幂等(已挂载直接返回既有实例)、resizeMap() 尺寸上报、unmountMap() 只在离开 /cockpit 时销毁,并暴露 getLifecycleStats() 供断言。不依赖 DOM 与 Vue,可脱离浏览器直接测。
  • 新增 src/modules/cockpit/components/MapCanvas.vue(替换原 MapPlaceholder.vue):常驻宿主要素;挂载时调 mountMap,用 ResizeObserver 上报尺寸,卸载时调 unmountMap;宿主带 data-map-instance 供走查观测。
  • 外壳改用 MapCanvas;地图仍是「一张图铺满主体背景 + 左右两栏浮于其上」。

验证证据:

  • 逻辑单测(零依赖脚本,verify/t01-panel-catalog.mjs 新增一节):重复挂载返回同一实例、created 全程为 1、重复挂载不替换宿主、销毁计一次且之后无实例、未挂载时尺寸上报被忽略、销毁后重挂是新实例(id 不复用)—— 全通过。
  • 浏览器走查 17/17:A7 四模式切换后外壳与地图宿主标记存活且实例 id 不变;A13 面板收放高度真正变化;A14 四模式切换 + 面板收放之后宿主仍是同一元素、data-map-instance 仍为初始值、全页只有一个地图实例。

未纳入本票(需另行定夺)

本票验收清单只要求「常驻 / 生命周期」,未要求引擎渲染,因此未安装 Cesium,宿主内仍是临时影像底图。票 06 的调研曾把「创建 Cesium Viewer」写给票 02,与票面验收清单不一致 —— 已提请维护者定夺归属。