Mermaid 14 种图表怎么选 + 90% 渲染报错的真实原因,从首行类型名到中文标点全排查

· 约 6 分钟 🧜 Mermaid 图表

写技术文档时,用 Mermaid 比手画拖框线快十倍——一段代码生成流程图、时序图、ER 图,改一行图就重渲染。但新手十次有九次卡在右下角的”渲染失败”红字上。

这篇按”14 种图表怎么选 → 90% 报错的真实原因 → 一份排查清单”三段讲清楚,看完就能从”复制示例改两笔出图”升级到”按需求自己写出能渲染的代码”。

14 种图表怎么选

本工具支持 Mermaid v11 全部 14 种主流图表,按使用场景分成 5 组:

图表类型用来画触发关键词
flowchart流程、决策、分支”如果…就…”, “失败回到…”, “流程图”
sequenceDiagram时间顺序的对话、调用”调用”, “握手”, “用户操作”, “API 流程”
classDiagram面向对象 / 模块结构”继承”, “实现”, “依赖”, “组合”
erDiagram数据库表关系”1:N”, “外键”, “关联表”
stateDiagram-v2状态流转”订单状态”, “工单流转”, “协议状态”
mindmap发散思考”脑图”, “知识结构”
gantt排期”项目计划”, “里程碑”, “甘特图”
pie占比”百分比”, “比例饼图”
xychart-beta柱图 / 折线”月度销售”, “趋势图”
sankey-beta流向”用户漏斗”, “能量流”
quadrantChart四象限优先级”紧急重要”, “BCG 矩阵”
journey用户旅程”用户体验”, “情感曲线”
timeline编年史”历史里程碑”, “版本演进”
gitGraphgit 分支”分支策略”, “合并历史”

90% 的需求落在前 5 个。不确定时按”这个图想表达什么”问自己:

  • “做完 A 才能做 B”——用 flowchart
  • “A 喊 B、B 回 A”——用 sequenceDiagram
  • “A 有 N 个 B”——用 erDiagram
  • “A 状态变成 B”——用 stateDiagram-v2
  • “几个点的层级关系”——用 mindmap 或 classDiagram

90% 渲染报错的真实原因

按出现频率排,6 类问题占了几乎全部报错:

1. 首行类型声明拼错或大小写错

sequencediagram        ❌  必须 sequenceDiagram
sequence              ❌  必须 sequenceDiagram
classdiagram          ❌  必须 classDiagram
stateDiagram          ❌  必须 stateDiagram-v2
graph TD              ⚠️   仍能用但已废弃,新写法 flowchart TD

Mermaid 用首行决定走哪个 parser,拼错直接整图不出。复制模板时连首行一起带——别只 copy 中间部分。

2. 中文标点混入

最隐蔽的坑——肉眼几乎分不清:

A["登录"]:点击      ❌  中文冒号 :
A --> B:登录        ❌
participant U as 用户,浏览器   ❌  中文逗号 ,

正确写法:
A["登录"]: 点击      ✓
A --> B: 登录        ✓
participant U as 用户, 浏览器   ✓

来源几乎都是从微信、钉钉、飞书文档复制黏贴。养成习惯:粘贴后全文搜 一遍

3. 箭头语法 / 图表类型不匹配

flowchart 用 -->(两减号一尖括号),sequenceDiagram 用 ->> / -->>

flowchart:
  A --> B          实线箭头(也可加文字 A -->|登录成功| B)
  A -.-> B         虚线箭头
  A ==> B          粗箭头
  A --- B          无箭头连线

sequenceDiagram:
  A->>B: 同步调用     实线 + 实心箭头
  B-->>A: 返回响应    虚线 + 实心箭头
  A-)B: 异步消息      不等返回
  A-xB: 连接断开      异常 / 拒绝

混用规则会渲染失败或样式诡异。记忆口诀:流程图用 -->,时序图用 ->>

4. 标签里的特殊字符未转义

节点标签里有 () [] {} | " # 时,必须用双引号包:

A[函数 foo(x)]              ❌  括号会被当成圆角节点
A["函数 foo(x)"]            ✓

B[第 1 步 [废弃]]           ❌  方括号嵌套
B["第 1 步 [废弃]"]         ✓

C{是否登录?}                ✓   英文问号 OK
C{是否登录?}               ❌  中文问号

时序图的注释 Note right of 也常踩这个坑——文字含中文标点时报错,加引号无效,只能改文案

Note right of A: 校验,超时
   ❌ 中文逗号

Note right of A: 校验, 超时

5. 版本语法差异

Mermaid 多个版本语法有微调,老教程的写法在新版本可能失效:

旧写法新写法
graph TDflowchart TD(仍兼容但推荐用新名)
stateDiagramstateDiagram-v2(强烈推荐 v2,渲染更准)
sequenceDiagram\n A->B: x(单尖箭头)A->>B: x(双尖更稳)
pie showDatapie title 标题(v10+ showData 单独配置)

本工具用的是 v11,默认按新语法走

