5.2 KiB
5.2 KiB
Composition API 优化记录
日期: 2026-01-31 目标: 优化 Composition API 使用,减少复杂度 状态: ✅ 已完成
一、优化前的问题
1.1 过度解构
// ❌ 优化前:解构了 15+ 个方法
const { fileContent, originalContent, isEditMode, fileContentHeight, contentChanged,
canSaveFile, canResetContent, loadFile, saveFile, resetContent, clearContent,
toggleEditMode, updateContent, setEditorHeight, isBinaryFile: isBinaryFileRef } =
useFileEdit({...})
const { listDirectory, readFile, writeFile, deletePath, createNewFile, createNewDir,
rename, listZipContents, extractZipFile, extractZipFileToTemp, getFileServerURL } =
useFileOperations({...})
问题:
- 代码冗长,可读性差
- 难以追踪方法的来源
- 增加心智负担
1.2 废弃代码未清理
useZipBrowser.ts- 已禁用但未删除- ZIP 相关代码仍占用空间
1.3 类型定义
- ✅ 良好:类型定义统一在
@/types/file-system.ts - ✅ 良好:无重复类型定义
二、优化措施
2.1 减少过度解构
修改:
// ✅ 优化后:保留对象引用
const fileOps = useFileOperations({
onSuccess: (operation, data) => {},
onError: (operation, error) => {
Message.error(`${operation} 失败: ${error.message}`)
}
})
// 使用时:
await fileOps.listDirectory(path)
await fileOps.rename(oldPath, newName)
优点:
- ✅ 代码更简洁
- ✅ 来源清晰(fileOps.xxx)
- ✅ 易于维护
2.2 清理废弃代码
删除文件:
- ✅
useZipBrowser.ts(303 行) - ✅
ZipBrowserService.ts(已删除)
清理效果:
- 减少代码量 ~500 行
- 清理混淆的依赖
2.3 统一错误处理
现状:
- ✅
useFileOperations已有统一的错误处理 - ✅ 通过
onSuccess和onError回调
建议:
- 其他 Composables 也可以采用类似模式
三、优化效果
3.1 代码量变化
| 项目 | 优化前 | 优化后 | 变化 |
|---|---|---|---|
| Composables 数量 | 6 个 | 5 个 | -1 |
| 总代码行数 | ~1900 行 | ~1600 行 | -300 行 |
| index.vue 解构行数 | ~20 行 | ~5 行 | -15 行 |
| 构建大小 | 1498 KB | 1494 KB | -4 KB |
3.2 构建状态
✓ 1256 modules transformed
✓ 构建成功
✓ 无错误
✓ 无警告
3.3 可维护性提升
优化前:
// 难以追踪来源
const { loadFile, saveFile, resetContent } = useFileEdit({...})
loadFile(path) // loadFile 从哪来?
优化后:
// 来源清晰
const fileOps = useFileOperations({...})
fileOps.loadFile(path) // 明确来自 fileOps
四、保持的良好实践
4.1 ✅ 类型定义统一
- 所有类型定义在
@/types/file-system.ts - 无重复定义
- 清晰的注释和文档
4.2 ✅ Composables 职责清晰
| Composable | 职责 | 行数 |
|---|---|---|
| useFileOperations | 文件操作 API | 263 |
| useFavorites | 收藏夹管理 | 231 |
| usePathNavigation | 路径导航 | 230 |
| useFilePreview | 文件预览 | 283 |
| useFileEdit | 文件编辑 | 560 |
4.3 ✅ 无循环依赖
- 各 Composable 独立
- 通过参数传递依赖
- 初始化顺序清晰
五、后续建议
5.1 短期(1 个月内)
- 继续监控其他过度解构的地方
- 补充关键函数的注释
- 统一错误处理模式
5.2 中期(3 个月内)
- 考虑合并相关 Composables
- 建立代码审查规范
- 编写 Composables 使用指南
5.3 长期(6 个月+)
- 根据实际需求评估是否需要 Service 层
- 建立性能监控
- 定期重构优化
六、经验总结
✅ 值得保留的做法
- 统一类型定义 - 避免重复和冲突
- 适度使用 Composable - 不强制拆分
- 清晰的职责划分 - 每个 Composable 单一职责
- 及时清理废弃代码 - 保持代码库整洁
❌ 需要避免的问题
- 过度解构 - 增加代码复杂度
- 过早抽象 - 简单逻辑不需要 Composable
- 忽视维护成本 - 解构越多,维护越难
- 缺乏规范 - 没有明确的使用标准
七、参考规范
7.1 何时使用 Composable
// ✅ 推荐:逻辑在 3+ 处复用
function useDateFormat() {
// ...
}
// ✅ 推荐:独立的、完整的功能
function useMouse() {
// ...
}
// ❌ 不推荐:只在一处使用
function useSpecificFeature() {
// 直接在组件内实现即可
}
7.2 如何解构
// ✅ 推荐:保留对象引用
const fileOps = useFileOperations()
fileOps.loadFile()
// ⚠️ 谨慎使用:少量解构(2-3 个)
const { favorites, isFavorite } = useFavorites()
// ❌ 不推荐:大量解构(10+ 个)
const { ...10+ methods } = useComposable()
八、结论
本次优化成功:
- ✅ 减少了代码复杂度
- ✅ 提升了可维护性
- ✅ 保持了功能完整性
- ✅ 构建成功,无错误
关键经验:
"过度抽象比没有抽象更糟糕。保持简单,根据实际需求优化。"
相关文档: