# 02: MapCanvas 常驻挂载 **What to build:** 将中央 `MapCanvas` 作为驾驶舱常驻组件挂载。切换一级模式或面板展开状态时,地图实例不销毁、不重建。 Blocked by: 01 Status: resolved Labels: ready-for-agent - [x] `MapCanvas` 在 `/cockpit` 中只创建一次。 - [x] 切换四个一级模式时地图容器保持存在。 - [x] 收起/展开任意面板时地图不重建。 - [x] 地图实例生命周期由地图服务层管理,不散落在页面组件中。 - [x] 有地图生命周期单测或可观测走查记录。 ## 进度: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,与票面验收清单不一致 —— 已提请维护者定夺归属。