6.1 KiB
6.1 KiB
设计决策记录
本文档记录项目中值得被长期记住的关键架构决策。它不追求覆盖所有历史细节,而是保留那些会影响后续开发判断的决定。
1. 记录原则
这里主要记录三类决策:
- 影响整体结构的重构决策
- 影响跨层边界的接口决策
- 影响后续维护方式的工程化决策
flowchart LR
Problem[问题]
Decision[决策]
Impact[影响]
FollowUp[后续维护]
Problem --> Decision --> Impact --> FollowUp
2. 决策一览
timeline
title 近期关键架构决策
2026-03-21 : 主进程 bootstrap 拆分
: IPC handler 薄壳化
: preload 按 domain 重组
: update 模块职责拆分
: React App 入口收敛
: Cleaner 页面拆分
: UpdateDialog 状态收敛
: renderer 重型弹窗按需加载
3. 主进程入口拆分
背景
此前主进程入口承载了过多职责,启动、窗口、运行时检查、IPC 注册和进程守卫都集中在单文件中。
决策
将主进程启动相关逻辑拆分到:
bootstrap/main-window.tsbootstrap/runtime.tsbootstrap/process-guards.ts
结果
graph LR
Before[单一 index.ts]
After[index.ts + bootstrap/*]
Before --> After
影响
index.ts更容易读- 启动链路更容易定位问题
- 后续添加启动逻辑不必继续堆到一个入口文件里
4. IPC handler 薄壳化
背景
部分 handler 曾经承担大量业务编排逻辑,尤其是认证、校验和清理流程。
决策
把核心编排下沉到 application service,handler 保持为薄壳。
当前典型结构:
graph TD
Handler[IPC Handler]
AppService[Application Service]
Domain[Domain Service]
Handler --> AppService --> Domain
影响
- handler 更容易测试
- 业务逻辑更容易复用
- 主进程边界更清晰
5. Validation 模块拆分
背景
validation-handler 曾同时承担 IPC、共享状态、数据库分支、SQL 拼接和数据富化。
决策
将职责拆分到独立模块:
shared-production-ids-store.tsvalidation-database.tsproduction-input-service.tsvalidation-application-service.ts
结果
graph TD
Handler[validation-handler]
Store[shared-production-ids-store]
DB[validation-database]
Input[production-input-service]
AppSvc[validation-application-service]
Handler --> Store
Handler --> AppSvc
AppSvc --> DB
AppSvc --> Input
影响
- 共享订单号状态不再埋在 handler 中
- 数据库与输入识别边界更清晰
- 后续校验链路文档化和测试化更容易
6. Preload 按领域重组
背景
preload 曾接近一个“大接口总表”,内部职责不够清晰。
决策
将 preload 改为按 domain 组织:
api/auth.tsapi/cleaner.tsapi/extractor.tsapi/validation.tsapi/materials.tsapi/process.tsapi/logger.ts
结果
graph LR
Before[单体 preload]
After[domain preload APIs]
Before --> After
影响
- renderer 使用的 bridge 更有语义
- preload 更适合继续维护
- 类型边界更稳定
7. Update 模块拆分
背景
更新服务长期承担目录拉取、状态广播、下载、安装和版本决策等多类职责。
决策
将 update 模块拆成多个协作者:
update-service.tsupdate-catalog-service.tsupdate-installer.tsupdate-storage-client.tsupdate-status-publisher.tsupdate-support.ts
结果
graph TD
UpdateService[UpdateService]
Catalog[UpdateCatalogService]
Installer[UpdateInstaller]
Storage[UpdateStorageClient]
Publisher[UpdateStatusPublisher]
UpdateService --> Catalog
UpdateService --> Installer
UpdateService --> Storage
UpdateService --> Publisher
影响
- 更新职责边界更清晰
- 测试粒度更细
- 维护内部更新逻辑的成本下降
8. React 入口收敛
背景
App.tsx 曾同时承担认证启动、更新状态刷新、导航、未认证态和已认证态 UI。
决策
拆出:
useAppBootstrap.tsAuthenticatedAppShell.tsxUnauthenticatedApp.tsx
影响
- 入口组件回归组装层
- 认证与更新状态更容易追踪
- 后续页面和对话框拆分更容易
9. Cleaner 页面拆分
背景
CleanerPage 曾是典型的大页面,包含筛选区、工具栏、表格、执行区和多个弹窗。
决策
拆分出:
CleanerSidebar.tsxCleanerToolbar.tsxCleanerResultsTable.tsxCleanerExecutionBar.tsx
结果
graph TD
CleanerPage[CleanerPage]
Sidebar[Sidebar]
Toolbar[Toolbar]
Table[ResultsTable]
Bar[ExecutionBar]
CleanerPage --> Sidebar
CleanerPage --> Toolbar
CleanerPage --> Table
CleanerPage --> Bar
影响
- 页面阅读成本下降
- UI 结构更清楚
- 后续继续拆
useCleaner更安全
10. UpdateDialog 状态收敛
背景
更新弹窗里选中版本和 changelog 请求状态容易产生旧请求覆盖新状态的问题。
决策
新增:
useUpdateDialogState.ts
并把 changelog 请求保护和选中版本逻辑集中到 hook 中。
影响
- 异步状态更稳定
- 版本切换逻辑更容易测试
11. Renderer 重型弹窗按需加载
背景
多个重型弹窗并不是首屏关键路径,但此前会参与静态导入。
决策
对这些组件使用 React.lazy + Suspense:
UpdateDialogMaterialTypeManagementDialogExecutionReportDialogReportViewerDialog
结果
graph LR
Static[静态导入]
Lazy[按需加载]
Static --> Lazy
影响
- renderer 初始负担下降
- 常用主流程更轻
12. 后续记录方式
后续新增重大决策时,建议按这个格式补充:
- 背景
- 决策
- 结果图
- 影响
- 相关文件
建议记录的场景包括:
- 新增跨层通信机制
- 重构核心模块边界
- 修改更新、认证、校验、清理主链路
- 引入新的状态管理或测试策略