插件架构详解
Univer 几乎所有能力都是 Plugin:在生命周期里向 Injector 注册服务,并挂接命令、渲染扩展等。
1. 插件生命周期
| 阶段 | 典型工作 |
|---|---|
| onStarting | 注册 DI、命令 handler |
| onReady | 依赖已就绪,初始化数据监听 |
| onRendered | DOM / Canvas 已就绪,挂 UI |
| onSteady | 稳定态收尾 |
顺序保证:服务先于 UI,避免未注册就渲染。
2. 逻辑插件 vs UI 插件
| 逻辑插件 | UI 插件 |
|---|---|
| 命令、数据、公式 | 菜单、面板、快捷键 |
| 可跑在 Node / Worker | 依赖浏览器 DOM |
例:@univerjs/sheets-filter | 例:sheets-filter-ui |
同功能拆包便于无头计算、SSR、测试。
3. 注册方式(概念)
Univer.registerPlugin(PluginClass, config)- 插件内
dependencies.forEach(d => injector.add(d)) - Controller 常作为可注入类,在构造时订阅 Command / 生命周期
不贴具体类名实现;读源码从 packages/core/src/services/plugin/ 与任一 packages/sheets-* 插件入手。
4. 插件间协作
- 通过 共享 Command ID 与 Service 接口 协作,避免互相 import 实现类。
- 用 拦截器 / Hook 扩展他人命令前后逻辑(见 05、09)。
5. 实践建议
- 新功能先定 MUTATION 列表,再写 COMMAND 与插件。
- UI 插件只调 Facade 或 Command,勿直接改 Worksheet 内部结构。
- 配置通过插件
config传入,避免全局单例。
6. 总结
插件 = Univer 的模块系统;排错先看插件是否走到 onReady、服务是否注册进当前 Injector。