# 运行时架构 本文档说明项目在运行时的主要分层、进程边界和核心调用路径,帮助开发者理解请求是如何从 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`