PlantUML vs Mermaid vs Graphviz DOT vs D2:图 DSL 选型完整对比

puml.online

现在「画 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 支持
  • 零安装:写一段 mermaid markdown 代码块就能渲染
  • 简单 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
2
3
sequenceDiagram
Alice->>Bob: Hello
Bob-->>Alice: Hi back
1
2
3
4
@startuml
Alice -> Bob: Hello
Bob --> Alice: Hi back
@enduml

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 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 进行许可。