[P1][CR-F9/F10] 前端上帝对象、重复常量与事件监听器只增不减 #533
Loading…
Reference in New Issue
No description provided.
Delete Branch "%!s(<nil>)"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
问题描述
WorldPanelsHud一个类有约 2700 行、78 个方法。dispose()。目前大多数场景切换都会刷新页面,所以监听器泄漏还不明显。但在 HMR、测试,以及今后不刷新页面的场景切换(#526 的
SceneController)中,监听器会成倍累积,同一个事件会被处理多次。证据
F9:上帝对象与重复
WorldPanelsHud(world-panels.ts:618-3355):约 2700 行、78 个方法,混合了仓库、赫拉迪克方块、商店、传送小站、任务、NPC 菜单和 tooltip 本地化。它还直接修改金币(见 #520)。HudManager:同时持有背包、仓库、技能树和职业配置。城镇 ID:
[1, 40, 75, 103, 109]在 5 处内联:entry.slug.includes('town')这种按名字的判断)而具名常量已经有 3 个:
ACT_TOWNS(acts.ts:291)TOWN_LEVEL_IDS(scene-population.ts:56)drlg-dump.ts里的另一个TOWN_LEVEL_IDS其他重复:safe-zone / rebudget 逻辑有 3 份;"帧元组 →
AtlasFrame"的映射约有 6 份(其中一份见 missile-overlay-renderer.ts:82-91)。F10:监听器生命周期
addEventListenerremoveEventListenerui/hud-manager.tsdispose()scene/net-scene.tsscene/frontend/toolbar-chat-ui.ts.onXxx =赋值frontend/bnet-main.tsscene/frontend/mouse-controller.tsrender/renderer.ts目前只有在
beforeunload时才做清理。根因
修复指南
target.addEventListener(type, handler, { signal: d.signal }),dispose()时一次性全部移除;.onXxx =赋值改为addEventListener(同时解决 #534 中"同一元素挂两个 change 处理器"的问题);add()登记。dispose():HudManager、net-scene、toolbar-chat-ui、bnet-main优先。SceneController(#526)销毁时,按创建顺序的逆序调用各模块的dispose()。WorldPanelsHud:按领域拆成StashPanel、CubePanel、VendorPanel、WaypointPanel、QuestPanel、NpcMenu、TooltipFormatter等。交易、存取金币等规则通过引擎命令完成(#520),面板只负责展示和发出命令。game/中的一个isTownLevel(levelId),其他地方都引用它;删除 5 处内联数组、多余的常量,以及slug.includes('town');AtlasFrame"各自抽成一个函数。WorldPanelsHud,每拆一个面板单独一个 PR。验收标准
signal),并且都有dispose()。dispose()场景 3 次后,window/document上的监听器数量回到基线(可以用包装后的addEventListener计数)。src/中城镇 ID 的内联数组为 0,只保留一个isTownLevel。WorldPanelsHud拆分后,单个类不超过 800 行。npm run typecheck0 error;npx vitest run全部通过。相关
SceneController的生命周期。#act上重复挂载的 change 处理器。