refactor(quality): Q26 前端巨型组件拆分 — PodLogsViewer 553L→331L (-40%), 提取 pod-logs-viewer/ 5 个文件 (types.tsx(highlightKeyword 纯函数) + LogsHeader(66L) + ControlBar(178L) + LogContentArea(64L) + BottomStatusBar(42L)), renderLine 内联函数提取为模块级 highlightKeyword 纯函数, catch 类型安全升级 (e?.message→e instanceof Error), 零逻辑变更, ESLint errors=0/warnings=65/any=0, tsc -b=0, npm build✓ (17.34s), 17/17 测试通过

This commit is contained in:
attacker committed 2026-07-09 03:37:35 +08:00
1 parent e5f969d2c7
commit 03a84049fb
9 files changed
+542 -301

No files matched your search

+39
View File
@@ -497,6 +497,45 @@ services/api.ts (1324L)
| Q23 | 前端巨型组件拆分(CloudAccountManager 572L→308L,提取 cloud-account/types(AccountFormData/AccountStats + 6 个纯函数) + AccountCard(178L) + AccountFormDialog(162L)) | P0 | **done** |
| Q24 | 前端巨型组件拆分(ExcelServerImport 560L→385L,提取 excel-import/types(6 个 CSV 纯函数) + StepIndicator + PreviewTable) | P0 | **done** |
| Q25 | 前端巨型组件拆分(PipelineCreateDialog 559L→498L,提取 pipeline-create/types(PRESETS/DEFAULT_TARGET) + AdvancedSettingsPanel(172L 受控展开面板)) | P0 | **done** |
| Q26 | 前端巨型组件拆分(PodLogsViewer 553L→331L,提取 pod-logs-viewer/types(highlightKeyword 纯函数) + LogsHeader + ControlBar + LogContentArea + BottomStatusBar) | P0 | **done** |
---
## Q26: 前端巨型组件拆分 — PodLogsViewer [done]
**问题**: `PodLogsViewer.tsx`(553 行)是 Q25 拆分后项目最大的 K8s 业务组件之一,包含 Pod 日志查看器的全部逻辑:~25 个 useState/useRef 状态管理、fetch ReadableStream 实时流式日志(tail -f 效果)、10000 行环形缓冲、一次性日志拉取、关键字过滤+高亮渲染、多容器选择、行数限制、previous 日志、时间范围筛选、下载导出、暂停/继续、全屏切换、以及 4 个内联 JSX 区块(头部工具栏/控制栏/日志内容区/底部状态条)。单文件过大导致维护困难。
**已完成 (2026-07-09)**:
将类型/常量/纯函数、头部工具栏、控制栏、日志内容区、底部状态条提取为 `pod-logs-viewer/` 子目录下的独立文件:
| 新文件 | 行数 | 职责 |
|--------|------|------|
| `types.tsx` | 57 | PodLogsViewerProps/LogLine 接口 + RING_BUFFER_MAX/TAIL_OPTIONS 常量 + `highlightKeyword(text, keyword)` 关键字高亮纯函数(返回 ReactNode,用 `<mark>` 包裹匹配片段) |
| `LogsHeader.tsx` | 66 | 头部工具栏(状态指示灯 streaming/paused/idle + ScrollText 图标 + Pod 名称 + 行数统计 + 全屏/关闭按钮),接收 11 个 props 的受控展示组件 |
| `ControlBar.tsx` | 178 | 控制栏(容器选择 + 行数限制 + previous 切换 + sinceTime 时间 + 关键字过滤 + 下载 + 刷新 + 实时流/暂停/停止按钮),接收 23 个 props 的受控展示组件 |
| `LogContentArea.tsx` | 64 | 日志内容可滚动区(空状态 + 加载状态 + 关键字高亮行渲染 + onScroll 自动滚动检测),接收 9 个 props 的受控展示组件 |
| `BottomStatusBar.tsx` | 42 | 底部状态条(缓冲计数 + 匹配数 + 容器/previous 标签 + 自动滚动开关),接收 8 个 props 的受控展示组件 |
主文件 `PodLogsViewer.tsx` 从 **553 行降至 331 行**(-40%),仅保留:状态管理(fullscreen/container/tailLines/previous/sinceTime/keyword/autoScroll/streaming/paused/loading + lines + 7 个 ref)、refs 同步 effects、环形缓冲 `appendLines`、`stopStream`/`fetchLogs`/`startStream` 回调、自动拉取/参数变化 effects、`handleClose`/`handleDownload` 回调、`filteredLines` useMemo、以及 Dialog 外壳 + 5 个子组件编排。
**关键改进**:
- **纯函数提取**: 原 `renderLine(line)` 内联函数(25 行关键字高亮 JSX 拆分逻辑)提取为 `highlightKeyword(text, keyword)` 模块级纯函数,消除每次 render 重建闭包。
- **类型安全**: catch 块从 `e?.message` 改为 `e instanceof Error ? e.message : String(e)` 类型安全访问;`e?.name === 'AbortError'` 改为 `(e as { name?: string })?.name === 'AbortError'`。
- **受控组件架构**: 5 个子组件全部为受控展示组件(接收状态 + setter/回调 props),无独立状态。所有状态管理和流式逻辑保留在主组件,拆分为纯机械操作(移动 JSX + 添加 props 透传),零逻辑变更。
**验收标准**:
- [x] PodLogsViewer.tsx 从 553 行降至 **331 行**(-40%)
- [x] 5 个提取的文件全部 < 180 行(最大 ControlBar 178 行)
- [x] `tsc -b` 零错误
- [x] `npm run build` 零错误(✓ built in 17.34s)
- [x] ESLint errors 保持 **0**(PodLogsViewer + pod-logs-viewer/ 目录零 errors/warnings)
- [x] ESLint warnings 保持 **65**(无新增)
- [x] 全局 ESLint any 保持 **0**
- [x] `go build` 零错误
- [x] 17/17 集成回归测试通过(零回归)
- [x] Docker 部署 healthy,前端页面正常加载(HTTP 200)
- [x] Pod 日志查看器功能不变(容器选择/行数限制/previous/sinceTime/关键字过滤+高亮/下载/刷新/实时流/暂停继续/全屏切换全部正常)
---