6. 保留字冲突 / 节点 ID 含连字符

flowchart TD
  end --> next            ❌  end 是保留字
  task-1 --> task-2       ❌  连字符在 ID 里被解析为减号

正确:
  Stop --> Next           ✓  改名
  task1 --> task2         ✓  用下划线或小驼峰
  "task-1" --> "task-2"   ✓  或者加引号

flowchart 的保留字:endsubgraphdirectionclick

flowchart 节点形状速查

最常用的图表,节点形状全靠括号选:

写法形状用途
A[文字]矩形默认,普通步骤
A(文字)圆角矩形起点 / 终点
A((文字))圆形状态 / 节点标识
A{文字}菱形判断 / 决策
A>文字]旗帜标记 / 标签
A[/文字/]平行四边形输入 / 输出
A[\文字\]反向平行四边形输入 / 输出
A[(文字)]圆柱数据库
A[[文字]]子程序嵌套调用

实战建议:一张图里 ≤ 3 种形状——形状用多了反而看不清重点。判断用菱形 + 步骤用矩形 + 数据库用圆柱基本够用。

时序图的 4 种箭头

A->>B: 同步请求         实线 + 实心箭头
B-->>A: 同步返回        虚线 + 实心箭头(视觉惯例:去同步、回虚线)
A-)B: 异步消息          不等返回,发完就走(如 MQ)
A-xB: 连接断开          异常 / 拒绝 / 超时

视觉惯例:实线表示”主动调用”,虚线表示”被动响应”。所以 A->>B 后面通常跟 B-->>A——别都写实线,看图人会一头雾水。

ER 图的基数符号

USER ||--o{ ORDER : places
        ↑↑   ↑↑
        左   右

左到中、右到中两端独立读:

符号最少最多
||11
|o01
}o0
}|1

