Skip to content

fix: 磁盘管理异步化 + 文件监听过滤高频目录,修复超大工作区 UI 冻结#453

Merged
ErlichLiu merged 1 commit into
mainfrom
fix/storage-service-async-traversal-and-watcher-noise-filter
May 14, 2026
Merged

fix: 磁盘管理异步化 + 文件监听过滤高频目录,修复超大工作区 UI 冻结#453
ErlichLiu merged 1 commit into
mainfrom
fix/storage-service-async-traversal-and-watcher-noise-filter

Conversation

@ErlichLiu
Copy link
Copy Markdown
Owner

Closes #431

根因

磁盘管理页面一打开就调用 calculateStorageStats(),内部 getDirSize() 用同步 readdirSync + statSync 递归遍历整个工作区。当工作区包含 .next(~358k 文件)、node_modules(~18k 文件)等目录时,Node.js 主进程事件循环被完全阻塞,Electron 无法响应任何 IPC 或渲染进程消息,UI 冻结数分钟。

改动说明

storage-service.ts

改动 效果
getDirSize() 改为 async,使用 fs.promises.readdir/stat 每次 await 都将控制权交还事件循环,UI 保持响应
新增 SKIP_DIRS:跳过 node_modules/.next/.git/dist 避免扫描用户不关心的构建产物
新增 MAX_FILE_SCAN = 100_000 全局上限 兜底防止失控递归
calculateStorageStats() 改用 Promise.all() 六个分类并行计算,整体更快
所有 calcXxx / cleanupOrphan 函数一并改为 async 与 getDirSize 保持一致

workspace-watcher.ts

改动 效果
新增 HIGH_NOISE_SEGMENTS + isHighNoisePath() 跳过 node_modules/.next 等目录的变更事件
watch 回调最前面 if (isHighNoisePath(...)) return 防止大规模工作区下 IPC 事件风暴

测试建议

  1. 在包含 node_modules.next 的工作区打开设置 → 磁盘管理,应在 < 1s 内可交互
  2. Agent 运行时写文件,预览栏和文件浏览器正常刷新,无卡顿
  3. 磁盘用量统计数值应与之前一致(仅排除了构建产物目录)

🤖 Generated with Claude Code

关闭 #431

**storage-service.ts**
- `getDirSize()` 从同步 readdirSync/statSync 改为 async fsPromises,
  彻底释放主进程事件循环控制权,避免 38 万文件场景下 UI 冻结数分钟
- 新增 SKIP_DIRS 跳过 node_modules/.next/.git 等已知大型目录
- 新增 MAX_FILE_SCAN=100,000 全局扫描上限,防止失控递归
- calculateStorageStats() 改用 Promise.all() 并行计算六个分类,提速明显
- 所有 calcXxx / cleanupOrphan 函数一并改为 async

**workspace-watcher.ts**
- 新增 HIGH_NOISE_SEGMENTS + isHighNoisePath(),跳过 node_modules/.next 等
  目录产生的文件变更事件,防止大规模工作区下 IPC 事件风暴导致渲染进程连续刷新

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@ErlichLiu ErlichLiu merged commit 2f83998 into main May 14, 2026
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.

[Bug] 工作区文件数达 ~38 万时 UI 完全冻结 — 磁盘管理 / 文件变更监听疑似同步阻塞 Electron 主线程

1 participant