references/architecture-patterns.md
architecture-patterns.md
架构模式
分层模型
数据库 / 文件 / API / 注册表
|
领域加载器
|
可序列化适配器
|
虚拟资源 + 应用定义
|
运行时 reducer 与服务 store
|
工作区与应用界面
依赖向下流动。UI 界面消费共享领域视图和命令,不重新定义领域数据。
核心注册表
应用注册表
每个应用只保留一份定义:
type AppDefinition = {
id: string
name: string
iconId: string
defaultWindow: { width: number; height: number }
defaultPosition?: { x: number; y: number }
dock: 'always' | 'running' | 'never'
supportsMobile: boolean
}
桌面图标、Finder、Dock、菜单、窗口标题和直接路由外壳都应读取同一注册表。
命令注册表
把操作表示为带状态的命令对象:
type SystemCommand = {
id: string
label: string
enabled: boolean
checked?: boolean
run(): void
}
菜单只展示命令,不能自己持有导航、窗口 dispatch 或领域 mutation。
窗口运行时
使用 reducer 或状态机管理:
- 打开;
- 聚焦;
- 关闭;
- 移动/缩放;
- 去重;
- 活跃应用同步;
- Finder 历史;
- 移动端活跃应用。
脱离 DOM 独立测试以下不变量:
- 每个窗口 ID 唯一;
- 打开已有资源时聚焦该窗口;
- 活跃窗口位于应用窗口层的最高处;
- 关闭活跃窗口后选择确定性的后备窗口;
- 窗口几何保持在可用视口内;
- 重复聚焦不会破坏顺序。
如果长时间会话可能让 z-index 无限增长,应做归一化。
层叠上下文
定义语义层级:
桌面背景
桌面图标
应用窗口
活跃窗口内容浮层
Dock
菜单栏
菜单与系统对话框
不要把 iframe/video host 放到所属窗口的 stacking context 外。一个全局 fixed 播放器即使 z-index 数值较小,也可能因为 stacking context 以整体比较而盖住所有嵌套窗口。
对于 portal 渲染的媒体:
- portal 到桌面/窗口层根节点;
- 使用所属窗口的 z-index;
- 监听所属窗口层级变化;
- 保证 Dock 和菜单层位于其上;
- 使用
elementFromPoint验证真实重叠结果,而不是只比较 z-index 数字。
持久服务运行时
以下能力应将窗口可见性与服务生命周期分离:
- 媒体播放;
- 上传;
- 长任务;
- 草稿自动保存;
- 终端会话;
- 后台同步。
关闭应用窗口可以隐藏服务 UI,但不应销毁服务。应通过 Dock、菜单或状态区域展示运行状态。
界面模式
桌面工作区
当视口和任务支持并行上下文时,使用可移动窗口、空间导航、菜单栏和 Dock。
移动工作区
使用应用网格加一个可见应用区域。不要把桌面几何带入布局。遵守 100dvh、安全区、软键盘行为和 44px 触控目标。
应用模式
直接路由以完整可用尺寸渲染对应应用。复用领域视图;完整桌面窗口管理器没有价值时应省略。
后台模式
复用 OS token 和命令,同时保留高密度表格、编辑器、筛选器和分栏。后台工作不是装饰性桌面。
保留后端
默认增加适配器,而不是修改 schema:
- 保留现有数据库模型;
- 保留公开 API 语义;
- 保留认证和 mutation 路径;
- 保留 canonical URL 和 revalidation 行为;
- 在领域适配器边界重塑数据;
- 路由切换应可逆,且不需要数据迁移。