实战常用 3 组:

  • ||--o{:1 对 0..N(USER 可有 0 或多个 ORDER)
  • ||--|{:1 对 1..N(ORDER 至少有 1 个 ORDER_ITEM)
  • }o--o{:多对多可选(USER 与 ROLE 通过中间表)

画错的代价:DBA 一眼看出业务逻辑漏洞——空订单是否合理?空购物车能否结账?基数图先回答业务问题,再回答数据库问题。

中文标点的彻底解决

全文搜替换比逐行修方便。Mermaid 不认的中文字符全列出:

中文替换为
:
,
( )
;
"" ''" '(更建议都用半角双引号)
?(用在 flowchart 判断节点 {是否成功?}
!
通常出现在标签文末,直接删除或换 .

例外:标签 / 注释内容里的中文标点视觉上是允许出现的,但容易引发后续 parser 误判——全部换半角最稳

导出与分享

右上角三个导出按钮

按钮输出适合
复制 SVGSVG 源码到剪贴板贴到 README、Notion 富文本(直接渲染)
导出 SVG下载 .svg 文件矢量印刷、再编辑(Illustrator 可改)
导出 PNG下载 .png 文件(2x 高清)贴 PPT、微信、公众号(兼容性最广)

分享链接:点”分享”按钮,代码 base64 编码后塞进 URL hash(/tools/mermaid/#code=xxxxx)。

  • 全部在 hash 里,不发到服务器——本工具完全离线渲染
  • 别人打开链接会自动加载你的代码并渲染
  • 代码越长链接越长——超长代码(如 200 行甘特图)链接可能超过 2000 字符,少数浏览器会截断

需要长期保存的图——先复制代码到笔记里,链接当临时分享用。

渲染失败时的 5 分钟排查路径

步骤操作解决率
1检查首行类型声明拼写大小写30%
2全文搜中文标点 :,()"" 替换为半角40%
3检查箭头与图表类型匹配(--> vs ->>15%
4给含特殊字符的节点标签加双引号10%
5看右下角错误信息前 50 个字到 mermaid.js.org 搜5%

90% 的报错在前两步就能定位。养成”粘贴代码后先搜一遍中文标点”的习惯,比一行行肉眼对照快得多。

写文档时的最佳实践

  • 小图优先:一张图 ≤ 15 个节点。超过的拆成两张或换 [[mermaid]] 子图(subgraph)
  • 代码与图同源:把 Mermaid 代码直接贴到 Markdown 里,GitHub / Notion / 飞书都支持原生渲染,别把图导成 PNG 再贴——图改一次要重传一次
  • 正式排版时:复杂图(多分支决策、跨系统时序)转 SVG 印刷 / 导出;草图阶段用 [[whiteboard]] 自由发散
  • 数据可视化:饼图 / 柱图 / 折线如果数据多 (>10 项) 用 [[chart-maker]] 更顺手,Mermaid 的 pie / xychart 更适合 3-8 项的快速示意

写技术文档把 Mermaid 用顺手了,README、设计文档、接口说明的视觉传达密度会大幅提升——代码即图,diff 友好,版本可控,比来回拖 draw.io 拷图爽得多。

❓ 常见问题

14 种图表怎么对应到"我要画什么"?有没有决策树?

简化为五类需求:(1) 流程 / 决策路径flowchart(最通用,分支判断也走它);(2) 时间顺序的对话 / 调用sequenceDiagram(API 调用、用户操作、握手协议都走它);(3) 结构关系classDiagram(面向对象 / 模块)、erDiagram(数据库表关系)、mindmap(发散思考);(4) 状态流转stateDiagram-v2(订单 / 工单 / 协议状态机);(5) 数据统计pie(占比)、xychart-beta(柱/折线)、sankey-beta(流向)、quadrantChart(四象限优先级)。剩下的 gantt(排期)、gitGraph(git 分支)、timeline(编年)、journey(用户旅程)按字面意思即可。不确定时点上方"模板"按钮看示例对照。

为什么我一改代码就显示"渲染失败"红字?

90% 出在 4 类问题:(1) 首行类型名拼错或大小写错——sequenceDiagram 不能写成 sequencediagram / sequencestateDiagram-v2 不能省掉 -v2classDiagram 不能写成 class-diagram。(2) 中文标点混入——:、,。""'() 这些全角字符 Mermaid 不识别,必须半角 ,():。(3) 节点 / 边语法错——flowchart 的边是 A --> B(两个减号一个尖括号),不是 A -> B;时序图相反,是 A->>B / A-->>B。(4) 方括号 / 圆括号里有保留字符 —— A[包含(注释)的标题] 里嵌套 () 会失败,要用 ["A 包含 (注释)"] 加引号转义。错误信息在右下角,复制到官方文档对照修复即可。

flowchart 的方向 TD / LR / TB / BT / RL 到底用哪个?

TD = TB = Top-Down 自上而下(默认,适合决策树、分层流程),flowchart TDflowchart TB 完全等价。LR = Left-Right 从左到右(适合横向时序、状态机、流水线,宽屏阅读友好)。BT = Bottom-TopRL = Right-Left 是反向版本,几乎用不到——除非要画"自底向上"的逻辑(如继承链、依赖链)。实用经验:节点 ≤ 8 个、层级 ≤ 3 层用 TD;节点 ≥ 10 个或有平行分支用 LR——纵向太长在屏幕里要滚动,横向更适合一屏看完。

时序图的箭头有 4 种:-> / --> / ->> / -->>,到底什么区别?

记两对就够:(1) 实线 vs 虚线 —— -> 实线表示"同步调用 / 主动行为",--> 虚线表示"返回 / 异步响应"。视觉惯例就是"去同步实线、回虚线"。(2) 箭头头 vs 开放头 —— 单尖 > 是开放头(旧版用,现在很少),双尖 >> 是实心箭头(推荐)。所以实战中 90% 的写法是:调用用 A->>B: 请求,返回用 B-->>A: 响应。另外有 -x 表示连接断开(异常 / 拒绝),-) 表示异步消息(不等返回),写协议握手时用得上。避免 A->B —— 它是旧语法,新版可能渲染异常或样式不一致。

ER 图的基数符号 ||--o{ ||--|{ 怎么读?

两端各看一次,左到中看左实体、右到中看右实体。每端符号是"最少..最多"两字符:| 最少 1,o 最少 0;| 最多 1(紧贴竖线),{ 最多多(鱼尾分叉)。所以:(1) ||--o{ 读作"左侧恰好 1 个、右侧 0 到多个"——典型 1:N 可选关系,如 USER ||--o{ ORDER(用户可有 0 个或多个订单)。(2) ||--|{ 读作"左侧恰好 1 个、右侧 1 到多个"——典型 1:N 必选关系,如 ORDER ||--|{ ORDER_ITEM(订单至少有 1 件商品)。(3) }o--o{ 是多对多可选。画错的代价:DBA 看一眼就知道你设计错了——下单流程里如果 ORDER ||--o{ ORDER_ITEM 写成 o{,意味着允许空订单,业务上通常不合理。先想清楚业务再选基数。

导出 SVG / PNG 时图变模糊或字体丢了,怎么回事?分享链接为什么这么长?

PNG 模糊——本工具导出 PNG 时用 2x scale 防止 retina 屏发糊,正常情况下高清。仍模糊多半因为:(1) 浏览器缩放比例 ≠ 100%(导出前按 Ctrl+0 重置);(2) 字体没加载完就点了导出——刚切换主题或刚改字体时等 1 秒再导。SVG 字体丢失——本工具完全本地渲染、不连 CDN,所以 emoji 在某些系统的 SVG 里可能显示为方框。导出时勾选"PNG 含背景"会用主题卡片色填充,避免黑色字打到透明背景看不见。分享链接的长度:你写的代码是 base64 编码后塞进 URL #code=...,所以代码越长链接越长。全部在 hash 里,不会发到服务器——别人打开链接才会在本地解码渲染。

🧜 打开 Mermaid 图表 流程图/时序图/类图/ER/甘特/饼图/思维导图等 14+ 类型·DSL 实时预览·暗色跟随·SVG/PNG 导出·分享链接·本地渲染