# FileTree 大目录卡顿 — 可实施方案 > 日期: 2026-10-10 | 状态: 设计稿(待拍板) | 勘察: 只读实测锚点(Wave Q) > 定位: 「单个目录上千条合法条目」的卡顿风险可实施方案。本文只写方案,不改码。 > 触发: Wave Q 实测 — 后端 `get_module_file_tree` 不封顶、前端 FileTree 全量 `v-for`,当前靠三重缓解兜底。 > 结论预告: 推荐 **方案 B(后端 offset/limit 分页 + 前端「加载更多」)**,先做期 1 最小可用;虚拟滚动本期否决(见 §二·A 的实证疤痕)。 --- ## 一、现状与证据(带行号) ### 1.1 后端:列目录不封顶 `src-tauri/src/commands/module.rs` 命令 `get_module_file_tree`(707-834): - 774-777 `std::fs::read_dir(&target_dir)` 遍历目标目录**全部**条目; - 781-791 过滤噪音目录(`is_noise_entry`,FileTree 档)+ 隐藏文件(`.` 开头); - 810-818 每条 push 进 `items`; - 820-824 排序(目录优先 + 字母序,稳定可预期); - 830-833 一次性返回 `{ path, entries }`。 **无任何条数上限**。对照同语义的另一档位:AI 侧 `list_dir_recursive`(`src-tauri/src/commands/ai/tool_registry.rs:923-965`)有 `max_entries` 封顶(调用处 `tools/file.rs:347` 传 `1000`,达上限返 `truncated`)。即"列目录"这一语义,**AI 上下文档有封顶、文件浏览器档没有** —— 这是 Wave Q 要补的缺口。 ### 1.2 前端:单层全量 v-for `src/components/project/FileTree.vue`: - 25-33 `
  • ` —— 当前层全部条目**一次性渲染**; - 95-106 `FileTree` 自引用递归:展开的子目录再加一层同构 `