不销毁echarts实例必然导致三类连锁故障:视觉层残影错位空白叠加、运行时事件定时器失控泛滥、内存层阶梯式增长最终崩溃。

不销毁 ECharts 实例,路由切换时会直接触发连锁性故障,不是“可能出问题”,而是必然出现三类可复现的灾难性表现:
图表视觉层:残影、错位、空白反复叠加
旧图表 DOM 容器未被移除,新图表又 init 到同一节点,导致:
- 多个 canvas/svg 元素堆叠在同一个 div 下,缩放或重绘时互相干扰,出现撕裂、偏移、坐标错乱
- 切换回原页面时显示上一页的数据(因为实例还在跑,setOption 被调到了旧 chart 上)
- 容器区域看似“空白”,实则 canvas 已渲染但被遮挡,或 width/height 为 0 —— 控制台常报 Cannot read property 'getWidth' of null
运行时层:事件与定时器失控泛滥
ECharts 内部注册的 resize 监听、dataZoom 动画帧、timeline 自动轮播等,不会随组件卸载自动清除:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- window.addEventListener('resize') 残留,每次窗口变动都在所有已缓存页面中触发回调,CPU 占用飙升
- setInterval 持续拉取旧接口、更新旧数据,不仅浪费带宽,还可能把错误数据写入全局 store
- 回调函数闭包里持有 this.chart、this.data 等引用,让整个组件实例无法被垃圾回收
内存层:阶梯式增长,最终卡死崩溃
每个未 dispose 的 ECharts 实例平均占用 2–5MB 内存(含 canvas 缓存、代理对象、动画状态),keep-alive 场景下尤为致命:
- 每切一次页面,内存上涨一块;10 次后多占 30MB+,Chrome 标签页内存轻松突破 500MB
- Heap Snapshot 中能看到大量 ECharts 构造函数实例,Retainers 显示它们被 window 或 Vue 组件强引用
- DOM 节点数持续不降,“Detached DOM trees” 堆积,VNode 因闭包链无法释放,GC 失效
这不是缓慢退化,而是快速雪崩。大屏项目切 3–5 次菜单后卡顿明显,8–10 次后页面无响应,强制刷新才恢复 —— 根子就在没调 dispose。










