Skip to content

fix(frontend): clear lint issues and enforce lint gate - #6

Merged
KDB-Wind merged 1 commit into
mainfrom
fix/frontend-lint-cleanup
Aug 11, 2026
Merged

fix(frontend): clear lint issues and enforce lint gate#6
KDB-Wind merged 1 commit into
mainfrom
fix/frontend-lint-cleanup

Conversation

@KDB-Wind

Copy link
Copy Markdown
Owner

背景

前端
pm run lint\(eslint . --ext .ts,.tsx --max-warnings 0)存量 29 errors + 17 warnings,CI 中 lint 长期 continue-on-error。本次把 lint 清零并将 CI 的 lint 提升为硬门禁。

改动分类

错误修复(29 errors)

  • react-refresh/only-export-components(14 处):.eslintrc.cjs\ 开启 \�llowConstantExport\(官方推荐,放行 Literal/TemplateLiteral 常量);DocumentPreview 的 5 个纯函数拆到 \previewUtils.ts\(组件文件只导出 DocumentPreview,KnowledgeDocumentsPage import 同步更新);AgentAvatar 的 AGENT_AVATARS/randomAvatarKey 拆到 \�gentAvatarPresets.ts\;AgentModeLabel 的 OTHER_MODE_LABEL 拆到 \�gentModeLabels.ts\;router 实例拆到
    outerConfig.tsx\(router.tsx 只留 4 个路由守卫组件,App.tsx import 更新);ui/badge、ui/button 的 cva variants 与 ui/form 的 useFormField 属 shadcn 标准结构,按社区通行做法对具体导出行加行级豁免并附原因
  • no-unsafe-finally(4 处:chatStore/DashboardPage/RagTracePage/RagTraceDetailPage):finally 内 return 改为 if 条件包裹,行为严格等价
  • @ts-nocheck(2 处:MarkdownRenderer/authStore):移除后修复真实类型错误,同时移除两文件的整文件 eslint-disable。MarkdownRenderer 的 img 回调(组件内 useState 违反 rules-of-hooks)提升为顶层 MarkdownImage 组件;react-markdown v9 已移除 inline prop,代码内联判断同步更新
  • no-explicit-any(3 处:AdminLayout 菜单 icon 改 LucideIcon、RagTraceDetailPage 空数组改 TimelineNode[])
  • no-constant-condition(1 处):useStreamResponse 的 SSE 读取循环加行级豁免(内部 aborted/done break,无固定上界)
  • no-irregular-whitespace(1 处):source.ts 正则中的全角空格 U+3000 是有意匹配目标,加行级豁免
  • 移除 @ts-nocheck 后暴露的 service 层类型错误:authService/chatService/sessionService 的 11 处单泛型 \�pi.get\ 改为双泛型 \�pi.get<T, T>\,与 api.ts 拦截器解包 response.data 的运行时行为对齐(其余 service 已是双泛型);另修复 3 个存量类型错误(FeedbackButtons 无效的 onOpenAutoFocus prop、IngestionPage 条件表达式类型、KnowledgeDocumentsPage zod v4 input/output 类型分化)

warning 修复(17 处 exhaustive-deps)

  • 10 个页面/组件的 loadXxx 本地函数用 useCallback 包裹并加入 effect 依赖(BizChangeLog/Ingestion/Dashboard/KnowledgeChunks/KnowledgeDocuments/KnowledgeList/QueryTermMapping/SampleQuestion/UserList/RagTracePage),effect 重跑时机与原依赖完全一致
  • IngestionPage PipelineDialog 的 createLocalId/mapSettingsTasks/buildNodeForm/buildNodesFromPipeline 链式 useCallback(引用全部稳定化,不会引入循环)
  • KnowledgeDocumentsPage 的 detailTarget effect 补 specSchema 依赖(state 稳定引用)
  • RagTracePage 的
    uns = pageData?.records || []\ 用 useMemo 包裹(逻辑表达式每次渲染新引用会破坏下方 useMemo)
  • MessageList useLayoutEffect 补 scrollToBottom(已是稳定 useCallback)
  • IntentTreePage 树加载 effect 保留空依赖 + 行级豁免:loadTree 捕获 focusIntentCode 作为初始聚焦值,树只需加载一次,URL 聚焦码变更由专用 effect 处理选中,重载会引入多余请求与 loading 闪烁

死代码清理

  • 删除 \ rontend/@/\ 目录(14 个文件):fork 本地 commit c22ba88(2026-01-25)引入,tsconfig include/paths 与 vite alias 从未引用,且内容已被 src/components/ui 取代(含 3 个未迁移的旧文件 progress/sheet/tabs),属从未生效的死代码

CI

  • .github/workflows/ci.yml\ 前端 job 的 Lint step 移除 \continue-on-error: true\,lint 成为硬门禁(存量问题已清零)

验证


  • pm run lint\:0 problems(0 errors, 0 warnings)

  • pm run test\:16/16 通过(useStreamResponse 6 / chatStore 6 / ChatInput 4,chatStore 的 selectSession finally 重构有 6 个用例覆盖)

  • pm run build\:通过

  • px tsc -b\:0 errors(移除 @ts-nocheck 后全仓类型检查干净)

需要人工复核的点

  1. chatStore.selectSession / 三个页面的 loadXxx 重构均为行为等价改写,但涉及数据加载主链路,建议合入后冒烟一遍对应页面
  2. IntentTreePage 树加载 effect 保持空依赖(豁免),行为不变;其余 loadXxx 的 useCallback 依赖链行为与原来等价
  3. MarkdownRenderer 内联代码判断:v9 不再提供 inline prop,删除后行为与当前运行行为一致(inline 恒为 undefined)
  4. service 层双泛型修复是类型声明对齐运行时(拦截器解包),无运行时变化

@KDB-Wind
KDB-Wind merged commit 8e0fbd9 into main Aug 11, 2026
2 checks passed
@KDB-Wind
KDB-Wind deleted the fix/frontend-lint-cleanup branch August 11, 2026 11:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant