Skip to content

Commit d027d2f

Browse files
Merge pull request #6 from MidnightCrowing/feat/remote-ssh-projects
feat/remote-ssh-projects
2 parents 08bf500 + 629d269 commit d027d2f

26 files changed

Lines changed: 1792 additions & 837 deletions
Lines changed: 193 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,193 @@
1+
# HomeView.vue Composables 重构总结
2+
3+
## 重构目标
4+
5+
将 HomeView.vue 从单一巨型组件(2745 行)拆分为多个可维护的 composables,提高代码可读性、可测试性和可复用性。
6+
7+
## 重构成果
8+
9+
### 总体指标
10+
11+
| 指标 | 重构前 | 重构后 | 变化 |
12+
|------|--------|--------|------|
13+
| HomeView.vue 行数 | 2745 | 2154 | **-591 行 (-21.5%)** |
14+
| Composables 数量 | 0 | 7 | +7 |
15+
| Composables 总行数 | 0 | 935 | +935 |
16+
| 总代码行数 | 2745 | 3089 | +344 |
17+
18+
**注:** 总代码行数增加是因为增加了接口定义、JSDoc 注释和更清晰的结构,这些都提高了代码质量。
19+
20+
### 提取的 Composables
21+
22+
#### 阶段1: 基础数据处理(3个 composables,-230 行)
23+
24+
1. **useDisplayPathCache** (66 行)
25+
- 功能:路径显示缓存管理
26+
- 优化:移除 Windows 冗余前缀,加速路径显示
27+
- 文件:`src/views/HomeView/composables/useDisplayPathCache.ts`
28+
29+
2. **useProjectSearch** (98 行)
30+
- 功能:基于 Fuse.js 的模糊搜索
31+
- 特性:防抖、索引缓存、增量更新
32+
- 文件:`src/views/HomeView/composables/useProjectSearch.ts`
33+
34+
3. **useProjectFilters** (218 行)
35+
- 功能:项目过滤、排序和统计
36+
- 包含:类型过滤、状态过滤、语言过滤、排序逻辑
37+
- 文件:`src/views/HomeView/composables/useProjectFilters.ts`
38+
39+
#### 阶段2: 交互与显示(3个 composables,-313 行)
40+
41+
4. **useProjectOpenState** (167 行)
42+
- 功能:项目和终端打开状态管理
43+
- 特性:最短可见时长防闪烁逻辑
44+
- 文件:`src/views/HomeView/composables/useProjectOpenState.ts`
45+
46+
5. **useVirtualScroll** (139 行)
47+
- 功能:虚拟滚动增量渲染
48+
- 优化:提高大列表初始渲染性能
49+
- 文件:`src/views/HomeView/composables/useVirtualScroll.ts`
50+
51+
6. **useProjectMenus** (159 行)
52+
- 功能:项目右键菜单构建
53+
- 包含:编辑器选择菜单、项目操作菜单
54+
- 文件:`src/views/HomeView/composables/useProjectMenus.ts`
55+
56+
#### 阶段3: 导航管理(1个 composable,-48 行)
57+
58+
7. **useProjectNavigation** (88 行)
59+
- 功能:滚动位置记忆和导航
60+
- 特性:支持列表/卡片两种布局独立状态
61+
- 文件:`src/views/HomeView/composables/useProjectNavigation.ts`
62+
63+
## 代码质量提升
64+
65+
### 1. 可读性
66+
67+
- ****:2745 行的单一文件,需要大量滚动查找功能
68+
- ****:7 个职责明确的 composables,每个文件独立管理特定功能
69+
70+
### 2. 可维护性
71+
72+
- 每个 composable 都有清晰的文档注释
73+
- 依赖关系明确,通过参数注入
74+
- 状态管理集中,避免分散的响应式变量
75+
76+
### 3. 可测试性
77+
78+
- Composables 可以独立测试,无需挂载整个组件
79+
- 依赖注入使得 mock 更容易
80+
- 每个 composable 有明确的输入输出
81+
82+
### 4. 可复用性
83+
84+
- `useDisplayPathCache` 可用于其他需要路径显示的组件
85+
- `useProjectSearch` 的 Fuse.js 封装可复用
86+
- `useVirtualScroll` 可用于其他大列表场景
87+
88+
## 技术亮点
89+
90+
### 1. 依赖注入模式
91+
92+
```typescript
93+
export function useProjectMenus(deps: MenuDependencies) {
94+
const { t, editorHasLaunchCommand } = deps
95+
// ...
96+
}
97+
```
98+
99+
通过接口定义依赖,而不是直接导入 stores,提高了可测试性。
100+
101+
### 2. 智能索引缓存
102+
103+
```typescript
104+
// useProjectSearch.ts
105+
// 只在搜索相关字段变化时重建索引
106+
const indexKey = computed(() =>
107+
projects.value.map(p => `${p.appendTime}:${p.name}:${p.path}:${p.mainLang}:${p.group}`).join('|')
108+
)
109+
```
110+
111+
避免无关更新(如 `isExists`)触发昂贵的索引重建。
112+
113+
### 3. 防抖优化
114+
115+
```typescript
116+
// useProjectSearch.ts
117+
// 100ms 防抖,减少搜索计算
118+
const debouncedSearchValue = ref('')
119+
const searchDebounceTimer: ReturnType<typeof setTimeout> | null = null
120+
```
121+
122+
### 4. 最短可见时长防闪烁
123+
124+
```typescript
125+
// useProjectOpenState.ts
126+
// 确保 loading 图标至少显示 2200ms,避免快速闪烁
127+
const MIN_PROJECT_OPENING_VISIBLE_MS = 2200
128+
```
129+
130+
### 5. 虚拟滚动
131+
132+
```typescript
133+
// useVirtualScroll.ts
134+
// 列表初始渲染 160 项,卡片初始渲染 72 项
135+
// 通过 IntersectionObserver 实现按需加载
136+
```
137+
138+
## Git 提交历史
139+
140+
```
141+
71ebbe8 refactor(home): extract useProjectMenus composable
142+
2b4e487 refactor(home): extract useProjectNavigation composable
143+
91cf6ae refactor(home): extract useVirtualScroll composable
144+
ec29f4c refactor(home): extract useProjectOpenState composable
145+
e2d3d91 refactor(home): extract useProjectFilters composable
146+
c8b358f refactor(home): extract useProjectSearch composable
147+
30c58ee refactor(home): extract useDisplayPathCache composable
148+
ea69e6e refactor(home): create composables directory
149+
```
150+
151+
## 验证结果
152+
153+
所有检查通过:
154+
- ✅ TypeScript 类型检查 (`pnpm typecheck`)
155+
- ✅ ESLint 代码规范 (`pnpm lint`)
156+
- ✅ 前端单元测试 (`pnpm test`)
157+
- ✅ Rust 测试 (`pnpm test:rust`)
158+
159+
## 未来改进方向
160+
161+
### 1. 继续拆分
162+
163+
剩余的项目操作逻辑(~200 行)可以提取为 `useProjectActions`
164+
- `openProject`
165+
- `openProjectWithEditor`
166+
- `openRemoteProjectWithEditor`
167+
- `openProjectInTerminal`
168+
- `copyProjectPath`
169+
- `handleProjectMenuSelect`
170+
171+
### 2. 测试覆盖
172+
173+
为每个 composable 编写单元测试:
174+
- `useProjectSearch.test.ts` - 测试模糊搜索逻辑
175+
- `useProjectFilters.test.ts` - 测试过滤和排序
176+
- `useVirtualScroll.test.ts` - 测试虚拟滚动加载
177+
178+
### 3. TypeScript 优化
179+
180+
添加更严格的类型定义:
181+
- Composable 返回值类型
182+
- 事件处理器类型
183+
- 泛型约束
184+
185+
## 总结
186+
187+
这次重构成功地将 HomeView.vue 从单一巨型组件拆分为多个职责明确的 composables,在保持功能完整的同时,显著提升了代码的可读性、可维护性和可测试性。重构过程中没有引入任何功能回归,所有现有功能正常工作。
188+
189+
**关键成果:**
190+
- 减少 HomeView.vue **21.5%** 的代码量
191+
- 提取 **7 个可复用 composables**
192+
- 提高代码质量和可维护性
193+
- 为未来功能扩展打下良好基础

icons/trae-color.svg

Lines changed: 1 addition & 0 deletions
Loading

src-tauri/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ pub fn run() {
2525
project::export_projects,
2626
project::import_projects,
2727
project::open_project,
28+
project::open_remote_project,
2829
project::read_project_license,
2930
scanner::detect_cli_history_root_path,
3031
scanner::detect_jetbrains_config_root_path,

0 commit comments

Comments
 (0)