本节摘要:OpenWork 的前端是一个规模可观的 React 单页应用。它怎么组织才不乱?靠一套清晰的三层分层:内核层(kernel,平台与服务 provider)、外壳层(shell,应用骨架与协调)、领域层(domains,业务模块)。本节讲清这三层的职责边界与依赖规则——这是前端可维护的根基。
先看挑战。OpenWork 前端要支持:
这么多东西放一起,如果没有清晰组织,很快会变成「大泥球」——改一处牵全身,没人敢动。三层分层就是解法。
OpenWork 前端分三层(外加一个框架无关层):
src/app/ 框架无关层(禁止 import react) └─ lib/ IPC/服务端/Den 客户端(纯逻辑,无 UI) src/react-app/ kernel/ 内核层:Provider 栈 + 平台 + 通知 + 系统状态 shell/ 外壳层:Bootstrap/路由/命令面板/菜单(顶层) domains/ 领域层:session/workspace/settings/connections/cloud/onboarding infra/ 基础设施:query-client 等 design-system/ 设计系统:展示型原语
最底层是框架无关层(app/)——它禁止 import react。这里放的是纯逻辑:
为什么禁止 react?因为这些是「逻辑」,不该和「UI 框架」耦合。逻辑不依赖 react,就能在任何地方(测试、Node、其他框架)复用。这是「逻辑与 UI 分离」的严格落地。
💡 禁止 import react 的强制性:这不是「建议」,是 madge(依赖分析工具)强制检查的——app/ 里 import react 会报错。这种强制保证了「逻辑层纯净」。
内核层是前端的「基础设施栈」,放各种 Provider(为上层提供能力的组件):
这些 Provider 组成一个「栈」,上层(外壳、领域)通过它们获得能力。内核层在最底,不依赖领域。
外壳层是前端的「顶层骨架」:
外壳层在顶层,可以 import 一切(它是协调者,不是被依赖的)。它把内核的 Provider 组装起来,挂载路由,渲染领域模块。
领域层是具体的业务模块,每个是一个内聚的功能区:
| 领域 | 内容 |
|---|---|
| session | 会话(聊天、artifacts、terminal、voice、panel) |
| workspace | 工作区管理 |
| settings | 设置 |
| connections | 连接 |
| onboarding | 引导 |
| cloud | 云 |
领域模块通过内核的 Provider 访问能力(调服务端、用平台),不直接 import 框架无关层的实现(走 Provider 抽象)。
三层的依赖规则严格:
app(框架无关) ◄─ 被 kernel 引用 │ kernel ◄─ 被 domains 引用(但不准 import domain) │ shell(顶层) ──► 可 import 一切 domains ──► 可 import kernel/infra/design-system infra ◄─ 被 kernel/domains 引用
关键规则:
这套规则用 madge 验证零环(没有循环依赖)。零循环让依赖图清爽,改一处不会牵出无限连锁。
这套分层的好处:
分层讲清了,下一节讲最关键的 Provider——Platform 抽象。