# 前端组件选型与替换指南
## 1. 文档目标
这份文档用于回答两个问题:
1. 当前 `front/` 已经有哪些前端基础组件与页面壳
2. 哪些“不完善但不承载业务规则”的前端组件适合用成熟开源组件替换
本文只讨论前端组件、交互容器、表现层能力与替换边界,不改变 `docs/architecture.md` 里已经确定的领域边界。
---
## 2. 组件替换原则
### 2.1 可以放心引入开源组件的范围
- 纯展示层组件
- 纯交互壳组件
- 表格、图表、树、分栏、拖拽、上传入口、媒体播放器 UI
- 不负责权限判断、不负责业务规则决策的基础组件
### 2.2 不应交给开源组件决定的范围
- 权限与身份判断
- 上传模式选择:`PROXY / DIRECT_SINGLE / DIRECT_MULTIPART`
- 分享是否可访问、可下载、可导入
- 工作空间路径合法性、同级重名规则、回收站恢复规则
- 任务是否可重试、是否可取消、状态机如何流转
结论:
- 开源组件负责“怎么展示、怎么交互”
- 业务代码负责“能不能做、规则是什么、最终状态如何判定”
---
## 3. 当前项目已有的核心基础组件
### 3.1 应用外壳
- `front/src/components/layout/Layout.tsx`
- 桌面端主壳
- 包含左侧导航、主题切换、任务摘要、退出按钮、`UploadCenter`
- `front/src/mobile-components/MobileLayout.tsx`
- 移动端主壳
- 包含顶部浮层、底部导航、主题切换、任务摘要、退出按钮、`UploadCenter`
- `front/src/admin/AdminLayout.tsx`
- 管理台二级导航壳
- 负责后台子页面切换,不承载业务规则
### 3.2 全局状态与共用组件
- `front/src/components/ThemeProvider.tsx`
- 亮暗主题上下文
- `front/src/components/ThemeToggle.tsx`
- 主题切换按钮
- `front/src/components/upload/UploadCenter.tsx`
- 全局上传队列浮层
- 展示任务数量、展开/收起、清理已完成任务
- `front/src/components/tasks/TaskSummaryPanel.tsx`
- 导航栏里的活动任务摘要
- `front/src/components/media/FileThumbnail.tsx`
- 文件缩略图/类型图标组件
### 3.3 现有组件短板
- 表格几乎全是页面内手写 `
`
- 文件树和文件详情面板仍是页面级拼装
- 上传入口是“按钮 + 隐藏 input”模式,拖拽能力弱
- 快传页面没有二维码、批量选择、可视化发送步骤
- 媒体预览/播放器能力基本空缺
- 管理台多个页面仍是占位页
---
## 4. 推荐引入的开源组件
以下推荐按“适合当前项目”优先,而不是单纯按星标排序。
### 4.1 `@tanstack/react-table`
- GitHub:
- 适合替换:
- `front/src/admin/users-list.tsx`
- `front/src/admin/files-list.tsx`
- `front/src/admin/fileblobs.tsx`
- `front/src/admin/shares.tsx`
- `front/src/admin/tasks.tsx`
- `front/src/pages/Shares.tsx`
- `front/src/pages/Tasks.tsx`
- 后续审计日志页
- 后续管理台所有表格页
- 适配原因:
- Headless,不会破坏当前玻璃拟态视觉
- 支持排序、筛选、分页、列配置、行操作
- 特别适合你这种“业务规则自写,视觉样式自定”的项目
- 替换边界:
- 仅替换表格渲染和交互
- 用户角色、封禁、删除、任务取消等操作仍调用现有业务 API
### 4.2 `@tanstack/react-virtual`
- GitHub:
- 适合替换:
- 网盘文件列表
- 管理台用户表
- 管理台文件审计表
- 任务列表与后续审计日志列表
- 适配原因:
- 大列表性能提升明显
- 与 `TanStack Table` 搭配自然
- 替换边界:
- 只负责渲染性能
- 不负责分页规则和数据源决策
### 4.3 `react-dropzone`
- GitHub:
- 适合替换:
- `front/src/pages/files/FilesPage.tsx` 的上传文件入口
- `front/src/transfer/pages/TransferPage.tsx` 的发送文件区域
- 适配原因:
- 现有上传入口过于基础
- 拖拽体验、选中文件反馈、目录导入体验都能更好
- 替换边界:
- 只负责文件选择与拖拽
- 上传策略仍由后端 `storage-governance` 决定
### 4.4 `react-arborist`
- GitHub:
- 适合替换:
- `front/src/pages/files/FilesPage.tsx` 的左侧目录树
- 适配原因:
- 当前目录树是递归按钮结构,功能够用但扩展性弱
- 后续若需要键盘导航、虚拟化、拖拽移动、懒加载,`react-arborist` 很合适
- 替换边界:
- 只负责树控件交互
- 路径合法性、移动规则、同名冲突仍由后端判定
### 4.5 `dnd-kit`
- GitHub:
- 适合替换:
- 文件移动的可视化拖拽
- 上传队列排序
- 后续管理台面板编排
- 适配原因:
- 你当前项目前端自定义程度高,`dnd-kit` 比重型集成组件更灵活
- 替换边界:
- 只负责拖拽行为
- 最终 move/copy 仍走现有 API
### 4.6 `react-resizable-panels`
- GitHub:
- 适合替换:
- 网盘页面三栏布局:目录树 / 文件表 / 文件详情
- 后续管理台多面板布局
- 适配原因:
- 当前 `FilesPage` 三栏是固定宽度,不利于高密度工作流
- 可调面板更符合“桌面工作台”气质
### 4.7 `recharts`
- GitHub:
- 适合替换:
- `front/src/admin/dashboard.tsx` 的遥测图表区域
- 后续请求趋势、活跃用户、存储分布图
- 适配原因:
- 当前后台总览以统计卡为主,图表层很薄
- `Recharts` 接入简单,适合当前 React 栈
- 替换边界:
- 只负责可视化
- 指标口径仍由后端 summary 接口定义
### 4.8 `vidstack`
- GitHub:
- 适合替换:
- 后续文件预览页里的音视频播放器
- 分享页的音视频预览层
- 适配原因:
- 当前项目几乎没有完整播放器能力
- `vidstack` 的 React 组合式设计很适合保留你的视觉系统
- 替换边界:
- 只负责播放 UI 与控制条
- 下载授权、预览授权、签名地址获取仍由业务接口负责
### 4.9 `hls.js`
- GitHub:
- 适合替换:
- 后续若引入 `m3u8` / 分片视频播放
- 适配原因:
- 这是 HLS 底层能力,不建议自己实现
- 替换边界:
- 作为播放器底层能力
- 不承载任何业务权限逻辑
---
## 5. 当前项目不建议优先引入的组件
### 5.1 `ag-grid`
- 功能很强
- 但对当前项目来说偏重
- 会明显抬高管理台复杂度和定制成本
- 只有在后台表格演进成“数据平台级界面”时才值得引入
### 5.2 重型文件管理器整包
- 不建议直接引入“整套 file manager UI”
- 原因是你的业务语义已经明显超出通用文件管理器:
- 分享
- 快传
- 异步任务
- 存储策略
- 管理治理
- 更适合按能力拆分引入单点组件,而不是整体换壳
---
## 6. 推荐替换优先级
### P1:立刻有价值
1. `@tanstack/react-table`
2. `react-dropzone`
3. `react-resizable-panels`
4. `recharts`
### P2:网盘工作区增强
1. `react-arborist`
2. `@tanstack/react-virtual`
3. `dnd-kit`
### P3:媒体预览体系建设
1. `vidstack`
2. `hls.js`
---
## 7. 页面与推荐组件映射
| 页面 | 当前问题 | 推荐组件 | 替换范围 |
| --- | --- | --- | --- |
| `/files` | 文件树、文件表、上传入口都较原始 | `react-arborist` + `TanStack Table` + `react-dropzone` + `react-resizable-panels` | 目录树、文件表、上传选择、三栏布局 |
| `/tasks` | 列表为手写表格 | `TanStack Table` | 列表渲染与排序/筛选 |
| `/shares` | 列表信息密度一般 | `TanStack Table` | 分享表格与列配置 |
| `/transfer` | 文件选择、状态展示、历史记录卡片较基础 | `react-dropzone` | 文件选择与拖拽体验 |
| `/admin/dashboard` | 图表能力偏弱 | `recharts` | 指标趋势和分布图 |
| `/admin/users` | 表格操作多但结构不稳定 | `TanStack Table` | 用户管理表格 |
| `/admin/files` | 审计表格可扩展性弱 | `TanStack Table` + `TanStack Virtual` | 文件审计表格和大列表性能 |
| `/admin/file-blobs` | 风险巡检列表尚未实现 | `TanStack Table` + `TanStack Virtual` | 对象实体列表、筛选、风险标签 |
| `/admin/shares` | 分享治理页尚未实现 | `TanStack Table` | 分享治理列表和筛选栏 |
| `/admin/tasks` | 全站任务监控尚未实现 | `TanStack Table` | 任务监控表格与详情侧栏 |
| `/admin/audits` | 审计日志前端未接线 | `TanStack Table` | 审计日志表格与筛选栏 |
| 媒体预览页(待建) | 目前无播放器体系 | `vidstack` + `hls.js` | 播放器和流媒体底层 |
---
## 8. 建议保留自研的部分
这些部分不建议被开源组件接管:
- `front/src/lib/upload-session.ts`
- `front/src/lib/upload-runtime.ts`
- `front/src/lib/background-tasks.ts`
- `front/src/lib/shares-v2.ts`
- `front/src/lib/files.ts`
- `front/src/transfer/api/transfer.ts`
- 页面内所有调用业务 API 的 action handler
原因:
- 它们直接对应项目自己的领域模型和 API 语义
- 它们才是“项目资产”,而不是 UI 可替换件
---
## 9. 最推荐的一组组合
如果只做一轮最稳、最值的升级,建议组合如下:
- 表格:`@tanstack/react-table`
- 大列表:`@tanstack/react-virtual`
- 上传入口:`react-dropzone`
- 目录树:`react-arborist`
- 分栏布局:`react-resizable-panels`
- 图表:`recharts`
- 播放器:`vidstack`
- HLS 底层:`hls.js`
这组组合和当前项目的契合点在于:
- 不会抢走业务规则所有权
- 能显著改善工作台体验
- 能让管理台和网盘页更专业
- 不会把前端重构成另一个不可控的大系统