GitHub推荐:18K Stars 国产 Office SDK 登顶:Univer 凭什么让 AI Agent 当成 Office Harness
一句话总结
Univer 是 Apache-2.0 商用友好的「同构 Office SDK」——同一份运行时同时驱动浏览器 Canvas 渲染与 Node headless 计算,把 Sheets / Docs / Slides / Bases 四件套统一成可嵌入的产品族,并把 AI Agent 作为一等公民接进来。
值得关注的理由
- 跨度罕见:一个 TypeScript monorepo 同时维护 60+ 个子包、150 万行级公式引擎、SpreasheetBench 跑出接近人类水平的 68.86%(Copilot in Excel 仅 57.2%),并且已经接入了 Claude Code / OpenCode / Kimi Work 等 AI Agent 平台。
- 架构创新密度高:自研 DI 容器
@wendellhu/redi、Command/Mutation/Operation 三态分治、Isomorphic 渲染(同一代码 Web + Node 双跑)、RenderUnit 子 injector 隔离、JSONX 自定义 OT subtype——任何一项单拎出来都是一份长文。 - 事实标准的潜力:作为 Luckysheet(16K stars,停滞)的官方继任,已被大量国内 SaaS、低代码、BI 工具嵌入;这是少数把 Office 三件套做成「同源共享渲染层」的开源 SDK,且明确给 AI Agent 留了位。
项目展示
「The next Office experience. Yours to create.」官方 hero 图。
Workspace 把 metrics / charts / 控件绑定到单元格,展示 Sheets 与小应用的联动。
▶ Build a collaborative tool with Univer Office SDK(YouTube) — 官方 90 秒演示,展示了多人协作 + AI 工作流。
Univer 在 README 中嵌入了 30+ 张演示截图;这里精选三张最直观的一张。完整作品集参见 univer-workspace 示例仓 与 dsh-univer-office 内部办公实例。
项目画像
| 维度 | 数据 |
|---|---|
| GitHub | https://github.com/dream-num/univer |
| Star / Fork | 18,093 / 1,548 |
| 代码行数 | 1,017,431(TypeScript 87.9% / TSX 9.2% / YAML 1.6% / JSON 1.1%) |
| 项目年龄 | 47.9 个月(首次提交 2022-09-29) |
| 开发阶段 | 密集开发(v1.0.2 / 149 tag / 100 release) |
| 贡献模式 | 公司驱动 + 社区协作(92 贡献者,主作者「白熱」占 21.3%,前 5 名合计过半) |
| 热度定位 | 大众热门(同赛道唯一兼具 Apache-2.0 + Isomorphic + AI 原生的项目) |
| 质量评级 | 代码优秀 / 文档优秀 / 测试充分 |
作者视角:为什么存在这个项目
创始人/作者背景
账号是 DreamNum Inc.(组织账号,不是个人),主架构师「白熱 / jikkai」是 @wendellhu/redi DI 容器与 OT-JSON 适配层 JSONX 的作者。前身 Luckysheet(16K stars)停止迭代后,团队把全部精力投入 Univer——这是少见的「不被分叉分走」的案例,说明品牌和仓库迁移策略成功。DreamNum 自己在用 Univer 做内部 SaaS(dsh-univer-office 400 ⭐),是真实的 dogfooding。
问题判断
作者识别了三个深层矛盾:
- AI Agent 缺 Office 表面——LLM 输出公式需要「能运行、能验证、能回滚」的运行时,纯导出 xlsx 不够。
- 企业 SaaS 缺开源 Office SDK——SpreadJS 闭源付费,onlyOffice 是自托管套件,AG Grid 只是数据网格。
- 数据模型必须与视图解耦——Univer 的
IWorkbookData/IDocumentData既驱动 Canvas 渲染也驱动 Node headless 计算,这是同构架构的物理前提。
解法哲学
明确选择「不做的事」与「做的事」同样重要:
- 不做:完整 Excel 兼容(接受部分函数子集)、客户端独立编译(强制 plugin 模式)、GraphQL/REST 风格 API(只给 Facade)。
- 做:插件分层(logic / ui 强制拆分包)、Command/Mutation/Operation 三态分治、Isomorphic(同一运行时双端)、Canvas 自研渲染。
战略意图
- 核心产品:Apache-2.0 OSS 抢占「嵌入式办公 SDK」赛道。
- 商业化路径:「open-core」清晰——OSS 提供 Sheets/Docs/Slides 数据模型 + UI;Pro 闭源售卖实时协作服务端、文件交换、打印、透视表等。
- AI 卡位:
univer-mcp/univer-sdk-skills/ 已接入 Claude Code / OpenCode / OpenClaw / Hermes / Codex / WorkBuddy / Kimi Work——这是把 Office 表面变成「AI 的脚手架」。
核心价值提炼
创新之处(按新颖度 × 实用性排序)
-
Command / Mutation / Operation 三态分治 + IExecutionOptions 多语义标记
CommandType把「用户动作 / UI 变更 / 持久化变更」显式分类;叠加onlyLocal/fromCollab/syncOnly/fromChangeset四个 execution 标记。- 避免了「redo 时又把 undo 同步给对端」一类死循环问题,也根治了
#3483这种 OT 回滚路径 bug。
-
Isomorphic via IMessageProtocol + 两种 transport
IMessageProtocol接口(send+onMessage$)抽象 Web Worker 与child_process.fork;上层 Channel 完全 transport-agnostic。- 同一份
UniverSheetsPlugin+UniverFormulaEnginePlugin既能在浏览器跑,也能在 Node fork 的子进程跑——是「一百万公式秒级」的物理基础。
-
JSONX = ot-json1 + 自定义 Subtype
packages/core/src/docs/data-model/json-x/json-x.ts注册自定义 subtypeTextX(620 行),把富文本 retain/insert/delete 映射为标准 JSON0 Op。- 没引 Yjs / ShareDB,避免「为 OT 重写文档 schema」的陷阱——值得任何自定义富文本编辑器借鉴。
-
RenderUnit 子 injector + activate/deactivate 隔离
- 每个 unit = 一个 Engine + Scene + 子 injector;
_activated$ = BehaviorSubject<boolean>控制 unit 是否参与渲染。 - 解决「多 widget 同屏 + 单 widget 隐藏时不能丢状态」矛盾——Figma 同源场景的解法。
- 每个 unit = 一个 Engine + Scene + 子 injector;
-
公式引擎 AST + ValueObject + Dependency Tree 三层抽象
engine-formula/src/engine/分ast-node//value-object//dependency/;ArrayValueObject支持隐式数组,dependency-tree.ts标记FDtreeStateType实现增量重算。- 是少数能在 web 端实现完整 Excel 公式语义(含隐式交集)的引擎。
可复用的模式与技巧
composeInterceptors<M, C>+ priority 排序:洋葱圈式中间件,core/src/common/interceptor.ts 实现;任何需要「按优先级链式改写单元格值 / 样式」的场景都该用——尤其 AOP 风格的「权限校验 → 数据脱敏 → 公式替换」管道。- Plugin Lifecycle Stage(Starting / Ready / Rendered / Steady):类似 VS Code Extension
activationEvents但更轻,任何 monorepo SDK + 多插件 + 异步初始化都该借鉴。 @DependentOn装饰器 + DFS 拓扑排序 + 自动注册默认依赖:开发者写@DependentOn(EnginePlugin, UIPlugin)即可,框架在缺失依赖时自动用默认配置注册。- Locale Namespace 严格归属包(
docs/NAMING_CONVENTION.md强制):每个包只能引用自己 namespace 下的 i18n key,避免「common button.cancel」式共享桶。 FUniver.extend()+ TS Module Augmentation:纯手写、无 reflect-metadata 的 facade 扩展机制;任何「基础类 + 多源扩展 + 类型合并」需求都该用。
关键设计决策
| 决策 | 问题 | 方案 | Trade-off | 可迁移性 |
|---|---|---|---|---|
| 插件分层 + 严格依赖方向 | 60+ 包共存避免循环依赖 | 每个包按 <business>-<feature> 命名,logic/ui 物理拆分 | 包数量爆炸(74 个 npm package) | 极高 |
| Command/Mutation/Operation 三态 | Undo/Redo、协作、UI 记录同时支持 | 三态枚举 + IExecutionOptions 多语义标记 | 心智成本更高 | 高 |
DI 容器 @wendellhu/redi 自研 | 跨端零反射 + 多端可用 | createIdentifier<T>() + @Inject 装饰器,无 reflect-metadata | 必须写显式 constructor | 中 |
| Isomorphic = 同一运行时 + 两种 transport | 前后端共用业务逻辑 | IMessageProtocol 抽象 + Web Worker / child_process 双实现 | 必须 fork 子进程 | 高 |
| RenderUnit 子 injector | 多 widget 隔离 | 每个 unit 创建 child injector + activate/deactivate | 必须严格 Dispose | 高 |
| Canvas-Based Rendering 跨产品共享 | Sheet/Doc/Slide 共享渲染 | 共享 Scene + RenderComponent<T,U,V> 基类 + Extension 注册机制 | Scene 必须做得足够通用 | 中 |
| Facade API + Module Augmentation | 60+ 包扩展一个 FUniver 根类 | FUniver.extend() 静态方法 + TS declaration merging | 比 HOC 啰嗦但完全可类型化 | 高 |
| 单元类型隔离 + 拓扑排序 | Sheets/Docs/Slides 同页隔离 | UniverInstanceType 分桶 + DFS + @DependentOn | 必须为每个插件标注 type | 中 |
竞品格局与定位
竞品对比矩阵
| 维度 | Univer | SpreadJS(商业) | Luckysheet(前作) | Handsontable |
|---|---|---|---|---|
| Stars | 18K | 闭源付费 | 16K(停滞) | 21K |
| License | Apache-2.0 | 商业付费 | MIT | 商业(社区版) |
| 单元类型 | Sheets/Docs/Slides/Bases/PDF | Sheets 为主 | Sheets | Sheets |
| Isomorphic | Web + Node 同一运行时 | 仅浏览器 | 仅浏览器 | 仅浏览器 |
| AI 原生 | MCP / SDK skills | 无 | 无 | 无 |
| 公式引擎 | 自研 AST + 隐式数组 | 闭源 Excel 内核 | 简版 | 简版 |
| 渲染 | Canvas(多 unit 共享 Scene) | Canvas | DOM | DOM |
| 协作 | OSS 无,Pro 闭源 | 商业版自带 | 无 | 商业版 |
差异化护城河
- 技术护城河:Isomorphic 架构 + 自研 DI + JSONX 自定义 OT subtype + 公式引擎隐式数组——这套组合在 OSS 领域没有等价物。
- 生态护城河:60+ npm package 的模块化生态、企业级集成案例(dsh-univer-office 等)、AI Agent 多平台接入。
- 信任护城河:Apache-2.0 + 47 个月稳定迭代 + 团队从 Luckysheet 平滑迁移过来的连续性。
竞争风险
- SpreadJS V19+ 的反击:Excel 兼容性仍是 SpreadJS 领先(约 90%+ 测试用例通过),且闭源商业可以快速集成 AI 能力。
- Microsoft Loop / Notion 路线:如果用户只是想「云端协作 + AI」,Notion / 飞书文档可能比 Univer 套壳更顺手——但这是「文档优先」而非「数据模型优先」路线。
- onlyOffice 桌面化扩张:如果 onlyOffice 把 SDK 拆出来商用,会正面碰撞 Univer 的「嵌入式」卖点。
生态定位
在「办公生产力生态」中扮演**「Office 三件套的可编程运行时底座」**角色——既不是 SaaS(不像 Notion / Loop),也不是纯组件库(不像 Handsontable / AG Grid),而是把二者优点整合的「AI Agent 时代的 Office Harness」。填补了「开源 + 可嵌入 + 同构 + AI 原生」四象限的空白。
套利机会分析
- 信息差:Univer 在中文圈已是大热门(30K+ 合并 stars),但在英文开发者圈仍被低估。SpreadsheetBench 上 Univer 跑赢 Copilot in Excel 的事实,国际开发者社区尚未充分传播。
- 技术借鉴:JSONX(OT subtype)+ Isomorphic transport + RenderUnit 三件套,几乎可以原样搬到任何「多端协同 + 自定义数据模型」项目——比如在线 IDE、白板工具、3D 编辑器。
- 生态位:填补了「开源 + 可嵌入 + 同构 + AI 原生」四象限的空白——这是事实上的新生态位,竞争者寥寥。
- 趋势判断:v1.0 之后 2026-07/08 双月提交数创历史新高(185/188),说明商业化需求牵引持续强;AI Agent 平台的快速接入是顺势而为——趋势在 Univer 这一侧。
风险与不足
- 学习曲线陡:plugin 模式 50+ 行 import 起;Facade + Command + DI 体系需要时间消化。
- 生态以中英为主:其他语言依赖社区,质量参差。
- 关键能力 Pro 闭源:实时协作服务端、文件交换、打印、透视表、迷你图、增强公式、编辑历史——B 端要这些得买授权。
- 历史包袱:从 Luckysheet → Univer 是重大重写,老 API 无法平滑迁移。
- Benchmark 公开缺位:README 宣称「1000 万单元格 / 一百万公式秒级 / 200 人协同」,但仓库内未找到对应 benchmark 代码——第三方复现可信度待验证。
- 打磨期 bug 密度:fix:feature 比例 66% : 14.5%,打磨期健康但仍意味着生产环境需谨慎做版本锁定。
行动建议
- 如果你要用它:
- 选 Preset 模式快速验证(30 分钟跑通 Sheet Demo);
- 走 Facade API 而非直接 DI(避免后期重构成本);
- 锁定版本号 + 关注
BREAKING CHANGE:标记; - 关键场景(实时协作 / 大数据 / PPT 美工)评估 Pro 付费意愿。
- 如果你要学它:
- 重点看
packages/core/src/univer.ts+command.service.ts+plugin.service.ts; - 读
docs/ISOMORPHIC.md+NAMING_CONVENTION.md+FIX_MEMORY_LEAK.md三份纪律文档; - 跟
engine-formula/src/engine/dependency/dependency-tree.ts学公式增量重算; - 跟
engine-render/src/render-manager/render-unit.ts学多 unit 隔离。
- 重点看
- 如果你要 fork 它:
- 不要试图「再做一遍 Office 三件套」——护城河在公式引擎 + 渲染层 + 协作层;
- 可以做的是「垂直场景 SDK」——比如教育行业的批改 SDK、医疗行业的病历 SDK、AI 行业的报表生成 SDK;
- 改造
IMessageProtocol接入自己的 AI Agent 平台。
知识入口
| 资源 | 链接 |
|---|---|
| DeepWiki | https://deepwiki.com/dream-num/univer |
| Zread.ai | https://zread.ai/dream-num/univer |
| 官方文档 | https://docs.univer.ai |
| 官方博客 | https://univer.ai/blog |
| 架构对比(vs SpreadJS) | https://blog.univer.ai/posts/univer-vs-spreadjs-comprehensive-analysis-of-the-next-generation-open-source-collaborative-engine-and-traditional-commercial-spreadsheet-controls |
| 在线 Demo | https://univer.ai(官网内嵌 Playground) |
| 关联论文 | 无(OT/CRDT 学术文献丰富,但 Univer 本身的论文尚未发表) |