PlantUML vs Mermaid vs Graphviz DOT vs D2:图 DSL 选型完整对比
现在「画 UML/架构图」的可选工具比 5 年前多了:PlantUML / Mermaid / Graphviz DOT / D2……如何选?这一篇用真实场景逐一对比。
一句话总结
| 工具 | 主战场 | 一句话定位 |
|---|---|---|
| PlantUML | 工程/UML/软件架构 | JVM-based DSL,UML 表达力最强 |
| Mermaid | 文档/图/博客 | 浏览器原生,零门槛 |
| Graphviz | 学术/数据可视化 | 老牌,老 graph 算法之父 |
| D2 | 现代架构图(2024+) | Terrastruct 出品,新一代 DSL |
PlantUML
优势
- UML 全家族:时序、状态、类、活动、用例、组件、部署、对象……几乎所有 UML 图都有专属语法
- 函数式样式:
!define / !function / !include / !pragma,可编程 - 主题生态:
!theme+ 现成 20+ 主题(cyborg / sketchy / crt-green 等) - 多端:Java CLI / docker server / WASM / 在线服务
痛点
- 依赖 JVM:命令行渲染吃 Java,server docker image 200MB+
- 图一多就慢:100 节点 + Graphviz dot 算法卡顿(→ 用 ELK)
- 样式限制:内置皮肤有限,自定义 CSS 做不到
- 学习曲线:
!pragma/!define/<<stereotype>>这些概念初学者摸不着头脑
Mermaid
优势
- 浏览器原生:纯 JS,GitHub / GitLab / Notion / Obsidian 全 inline 支持
- 零安装:写一段
mermaidmarkdown 代码块就能渲染 - 简单 CRUD 图:流程图、时序、类、甘特、饼图、状态机、ER 全都有
- 学习成本最低:5 分钟能画第一张图
痛点
- 样式细节弱:
skin/theme是单独的 CSS-like key/value,没办法精确控制节点颜色、字体、间距 - 大型图同样慢:浏览器 Canvas 渲染,>50 节点就拖
- 没有正经的 UML:类图只支持「字段 + 方法」,UML 时序图相对简单,状态机只能算够用
- 没有 server:要么浏览器、要么官方 CLI(但功能 < 浏览器)
- 不能生成 PDF 高保真(HTML → 浏览器打印,效果一般)
Graphviz DOT
优势
- 学术祖爷:诞生 1991,是 graph layout 算法的发源地(dot / neato / fdp / sfdp / circo)
- 算法最全:5 种布局算法,适合不同形态图
- 纯文本:没有任何依赖,是 LLM 最容易正确生成的可视化语言之一
- 命令行链:所有 unix 工具可以串起来(
csv2gprof | dot -Tsvg)
痛点
- 不是 UML:只能画 graph(node + edge),想画时序图 / 状态机得自己造轮子
- 语法古老:
digraph G { a -> b }这种语法写复杂图时排查难 - 样式繁琐:颜色、形状、边线箭头都得逐个
attr写 - 中文支持:CJK 字体要指定 fontname=… ;总体很慢需要自己配
D2
优势
- 现代 DSL:受 Go / TypeScript 影响,语法一致性强、IDE 自动补全友好
- 布局算法可选:ELK / dagre / d2 自己实现三套
- 样式是核心:
style.fill: .../shape: ...,能做得像 Figma 一样精细 - Terraform / Postgres 集成:从
d2 -h能直接读外部真实数据(如arch.png自动从 terraform state 渲染) - 支持 Elk / dagre 远程布局加速(已支持 wasm 浏览器内)
痛点
- 生态年轻:2024 年才有 v0.6+,企业级使用案例少
- UML 支持薄弱:几乎只支持
class-diagram,缺时序/状态/部署图 - 文档社区不成熟:遇到 bug 只能去 GitHub issues
- JavaScript 渲染慢:浏览器端 D2 加载 1MB+,mobile 不友好
- 中文文档少:中文资料仅限于「初识 D2」级别
决策矩阵:什么时候选哪个
| 你的场景 | 推 荐 |
|---|---|
| GitHub README 里画图 | Mermaid |
| 企业文档站 / 内部 wiki | PlantUML(运 营成本最低) |
| 大型微服务架构图(200+ 节点) | D2 或 PlantUML + ELK |
| 时序图 / 状态机 / 活动图等 UML 全图 | PlantUML |
学术论文 / 数据流图(digragh) |
Graphviz DOT |
| 实时数据流监控(自动 refresh) | Mermaid / D2 |
| 不依赖任何部署(offline) | PlantUUM(带 JAR) 或 Graphviz (native) |
| 配合 LangChain / LLM 画流程图 | Mermaid / D2 |
| 嵌入 Hexo / VuePress / Docusaurus | PlantUML 或 Mermaid(同时) |
| 需要反向工程(Java class → 图) | PlantUML(内置 IDEA 集成) |
互转
PlantUML ↔ Mermaid
没有官方工具,社区方案:
plantuml2mermaid/mermaid2plantuml—— npm 包,但只覆盖简单图- 手动转:Mermaid 时序图代码比较短,直接改即可
1 | sequenceDiagram |
1 | @startuml |
PlantUML ↔ Graphviz DOT
开源工具 plantuml2dot (Yegor Bugayenko)。
PlantUML ↔ D2
D2 官方提供 d2 --plantuml=... flag,但仅单方向。植物uml → D2 转换没有完全方案。
Graphviz DOT ↔ Mermaid
viz.js / graphviz-cli 链路,只能处理非常简单的图。
实测:一个 30 节点 microservice 图
| 工具 | 首次 cold render | Warm render | 输出 SVG size |
|---|---|---|---|
| PlantUML + dot | 1.2s | 200ms | 28KB |
| PlantUML + ELK | 2.5s | 500ms | 32KB |
| Mermaid | 600ms | 100ms | 18KB |
| Graphviz | 400ms | 50ms | 22KB |
| D2 + ELK | 800ms | 300ms | 16KB |
结论:
- Mermaid 在冷启最慢浏览器加载(100KB+ JS)
- Graphviz 命令行最快(C 系原生)但图丑
- PlantUML + ELK 视觉最清晰(分层感强)
- D2 起步稍慢但图最现代
我的选型经验
「我」会选:
- 写代码同仓库的图 → PlantUML(API 稳定,UML 全,会 Java 都没问题)
- GitHub README → Mermaid(零配置)
- 架构白板讨论 → Graphviz dot(在纸上画完直接写成 dot,然后看图)
- 现代产品文档 → D2(生态年轻,但样式强)
- 企业内部 wiki(飞书 / Confluence) → Mermaid → PlantUML 升级路线
小结
不存在「最好的图 DSL」,只有「适合场景的 DSL」。
- PlantUML:工程图 / UML / 与 JVM 集成 → 主力
- Mermaid:博客 / 文档 / 轻量图 → 主力
- Graphviz:学术 / 自动化 / graph 算法 → 辅助
- D2:现代样式 / Terraform 集成 → 备用
下一步
- PlantUML vs Mermaid vs Draw.io:选谁画什么图
- Mermaid 与 PlantUML 互转实战(实际 slug:plantuml-render-from-hexo)
- 标题: PlantUML vs Mermaid vs Graphviz DOT vs D2:图 DSL 选型完整对比
- 作者: puml.online
- 创建于 : 2026-07-30 10:20:00
- 更新于 : 2026-08-14 21:34:29
- 链接: https://puml.online/blog/plantuml-vs-mermaid-graphviz-d2/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。