refactor(quality): Q16 前端巨型组件拆分 — RdpDialog 642L→442L (-31%), 提取 types + rdpp-utils + RdpDialogHeader 3 个独立文件, 清理 RDP_DIALOG_VERTICAL_GAP 死代码, 零逻辑变更, ESLint errors=0, tsc -b=0, npm build✓, 17/17 测试通过

This commit is contained in:
attacker committed 2026-07-08 03:05:13 +08:00
1 parent 1f3b419d62
commit 4905724338
6 files changed
+374 -247

No files matched your search

+34
View File
@@ -487,6 +487,40 @@ services/api.ts (1324L)
| Q13 | 前端巨型组件拆分(UnifiedQueryPanel 682L→529L,提取 constants + entry-mappers + 5 个 UI 子组件) | P0 | **done** |
| Q14 | 前端巨型组件拆分(ServerManager 652L→442L,提取 ServerTableSection + server-export-utils) | P0 | **done** |
| Q15 | 前端巨型组件拆分(PipelineEditor 676L→406L,提取 types + TaskCard + TaskEditorPanel + PipelineLogDialog + RunsHistoryTab + PipelineMembersTab) | P0 | **done** |
| Q16 | 前端巨型组件拆分(RdpDialog 642L→442L,提取 types + rdpp-utils + RdpDialogHeader) | P0 | **done** |
---
## Q16: 前端巨型组件拆分 — RdpDialog [done]
**问题**: `RdpDialog.tsx`(642 行)是 Q15 拆分后项目最大的核心业务组件之一(排除 UI 库 sidebar/data-table),包含 RDP 远程桌面弹窗的全部逻辑:接口定义 + 分辨率常量、视口计算纯函数(clampRdpSize/calcRdpViewport)、位图绘制/二进制帧解析纯函数(paintBitmap/parseRawFrame)、修饰键状态工具、WebSocket 连接生命周期、鼠标/键盘事件处理、帧绘制(bitmap/rawFrame 双通道)、以及内联的顶部标题栏 JSX(连接状态指示 + 工具弹窗 + 全屏/关闭按钮)。单文件过大导致维护困难。
**已完成 (2026-07-08)**:
将类型/常量、纯函数、标题栏组件提取为 `rdp-dialog/` 子目录下的独立文件:
| 新文件 | 行数 | 职责 |
|--------|------|------|
| `types.ts` | 55 | RdpDialogProps/RdpFrame/RdpStats/RdpRawFrame/KeyModifierState 接口 + 分辨率常量(RDP_DEFAULT_WIDTH 等 9 个) |
| `rdp-utils.ts` | 133 | clampRdpSize/calcRdpViewport(视口计算)+ paintBitmap/parseRawFrame(位图绘制/二进制帧解析)+ readModifiers(修饰键提取)纯函数 |
| `RdpDialogHeader.tsx` | 105 | 顶部标题栏(连接状态指示灯 + 服务器名/IP + 工具 Popover + 全屏/关闭按钮),接收 13 个 props 的受控展示组件 |
主文件 `RdpDialog.tsx` 从 **642 行降至 442 行**(-31%),仅保留:refs(canvas/ws/paintQueue/stats/mouseMove/keyModifier)、状态管理(connected/fullscreen/status/hasFrame/canvasSize/displaySize/toolsOpen/remoteClipboard)、sendEvent/flushMouseMove/sendMouseMove、patchKeyModifier/handleKeyDown/handleKeyUp/requestRemoteCopy、drawRawFrame/drawFrame(使用 refs + state)、WebSocket 生命周期 effect、canvasPoint/canvas 事件 JSX、loading/error 覆盖层。
**提取原则**: types 为纯数据/类型定义(零 React 依赖);rdpp-utils 为纯函数(接收参数返回结果,零 React 依赖,`paintBitmap` 接收 ctx + frame,`parseRawFrame` 接收 Blob/ArrayBuffer);RdpDialogHeader 为受控展示组件(接收全部状态 + 回调 props,内部仅 useTranslation)。零逻辑变更。清理了 `RDP_DIALOG_VERTICAL_GAP` 死代码(calcRdpViewport 的非全屏分支提前 return,该常量在后续分支不可达)。
**验收标准**:
- [x] RdpDialog.tsx 从 642 行降至 **442 行**(-31%)
- [x] 3 个提取的文件全部 < 135 行(最大 rdpp-utils 133 行)
- [x] `tsc -b` 零错误
- [x] `npm run build` 零错误(✓ built in 15.78s)
- [x] ESLint errors 保持 **0**(清理 1 个 unused import: RDP_DIALOG_VERTICAL_GAP)
- [x] ESLint warnings 保持 **64**(无新增)
- [x] 全局 ESLint any 保持 **0**
- [x] `go build` 零错误
- [x] 17/17 集成回归测试通过(零回归)
- [x] Docker 部署 healthy
- [x] RDP 远程桌面弹窗功能不变(WebSocket 连接/帧绘制/鼠标键盘/剪贴板同步/文件下载/全屏切换全部正常)
---