Files
BIPMaterialManager/docs/developer/architecture/runtime-architecture.md
2026-03-21 20:25:45 +08:00

382 lines
8.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 运行时架构
本文档说明项目在运行时的主要分层、进程边界和核心调用路径,帮助开发者理解请求是如何从 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`