关键设计决策和原因
决策表归纳;细节见各章,不贴源码。
1. 插件架构
| 原因 | 选择 |
|---|---|
| 表格/文档/幻灯片功能差异大 | 核心薄 + 插件组合 |
| 按需加载 | 未注册插件不占用 |
2. 逻辑 / UI 插件分离
| 原因 | 选择 |
|---|---|
| Node、Worker、测试 | 逻辑可无头运行 |
| 包体积 | 服务端不引 UI 包 |
3. 命令模式
| 原因 | 选择 |
|---|---|
| Undo、协同、审计 | 统一 MUTATION |
| 业务组合 | COMMAND 编排 |
4. Snapshot
| 原因 | 选择 |
|---|---|
| 保存、加载、协同基准点 | 全量快照 + 增量 revision |
| 可读可迁 | JSON 友好结构 |
5. Canvas 而非 DOM 表格
| 原因 | 选择 |
|---|---|
| 十万级单元格 | DOM 节点过多 |
| 绘制控制 | 合并格、缩放、打印一致 |
6. 依赖注入 (redi)
| 原因 | 选择 |
|---|---|
| 插件解耦 | 接口 + 实现可替换 |
| 测试 | Mock Service |
7. 公式引擎独立
| 原因 | 选择 |
|---|---|
| CPU 密集 | Worker、可单独升级 |
| 与 UI 解耦 | 服务端批算 |
8. Facade API
| 原因 | 选择 |
|---|---|
| 降低上手成本 | 封装 Command 细节 |
| 稳定对外契约 | 内部可重构 |
9. 拦截器
| 原因 | 选择 |
|---|---|
| 扩展不改核心 | 权限、日志、协同过滤 |
10. 稀疏存储 + 增量渲染
| 原因 | 选择 |
|---|---|
| 内存与帧率 | 空单元格不占对象、脏区重绘 |
总结
Univer 的主轴:插件扩展 + MUTATION 单一写入口 + Snapshot 协同 + Canvas 性能。