文件树模块职责与依赖
返回文档导航 · 技术架构 · 模块提取记录
范围与阅读约定
- 按当前源码梳理,包含文件树视图与差异表单收拢,以及打包按钮处理迁入
tree-controls.mts 后的结构。
- 下文
runtime/、sidebar/ 等路径相对于 src/renderer/。
- 依赖方向
A → B 表示 A 导入并使用 B。
- 图只展示主要业务依赖,省略共享状态、类型和通用辅助模块;这些依赖另列于表中。
- 静态导入、动态加载和注入回调分别说明,命名再导出不视为原文件仍拥有实现。
文件职责
树运行时
| 文件 |
当前职责 |
主要接口或交互 |
runtime/tree-controls.mts |
标题按钮状态、筛选应用与持久化、设置菜单、筛选弹层、打包入口及仓库操作回调 |
updateTreeHeadingControls、applyTreeFileSelection、rememberFileTimeFilters、toggleEmptyDirectories、toggleFileTreeLink;连接 treeFileFilters;按需打开打包界面 |
runtime/tree-view.mts |
树可见性缓存、目录路径收集、节点与整树渲染、树内键盘导航、文件遍历、目录展开折叠、路径定位和当前文档关联 |
currentFileFilterResult、renderTreeNodes、renderFileTree、navigateSelectedTreeFile、locateWorkspacePathInTree、revealActiveDocumentInTree;绑定全部展开与折叠按钮 |
runtime/tree-difference-form.mts |
差异表单字段初始化、草稿、显隐、校验、选项存取转换、状态文案、重置和循环切换 |
prepareFileDifferenceForm、readFileDifferenceForm、restoreFileDifferenceSelection、cycleFileDifferenceMode;绑定差异选择、时间输入和日历事件 |
runtime/tree-selection.mts |
单选与多选、范围选择、选中状态绘制与刷新协调、焦点入口、复制剪切意图、删除操作 |
selectTreeEntry、reconcileTreeSelection、focusFileTree、selectedTreeEntries、trashSelectedEntry |
runtime/tree-drag-drop.mts |
拖放目标校验、复制或移动判断、反馈、批量转移、树剪贴板和粘贴 |
canDropTreeEntries、dropTreeEntries、setTreeClipboard、pasteSelectedEntry |
runtime/tree-history.mts |
文件树操作历史、撤销重做、回收站恢复与路径变更协调 |
recordTreeHistory、stepTreeHistory;复用现有文件操作、脏文档保护和选择恢复 |
UI、算法与相邻业务
| 文件 |
当前职责 |
与树运行时的关系 |
sidebar/file-filter-diff.mts |
一次性创建完整“文件筛选与差异”弹层标记,组装公共筛选控件 |
由 dependencies.mts 创建,返回的对象由 tree-controls 通过 connect() 连接仓库回调 |
sidebar/file-filter-ui.mts |
公共筛选控件、预设操作、修改时间输入、校验与日历行为;提供差异时间字段模板 |
文件树弹层和打包界面共同复用 |
sidebar/file-filter.mts |
文件规则匹配、预设操作、时间选择解析入口和匹配树路径计算 |
runtime 经 dependencies.mts 使用;公共筛选 UI 和打包直接导入 |
sidebar/file-time-filter.mts |
预设、日期、时长和本地时间点解析,文件修改时间判断 |
file-filter.mts 直接导入;runtime 经 dependencies.mts 命名导出使用 |
sidebar/file-tree-navigation.mts |
无 DOM 的文件遍历和前后文件计算 |
tree-view 经 dependencies.mts 命名导出使用 |
sidebar/filter-types.mts |
筛选规则、预设、时间选择和回调类型 |
类型依赖,不承担运行时协调 |
sidebar/file-pack.mts |
打包界面、勾选树、大小统计、内容读取与拼接,以及打包筛选和查询流程 |
由 tree-controls 动态导入;仓库读写、预设保存及通知通过参数回调提供 |
runtime/editor/differences.mts |
编辑器差异视图、差异块选择和文档差异模式呈现,初始化差异运行状态 |
基线模块调用它刷新视图;原表单函数仅保留命名再导出 |
runtime/editor/difference-baseline.mts |
基线读取、请求保护、编辑器高亮刷新、差异定位与 Git HEAD 轮询 |
表单和树控件调用 setFileDifference;完成后刷新树标题及编辑器差异视图 |
runtime/sync/file-tree-diff.mts |
整个文件树的历史差异对话框、比较请求、结果列表和定位 |
树控件发起比较;差异结果通过 tree-view 定位文件 |
runtime/context-menus.mts |
标签及树菜单内容、可用性、快捷键提示、显示和焦点返回 |
查询 tree-view 的可遍历文件;树节点调用其菜单显示接口 |
runtime/publish-export.mts |
文档导出与站点导出 |
打包按钮已迁出,不再导入树控件或树视图 |
状态、装配与外部入口
| 文件 |
当前职责 |
src/renderer.mts |
显式导入各 runtime 模块并按顺序初始化 |
runtime/state.mts / runtime/types.mts |
共享窗口状态、DOM 引用和运行时类型;本次收拢继续共用这些状态 |
runtime/core.mts |
获取主要 DOM 引用、初始化基础状态、仓库 UI 状态合并与持久化、标题按钮提示 |
dependencies.mts |
创建 treeFileFilters,导出共享 UI 对象及筛选、时间和导航算法 |
runtime/workspace.mts |
恢复仓库 UI 状态、筛选时间和差异选项,应用快照并刷新树 |
runtime/keyboard.mts |
注册命令与快捷键;展开折叠、筛选、设置和打包命令经按钮点击进入已有处理,文件遍历与差异循环调用所属模块 |
runtime/surface-events.mts |
全局面板及菜单事件分发,包括调用树文件遍历;树展开折叠按钮和筛选弹层外部关闭事件已迁出 |
runtime/editor/lifecycle.mts |
文档激活时调用 revealActiveDocumentInTree;树控件打包回调使用其会话保存接口 |
runtime/shell.mts |
在 runtime 注册完成后启动异步恢复,读取初始工作区并通过工作区模块激活文档 |
runtime/sync/library.mts |
同步版本等入口通过 locateWorkspacePathInTree 定位树中文件 |
src/index.html / styles/tree.css |
树标题按钮、设置菜单的静态标记,以及树和筛选弹层样式;完整筛选弹层由 UI 模块创建 |
主要文件依赖
视图、控件和差异
以下箭头均为静态运行时导入,双向箭头表示双方直接导入对方。
flowchart LR
C["runtime/tree-controls.mts"] <--> V["runtime/tree-view.mts"]
C <--> F["runtime/tree-difference-form.mts"]
C <--> B["runtime/editor/difference-baseline.mts"]
F --> B
B --> E["runtime/editor/differences.mts"]
V <--> S["runtime/tree-selection.mts"]
V <--> M["runtime/context-menus.mts"]
C --> M
C <--> W["runtime/workspace.mts"]
V <--> W
W --> F
C <--> D["runtime/sync/file-tree-diff.mts"]
D --> V
| 调用方 |
被调用方 |
依赖原因 |
tree-controls |
tree-view |
读取匹配计数与目录状态,应用筛选后刷新树,启用关联后定位当前文档 |
tree-view |
tree-controls |
整树渲染后更新标题按钮及筛选状态 |
tree-controls |
tree-difference-form |
打开弹层时准备表单,提交时读取及校验差异选项,保存或重置选项 |
tree-difference-form |
tree-controls |
调整弹层位置、打开日历、循环选项后持久化文件筛选与差异选择 |
tree-controls / tree-difference-form |
editor/difference-baseline |
提交或循环切换时应用差异基线 |
editor/difference-baseline |
tree-controls / editor/differences |
基线变化后刷新标题状态、差异视图和编辑器高亮 |
tree-view |
tree-selection |
渲染前协调选中项,节点事件更新选择,刷新后恢复焦点 |
tree-selection |
tree-view |
查询可见节点、匹配结果和当前树按钮顺序 |
tree-view / context-menus |
对方 |
树节点打开菜单;菜单根据可遍历文件判断前后文件动作可用性 |
tree-controls / tree-view |
workspace |
筛选应用工作区快照;树定位查询条目 |
workspace |
tree-controls / tree-view / tree-difference-form |
切库时关闭弹层、恢复差异选项并刷新树 |
tree-controls / sync/file-tree-diff |
对方 |
控件打开整树比较;比较界面关闭树弹层并复用日历入口 |
文件转移与操作历史
flowchart LR
V["tree-view.mts"] <--> S["tree-selection.mts"]
S <--> T["tree-drag-drop.mts"]
S <--> H["tree-history.mts"]
T <--> H
T --> V
S --> W["workspace.mts"]
T --> W
H --> W
S --> A["library-actions.mts"]
T --> A
H --> A
tree-selection 使用转移模块记录剪贴板意图,删除后记录历史。
tree-drag-drop 完成转移后恢复选择与焦点、刷新树并记录历史。
tree-history 使用转移模块的父路径辅助函数,复用选择模块的计时、选择和焦点恢复接口。
- 三者都通过现有工作区和文件操作模块协调快照、路径重定位及脏文档保护。
- 图省略各模块对通用对话框、编辑器文件操作和
dependencies.mts 的 ESM 导入。
UI 组装、公共算法与按需打包
flowchart TD
DEP["dependencies.mts"] --> SURFACE["sidebar/file-filter-diff.mts"]
SURFACE --> UI["sidebar/file-filter-ui.mts"]
UI --> FILTER["sidebar/file-filter.mts"]
FILTER --> TIME["sidebar/file-time-filter.mts"]
DEP --> FILTER
DEP --> TIME
DEP --> NAV["sidebar/file-tree-navigation.mts"]
C["runtime/tree-controls.mts"] --> DEP
V["runtime/tree-view.mts"] --> DEP
F["runtime/tree-difference-form.mts"] --> DEP
C -. "动态 import" .-> PACK["sidebar/file-pack.mts"]
PACK --> UI
PACK --> FILTER
dependencies.mts 创建 treeFileFilters,tree-controls 随后通过 connect() 注入仓库状态、预设保存、筛选应用和通知回调。
file-pack.mts 只在打包按钮触发时加载。
tree-controls 传入文件树快照、可见性函数、当前筛选、共享预设及仓库读写回调。
- 打包模块调用这些回调完成操作,不直接导入 runtime 模块。
- 公共算法和公共筛选 UI 未直接导入树运行时,继续支持文件树与打包界面复用。
初始化和主要执行路径
初始化顺序
initializeDependencies() 创建完整筛选 UI;initializeCore() 获取 DOM 引用并准备基础状态。
- 编辑器差异模块初始化差异状态与缓存;基线模块注册 Git HEAD 刷新。
initializeTreeView() 初始化可见性缓存,绑定全部展开和折叠。
initializeTreeDifferenceForm() 初始化差异表单字段、草稿和控件事件。
initializeTreeControls() 连接筛选业务回调,绑定标题控件、筛选弹层、设置和打包入口。
- 随后注册拖放、工作区、操作历史、全局事件和命令服务等模块。
- 最后
initializeShell() 启动异步 initialize(),读取初始工作区,再通过工作区模块恢复仓库状态、激活文档并渲染。
- 上述顺序只列与本主题有关的步骤,其他 runtime 初始化仍穿插其间。
- 事件回调在用户操作或异步事件触发时读取共享状态,注册阶段不主动执行树渲染或基线切换。
应用筛选与差异
- 公共筛选 UI 读取筛选草稿,差异表单读取并校验基线选择。
tree-controls 编译文件规则、刷新工作区快照、应用文件规则和修改时间筛选。
tree-view 根据匹配结果重绘树、协调选择并恢复焦点。
- 基线模块应用差异选择,清理旧高亮并刷新编辑器差异。
tree-controls 保存筛选和差异选项,关闭弹层并按原行为恢复焦点。
定位文件与打包
- 定位由
tree-view 查询目标、展开父目录、选择条目并最小滚动树容器。
- 打包由
tree-controls 动态加载界面,并注入仓库操作。
- 异步读写保留仓库路径校验,避免切库后操作落到另一个仓库。
当前边界与仍保留的耦合
- 本次优化收拢的是职责归属;runtime 仍通过共享状态及相互调用协作,并非单向分层。
- 树视图与标题控件、差异表单与筛选持久化、基线切换与标题刷新、视图与选择均存在直接双向依赖。
- 选择、拖放与历史之间也保留双向依赖,工作区恢复与树模块形成更大的调用环。
- 原
tree-controls.mts、context-menus.mts、dialogs.mts 和编辑器差异模块保留迁移接口的命名再导出。
- 再导出会继续产生 ESM 模块依赖,但实现和内部调用已迁到所属模块。
- 上图没有单独展开这些再导出边。
- 后续若要进一步解除循环,可集中评估标题状态刷新、表单持久化和操作协调边界。
- 应先确认具体维护成本,再决定是否提取职责或调整回调方向。
- 当前记录不增加新抽象,也不改变代码和初始化行为。