约 8 分钟读完 · 更新于 2026-10-21 · 文中每条都能在下面的配套工具里动手验证
Mermaid 的解析发生在渲染之前:整段代码先被词法分析,语法有任何一处不合法就直接抛错,一个节点都不会画出来。所以报错时看到空白是正常现象,错误信息里的行号才是唯一线索。真正的高频原因只有三类:节点文本里出现了会被当成语法的字符(括号、冒号、逗号、全角标点)、代码里混进了不可见字符(零宽空格、全角空格、复制时带进来的软换行)、以及新旧语法混用(graph 与 flowchart 混用、旧版箭头语法配新版)。
Mermaid 的报错文本通常很短,但每一条几乎都对应固定的一类问题。下面六条覆盖了绝大多数情况。
| 报错或现象 | 病灶 | 修法 |
|---|---|---|
| Parse error on line N | 第 N 行有语法非法字符,或行号因空行而偏移 | 从 N-1 行开始看;把节点文本整体加双引号 |
| Expected 'edge', 'node', got ... | 箭头写成 →、=> 或 -→,必须是 -- 或 --> | 统一成 Mermaid 的 ASCII 箭头 |
| No diagram type detected | 首行不是 graph / flowchart / sequenceDiagram | 第一行必须是图类型声明,且不要有前导空格 |
| 文字渲染异常,节点标签缺字或溢出 | 节点文本里有 < > & 被当 HTML 解析 | 用 #quot; 代替引号,或把标签整体用引号包住 |
| 代码看起来一模一样却报错 | 混入了零宽空格(\u200B)或全角空格(\u3000) | 把源码过一遍转义清理后再粘贴 |
| graph 写的图在 v10+ 有告警 | graph 已更名 flowchart | 首行改 flowchart,箭头与子图语法保持不变 |
flowchart TD
A["提交工单"] --> B{"校验通过?"}
B -->|是| C["进入处理"]
B -->|否| D["退回并通知"]
C --> E["归档"]
· 首行必须是图类型,且顶格
· 所有中文标签加双引号,避免括号 / 冒号被当语法
· 箭头只能写 -- 或 -->,别用 →sequenceDiagram
autonumber
participant U as 用户
participant G as 网关
participant S as 订单服务
U->>G: POST /orders
activate G
G->>S: 创建订单
alt 库存充足
S-->>G: 201 Created
else 库存不足
S-->>G: 409 Conflict
end
deactivate G
G-->>U: 返回结果
loop 每 30s 重试
U->>G: GET /orders/{id}
endgraph TD → v10+ 起 graph 已更名,首行改 flowchart A[开始(第一步)] → 括号未加引号,解析器当成子语法 A --> B(第二步: 处理) → 冒号在未加引号的标签里会截断标签 flowchart LR A["a"] --> B["b"]; B --> C["c";] → 分号在引号内会进标签,但引号外的分号在部分版本报错
Mermaid 的语法先于文本生效。中文写作里几乎无处不在的三类字符正好都是语法符号:圆括号与方括号会被当作节点形状,花括号被当作判断节点,冒号在部分上下文里会截断标签文本,书名号《》有时会被当成 HTML 标签起始。修法统一成一条:所有中文标签一律用双引号包起来,形如 A["提交工单(第一步)"]。引号包裹后,内部任何字符都只当普通文本处理;如果标签文本本身需要引号,用 #quot; 实体。
渲染成功只是开始。要放进文章或社交平台,还要处理三件事:导出的 SVG 常常带着冗余属性与过长的数值,先过一遍 SVG 优化再嵌入,能省下可观体积;需要位图时按用途选格式——社交平台与文档用 PNG,需要透明背景时必须 PNG 或 WebP,JPEG 会把透明区域填成黑色;需要长图时按内容类型选工具,静态图文导成长图 PNG,界面操作类演示则录屏转 GIF 更合适。三步各有对应的工具,不必用同一套流程硬套所有场景。
三个常见原因:一是报错行号被开头的空行或注释偏移了,先删掉首部空行再看行号;二是第 7 行里有零宽空格或全角空格,肉眼看不见;三是指向那一行的语法错误其实来自上一行未闭合的引号。最快的排查方式是二分法——删掉一半节点再逐批加回。
因为圆括号、方括号、花括号在 Mermaid 里是节点形状语法,冒号在部分上下文会截断标签文字。语法解析发生在渲染之前,一个非法字符就让整张图都画不出来。所有中文标签统一写成 A["提交工单(第一步)"],内部字符就都只当普通文本处理。
是的,v10 起 graph 被更名为 flowchart,作为旧别名仍能用但会告警,新写的图统一用 flowchart。箭头、子图、样式这些语法都没变,只改首行即可。跨平台发布时更要统一:多数平台跑 v10,你本地渲染器可能是 v11,混用时行为会有差异。
通常是把 participant 的中文名当成了节点标识。声明 participant U as 用户 之后,消息里必须写 U,中文「用户」只是图上的显示标签。同类问题还有 alt 或 loop 块忘了 end——缺一个 end 会让后面几行一起报解析错误,看起来像是后面那行写错了。