docs: add developer architecture handbook

This commit is contained in:
Misaka
2026-03-21 20:25:45 +08:00
parent f40512449a
commit 57ca1d5650
6 changed files with 1545 additions and 1 deletions

View File

@@ -0,0 +1,381 @@
# 运行时架构
本文档说明项目在运行时的主要分层、进程边界和核心调用路径,帮助开发者理解请求是如何从 React 页面一路进入主进程服务的。
## 1. 运行时结构
项目运行时由三部分组成:
- Electron `main` 进程
- Electron `preload`
- Electron `renderer` 渲染进程
它们之间的关系如下:
```mermaid
graph LR
Renderer[Renderer\nReact Pages / Hooks / Components]
Preload[Preload\nDomain APIs + IPC Wrapper]
IPC[IPC Handlers]
Services[Main Services]
External[DB / ERP / Files / Update Source]
Renderer --> Preload
Preload --> IPC
IPC --> Services
Services --> External
```
如果从 Electron 的进程边界来理解,可以进一步看成:
```mermaid
flowchart LR
subgraph RendererProcess[Renderer Process]
UI[Pages / Components]
Hooks[Hooks / Stores]
end
subgraph PreloadLayer[Preload Layer]
Facade[Domain APIs]
IPCClient[ipc wrapper]
end
subgraph MainProcess[Main Process]
Bootstrap[Bootstrap]
Handlers[IPC Handlers]
DomainServices[Domain Services]
end
UI --> Hooks
Hooks --> Facade
Facade --> IPCClient
IPCClient --> Handlers
Handlers --> DomainServices
Bootstrap --> Handlers
```
## 2. Main 进程
主进程是应用的执行中心,负责:
- 应用启动和窗口创建
- 进程守卫和异常处理
- IPC 注册
- 配置、日志、数据库、文件、更新等系统能力
- ERP 自动化与业务流程执行
关键入口文件:
- `src/main/index.ts`
- `src/main/bootstrap/main-window.ts`
- `src/main/bootstrap/runtime.ts`
- `src/main/bootstrap/process-guards.ts`
### 2.1 Bootstrap 层
`bootstrap/` 负责把主进程入口收敛成薄启动文件。
当前主要模块:
- `main-window.ts`
创建 `BrowserWindow`,配置窗口行为与生命周期。
- `runtime.ts`
负责运行时初始化、服务初始化和 IPC 注册。
- `process-guards.ts`
负责全局异常、未处理拒绝和进程级兜底。
bootstrap 层内部关系如下:
```mermaid
graph TD
Index[index.ts]
Guards[process-guards.ts]
Runtime[runtime.ts]
Window[main-window.ts]
AppReady[app.whenReady]
Index --> Guards
Index --> AppReady
AppReady --> Runtime
AppReady --> Window
```
### 2.2 IPC 层
`src/main/ipc/` 中的 handler 负责注册 IPC 通道,并把请求转发到应用服务或领域服务。
当前主要 handler 包括:
- `auth-handler.ts`
- `cleaner-handler.ts`
- `extractor-handler.ts`
- `validation-handler.ts`
- `update-handler.ts`
- `settings-handler.ts`
- `report-handler.ts`
当前设计目标是handler 尽量保持“薄壳”,只做参数接收、错误包装和 service 转发。
这层的目标结构是:
```mermaid
graph LR
Request[IPC Request]
Handler[Handler]
AppService[Application Service]
DomainService[Domain Service / Repository]
Response[IpcResult Response]
Request --> Handler
Handler --> AppService
AppService --> DomainService
DomainService --> AppService
AppService --> Handler
Handler --> Response
```
### 2.3 Services 层
`src/main/services/` 是主进程的核心实现层。
主要领域:
- `auth/`
用户登录、silent login、用户切换。
- `cleaner/`
ERP 清理执行编排。
- `update/`
更新目录拉取、状态广播、下载和安装。
- `validation/`
物料校验、共享订单号、数据库查询封装。
- `config/`
配置加载与保存。
- `logger/`
日志服务。
- `report/`
报告查询与下载。
当前主进程服务从领域上大致可视化为:
```mermaid
graph TD
Services[services/]
Auth[auth]
Validation[validation]
Cleaner[cleaner]
Update[update]
Config[config]
ERP[erp]
Report[report]
Logger[logger]
Services --> Auth
Services --> Validation
Services --> Cleaner
Services --> Update
Services --> Config
Services --> ERP
Services --> Report
Services --> Logger
```
## 3. Preload 层
preload 是 renderer 与 main 之间的桥接层,负责把 IPC 能力封装成按领域组织的 API。
关键入口文件:
- `src/preload/index.ts`
- `src/preload/index.d.ts`
当前 preload 内部结构:
- `src/preload/api/`
按领域拆分的 API facade
- `src/preload/lib/ipc.ts`
统一的 IPC 调用封装
当前已经拆分出的 API 模块包括:
- `auth.ts`
- `cleaner.ts`
- `database.ts`
- `extractor.ts`
- `file.ts`
- `logger.ts`
- `materials.ts`
- `process.ts`
- `resolver.ts`
- `validation.ts`
preload 组织方式如下:
```mermaid
graph TD
Preload[index.ts]
API[api/index.ts]
IPC[lib/ipc.ts]
Auth[api/auth.ts]
Cleaner[api/cleaner.ts]
Extractor[api/extractor.ts]
Validation[api/validation.ts]
UpdateLike[api/process.ts / logger.ts / file.ts]
Preload --> API
API --> Auth
API --> Cleaner
API --> Extractor
API --> Validation
API --> UpdateLike
API --> IPC
```
preload 的职责不是承载业务,而是:
- 隐藏 IPC 细节
- 为 renderer 提供稳定的调用接口
- 维持类型边界
## 4. Renderer 层
renderer 是 React 应用本体,负责页面展示、交互和前端状态管理。
关键入口文件:
- `src/renderer/src/main.tsx`
- `src/renderer/src/App.tsx`
当前主要目录:
- `pages/`
页面级容器,例如 `ExtractorPage``CleanerPage``SettingsPage`
- `components/`
通用 UI、业务组件、对话框
- `hooks/`
页面逻辑、状态收敛、bridge 调用编排
- `stores/`
状态存储与消息提示
- `lib/`
前端侧辅助工具和持久化 helper
renderer 层当前结构可以简化为:
```mermaid
graph TD
App[App.tsx]
Pages[pages/]
Components[components/]
Hooks[hooks/]
Stores[stores/]
Lib[lib/]
App --> Pages
Pages --> Components
Pages --> Hooks
Hooks --> Stores
Hooks --> Lib
```
## 5. 一次典型调用链
以 Cleaner 校验流程为例,一次从页面到主进程的调用链大致如下:
```mermaid
sequenceDiagram
participant UI as CleanerPage / useCleaner
participant Preload as preload.validation
participant IPC as validation-handler
participant AppSvc as validation-application-service
participant DB as database / repository
UI->>Preload: validate(request)
Preload->>IPC: ipcRenderer.invoke(...)
IPC->>AppSvc: service.validate(...)
AppSvc->>DB: query / enrich / aggregate
DB-->>AppSvc: validation results
AppSvc-->>IPC: payload
IPC-->>Preload: IpcResult
Preload-->>UI: normalized response
```
## 6. 页面与模块关系
当前主要页面与主进程模块的对应关系大致如下:
- `ExtractorPage`
对应 `extractor``validation`
- `CleanerPage`
对应 `validation``cleaner``materials``report`
- `SettingsPage`
对应 `settings``config`
- `UpdateDialog`
对应 `update`
```mermaid
graph LR
ExtractorPage --> ExtractorSvc[extractor / validation]
CleanerPage --> CleanerSvc[validation / cleaner / report]
SettingsPage --> SettingsSvc[settings / config]
UpdateDialog --> UpdateSvc[update]
```
## 7. 事件与状态流
项目里常见的状态流主要有三类:
- 页面内局部状态
例如表单输入、当前选中项、弹窗开关。
- preload bridge 调用结果
例如查询结果、校验结果、更新目录。
- 主进程主动推送事件
例如 cleaner 执行进度、update 状态变化。
当前典型事件订阅点包括:
- `window.electron.cleaner.onProgress(...)`
- `window.electron.update.onStatusChanged(...)`
- `window.electron.extractor.onProgress(...)`
- `window.electron.extractor.onLog(...)`
事件流可以概括成:
```mermaid
sequenceDiagram
participant Main as Main Service
participant IPC as IPC / Preload
participant Hook as Renderer Hook
participant UI as React UI
Main->>IPC: push progress/status
IPC->>Hook: onProgress / onStatusChanged
Hook->>UI: update state
UI->>UI: rerender
```
## 8. 当前架构特点
当前项目运行时架构有几个比较明显的特点:
- 主进程侧已经完成一轮职责收敛bootstrap、handler、service 边界更清晰
- preload 已从大文件重组为按领域组织的 facade
- renderer 正在从“大页面 + 大 hook”逐步收敛为更小的页面边界
- 更新模块、validation 模块、Cleaner 页面都已经完成阶段性重构
## 9. 开发建议
在这个运行时架构下,建议按下面原则进行开发:
- 新业务优先落在 main service而不是直接堆到 handler
- renderer 不直接感知 IPC channel统一走 preload facade
- 页面容器尽量只负责组装,复杂流程下沉到 hook
- 共享类型优先放在稳定的 `types/` 目录
- 重要状态流尽量画出调用链或补单测
## 10. 后续阅读
如果你已经理解了运行时分层,下一步建议继续读:
- 后续的 `modules/cleaner.md`
- 后续的 `modules/extractor.md`
- 后续的 `modules/validation.md`
- 后续的 `modules/update.md`