分栏工作区模型
工作台最有代表性的部分是 src/client/split.tsx:它没有把界面写死成某一种布局,而是用数据模型描述行、窗格、标签和聊天区的位置。
LayoutSpec
一个布局由 LayoutSpec 描述,包含:
top、main与可选的mid多行窗格;- 可选的整高左栏
left; - 聊天区宽度、顶行高度、左栏宽度等约束;
chatSide和chatFullHeight,控制聊天在左、右或整列显示;- 布局标题、图标与唯一 id。
窗格本身由 SplitPane 描述。每个窗格可以拥有多个 PaneTab,并记录当前激活标签、最小宽度和标题栏折叠状态。
内容是联合类型
SplitContent 把内容分成四类:
iframe:嵌入允许显示的网页;builtin:浏览器、资源管理器、Git 改动、任务、终端等内置窗格;file:本地文件预览;plugin:由其他 DSH 插件注册的自定义窗口。
这样一来,布局引擎只关心“内容放在哪”,具体怎么渲染则交给不同内容适配器处理。
状态变更
分栏引擎支持拖动调整尺寸、移动标签、交换窗格、向右拆分窗格、向下增加一行、切换聊天侧和折叠标题栏。每次结构变化都会通过 onSpecMutated 回传给工作台,再按布局 id 持久化。
宽度和高度会经过 clamp 限制,并使用 ResizeObserver 与回退的 MutationObserver 跟踪宿主页面变化。这个设计很重要:插件不是独立应用,它必须在 DSH 页面重新渲染或切换会话后重新找到锚点,而不能假设 DOM 永远不变。
值得保留的设计点
- 布局是数据,不是散落的 DOM 操作;
- 窗格与内容解耦,新增内容类型不必重写布局;
- 标签有稳定 id,同内容再次打开时可以去重并聚焦;
- 终端标签会自动重新编号,关闭中间标签后不会留下编号空洞;
- 支持减少动效和不同窗口尺寸下的边界收敛。
阿源的知识库