第二十二章 架构模式与最佳实践#
"应用会变大,团队会变大,架构的任务是让变化仍然可控。"
前面章节分别讨论语言、框架、存储、网络、安全和发布。本章把它们收束为一组可长期执行的架构模式。
mindmap
root((架构最佳实践))
分层
View
Service
Repository
状态归属
持久状态
UI 状态
运行状态
错误边界
用户错误
系统错误
诊断日志
团队约定
目录结构
命名
类型共享
22.1 分层架构#
flowchart TB
View["View / Components"] --> Store["Store / Composables"]
Store --> Api["Frontend API"]
Api --> Cmd["Tauri Commands"]
Cmd --> Service["Domain Services"]
Service --> Repo["Repositories"]
Repo --> Infra["SQLite / FS / Network"]
依赖方向必须向内:UI 可以依赖 API,Service 不应该依赖 UI。Rust command 是适配层,不是业务逻辑本身。
22.2 状态管理模式#
Hive 把状态分为四类:
状态 |
所在位置 |
示例 |
|---|---|---|
持久业务状态 |
SQLite |
笔记、消息、同步队列 |
本地偏好 |
配置文件 / SQLite |
主题、窗口布局 |
UI 临时状态 |
前端 store |
当前选中笔记、筛选条件 |
系统运行状态 |
Rust managed state |
数据库池、API client、同步器 |
不要把所有状态都塞进前端 store,也不要把 UI 选择态写入数据库。
22.3 错误边界#
错误应该有归属:用户错误给出可修复提示,系统错误进入日志和诊断,开发错误在测试阶段暴露。
#[derive(Debug, serde::Serialize)]
pub struct PublicError {
pub code: String,
pub message: String,
pub retryable: bool,
}
前端只展示 PublicError,不要把 Rust backtrace 或数据库 SQL 原样暴露给用户。
22.4 日志与可观测性#
flowchart LR
Rust["Rust tracing"] --> File["local log file"]
UI["frontend logs"] --> Bridge["IPC log bridge"]
Bridge --> File
File --> Report["diagnostic bundle"]
桌面应用的可观测性要尊重隐私。默认本地记录,用户主动提交诊断包时再上传。日志中不要包含笔记正文、token、密钥和个人敏感信息。
22.5 配置与特性开关#
配置分三层:
构建时配置:应用 ID、后端环境、更新地址。
运行时配置:用户偏好、代理、主题。
远程配置:实验开关、灰度策略。
远程配置不应该绕过本地安全策略。即使远端打开某功能,本地 capability 不允许也不能执行。
22.6 代码组织约定#
Rust 侧建议:
src-tauri/src/
├── commands/
├── domain/
├── infra/
├── plugins/
├── state.rs
└── error.rs
前端侧建议:
src/
├── api/
├── components/
├── composables/
├── stores/
├── views/
└── styles/
跨边界类型要有明确来源。命令名、错误码、事件名应被集中定义,避免散落字符串。
22.7 小结#
最佳实践不是清单收藏,而是让团队每天少做一点重复决策。Hive 的架构约定围绕分层、状态归属、错误边界、可观测性和代码组织展开。
下一章是全书结语:Tauri 2.0、移动端、WASM、AI 与 Rust GUI 生态。