开头
一个很常见的场景:你维护的系统架构图放在 draw.io 或 ProcessOn 里,产品经理突然说"加一个网关节点",你打开图,找到合适的位置,拖出新框,改文字,调连线,然后发现整个图布局被挤乱了,又花十分钟重新排布。改一次还能忍,改十次之后,这张图基本就没人愿意维护了。
Mermaid 给出的答案是:把流程图当成代码来写。它用类似 Markdown 的纯文本语法描述节点和连线,然后在编辑器、命令行或网页里渲染成图。标题里那句 "flowcharts you don't have to redraw in a diagram editor" 说的正是这个工作方式的转变——你不再需要在一个图形编辑器里反复重绘,你只需要改文字,图会自动重新生成。
这篇文章的核心判断是:Mermaid 真正的价值不是"画图更快",而是让图表进入了软件工程的工作流。它把一张架构图从一个静态文件,变成了一段可以被 Git 管理、被 Code Review 审查、被 CI 校验、被文档系统自动渲染的代码。读完这篇文章,你能掌握 Mermaid 的核心语法,知道怎么在 VS Code、在线编辑器和命令行里渲染图表,理解如何把已有的 draw.io 图表转换成 Mermaid 源码,并学会在实际项目中避开最常见的坑。
1. 这篇文章真正要解决的问题
1.1 传统 diagram editor 的真正痛点
很多人觉得,用 draw.io、Visio、ProcessOn 画图没什么不好。确实,在画一张"一次性架构说明图"时,可视化编辑器的手感很好:拖、拽、连、对齐,所见即所得。
但一旦这张图进入长期维护阶段,问题就暴露了:
- 重绘成本高:增加一个节点通常意味着手动调整连线、重新布局,位置一变,整张图都要跟着动。
- 布局漂移严重:不同人打开同一张图,稍微拖动一下,保存后布局就变了,代码评审时根本看不出哪里改过。
- 无法版本化:draw.io 的 XML 文件虽然能进 Git,但 diff 出来的是一大段 XML 节点坐标,几乎没法人工审查。
- 协作门槛高:只有打开编辑器才能看,代码仓库里的 Markdown 文档无法直接嵌入渲染结果。
- 复制传播难:图存在某个在线平台里,团队新成员要先注册、申请权限,才能看到图。
这些痛点的本质是:流程图被当成"图片"来管理,而图片天然不适合做细粒度的版本管理。
1.2 Mermaid 解决的是什么问题
Mermaid 绕开了"图形编辑器"这个中间层。它把图表的定义完全文本化,渲染是事后的事情。对比一下两种流程:
- 传统方式:打开编辑器 -> 拖节点 -> 连线 -> 调整布局 -> 导出图片 -> 放在文档里。
- Mermaid 方式:在 Markdown 里写代码 -> 预览渲染 -> 提交到 Git -> CI 自动生成图片附件。
第二种方式的优势在于:图表与代码的变更记录完全同步。你改了一行A-->B,Git diff 里清清楚楚,Code Review 时一眼就能看出拓扑关系的变化。
这不是 Mermaid 独有的能力,PlantUML、Graphviz 也做类似的事,但 Mermaid 的特点是语法更接近人类自然语言,学习成本低,并且内置于 GitHub、GitLab、Obsidian、Typora 等大量工具链中,社区和插件生态也成熟。从搜索结果看,围绕 Mermaid 的活跃热词集中在mermaid 语法、mermaid live editor、vscode mermaid preview 插件、drawio 转 mermaid、mermaid 时序图,这说明开发者真正关心的是:怎么把 Mermaid 接入到自己的编辑器和工作流里,以及怎么和既有图表资产衔接。
1.3 什么人最适合读这篇文章
如果你满足以下任一条件,这篇文章值得读完:
- 你的团队在维护系统架构图、流程图、时序图,但文档里的图一年没更新过了。
- 你写技术方案时经常要画图,但觉得打开在线画图工具很麻烦。
- 你想把图表放进 Git 仓库,让每次架构调整都有据可查。
- 你已经在用 draw.io 这类工具,想知道迁移到 Mermaid 的代价到底大不大。
- 你在写 CSDN 博客或团队内部文档,希望用代码方式画时序图和流程图。
不夸张地说,只要你的工作内容里包含"画图"这一步,Mermaid 都值得花半小时认真了解。
2. Mermaid 是什么:从语法到渲染的核心原理
2.1 通俗理解:像写 Markdown 一样写图表
你可以把 Mermaid 理解成"图表界的 Markdown"。Markdown 用#、**、-这些符号来描述排版结构,Mermaid 则用graph、-->、sequenceDiagram这些关键字来描述图形结构。
一段最基本的 Mermaid 流程图长这样:
graph TD A[用户输入] --> B[服务端校验] B -->|合法| C[写入数据库] B -->|非法| D[返回错误提示]它表达的是:用户输入经过服务端校验,合法时写入数据库,非法时返回错误提示。渲染出来后是一张标准的流程图。
这里的graph是图表类型,TD表示 Top-Down(从上到下),A、B、C、D是节点 ID,[文本]是节点显示内容,-->是箭头连线,|标签|是连线上的文字。全部都是纯文本,不需要鼠标拖拽。
2.2 核心概念:节点、连线、子图、方向
Mermaid 的流程图模型比想象中简单,核心就是三样东西:
| 概念 | 作用 | 示例 |
|---|---|---|
| 节点 | 表示一个步骤、角色或对象 | A[下单] |
| 连线 | 表示节点之间的关系 | A --> B |
| 方向 | 决定整体布局方向 | TB、BT、LR、RL |
| 子图 | 把多个节点组织成一个组 | subgraph 业务层 |
节点的形状由方括号的变体决定:
A[矩形]:普通步骤。A(圆角矩形):开始或结束。A{菱形}:判断分支。A((圆形)):通常表示连接点或数据库。A>旗帜形]:常用于异步回调。
连线也有很多变体:
A --> B:带箭头。A --- B:不带箭头。A -.-> B:虚线箭头。A ==> B:粗箭头。A -- 文字 --> B:带文字的连线。
这些语法组合起来,基本能覆盖业务流程图、系统架构图的大部分表达需求。
2.3 渲染原理:文本解析到 SVG 的过程
从用户角度看,Mermaid 的工作流程是:
- 用户编写 Mermaid 文本。
- Mermaid 解析器读取文本,构建内部图结构。
- 图结构交给布局引擎计算节点位置和连线路径。
- 渲染器生成 SVG(或 PNG)。
这里要理解一个关键点:布局是算法自动计算的,不是用户手调的。这就是"不需要在 diagram editor 里重绘"的技术原理。你写的是逻辑关系,位置和连线的几何路径由布局引擎决定。
这个设计有好处也有代价。好处是增删节点时不需要手动调整位置;代价是你不能像 draw.io 那样精细控制某个节点在画布上的绝对坐标。如果你需要像素级控制布局,Mermaid 不适合;如果你在意的是结构清晰和可维护性,Mermaid 的自动布局反而省心。
2.4 Mermaid 能画哪些图
除了最流行的流程图,Mermaid 还支持:
- 时序图(
sequenceDiagram) - 状态图(
stateDiagram-v2) - 类图(
classDiagram) - 甘特图(
gantt) - 饼图(
pie) - 思维导图(
mindmap) - 用户旅程图(
journey) - C4 架构图(
C4Context等)
其中时序图在开发文档中使用频率非常高,后面会给出完整示例。
2.5 与常见方案对比:Mermaid vs draw.io vs PlantUML
| 维度 | Mermaid | draw.io | PlantUML |
|---|---|---|---|
| 书写方式 | 纯文本 | 可视化拖拽 | 纯文本 |
| 渲染工具链 | 浏览器、VS Code、CLI、GitHub 内置 | 客户端/Web | 本地 JAR + 各插件 |
| 学习成本 | 低 | 低 | 中 |
| 版本管理友好度 | 高 | 中(diff 是 XML) | 高 |
| 自定义布局能力 | 弱 | 强 | 弱 |
| 中文生态资料 | 多 | 多 | 一般 |
| 典型场景 | 文档内嵌、博客、快速草图 | 复杂精确绘图 | 工程文档的 UML 图 |
如果你的核心诉求是"在技术文档里画一张能长期维护的流程图",Mermaid 几乎是最优解。如果你要画的是一张对外发布的、视觉要求极高的运营海报,draw.io 或专业设计工具更合适。工具没有绝对好坏,只有适不适合当前场景。
3. 环境准备与前置条件
Mermaid 的使用路径非常多,这里介绍三种最常见的方式。具体软件版本请以实际安装为准,本文重点是演示通用思路。
3.1 方式一:VS Code 内预览(最推荐日常使用)
如果你平时写 Markdown 文档,VS Code 是目前体验最好的 Mermaid 编辑环境。
需要安装的插件:
Markdown Preview Mermaid Support:让 VS Code 内置的 Markdown 预览支持 Mermaid 渲染。Mermaid Editor(可选):提供 Mermaid 语法高亮和快捷预览。markdownlint(可选):如果你受得了 Markdown 规范检查,可以顺手装一个。
安装后,新建一个test.md,写入:
# 下单流程图 ```mermaid graph TD A[用户点击下单] --> B{库存是否充足} B -->|是| C[生成订单] B -->|否| D[提示库存不足] ```然后按Shift + Ctrl + V(Windows)或Shift + Command + V(Mac)打开 Markdown 预览,就会看到渲染出来的流程图。
更推荐的是用Ctrl+K V打开拆分预览,左边写代码,右边实时看图。这基本就是"不需要重绘"的日常体感:改代码、看结果、提交。
3.2 方式二:Mermaid Live Editor 在线工具
Mermaid 官方提供了在线编辑器,对应热词里常出现的mermaid live editor、mermaid live editor 网页版。打开在线编辑器后,左边写 Mermaid 代码,右边实时渲染,还支持把图导出为 SVG 或 PNG。
这个工具适合以下场景:
- 快速验证一段 Mermaid 语法是否正确。
- 写博客或方案时,临时生成一张图导出为图片。
- 团队没有统一编辑器时,让其他人快速查看效果。
需要使用在线工具时,提醒一点:不要把包含敏感信息的架构图粘贴到在线编辑器里。虽然官方工具一般不会主动泄露数据,但出于最小权限原则,涉及公司内部架构、未公开服务拓扑的信息,尽量用本地 VS Code 或本地 CLI 处理。
3.3 方式三:mermaid-cli 命令行工具(适合自动化)
如果希望把 Mermaid 渲染接入脚本和 CI,可以用官方命令行工具@mermaid-js/mermaid-cli,命令名是mmdc。
安装方式:
npm install -g @mermaid-js/mermaid-cli安装后,把 Mermaid 代码保存到flow.mmd:
graph TD A[发起支付] --> B[调用支付网关] B -->|成功| C[更新订单状态] B -->|失败| D[记录失败日志]执行渲染命令:
mmdc -i flow.mmd -o flow.svg也可以输出 PNG:
mmdc -i flow.mmd -o flow.png -w 1200 -b white这个工具底层依赖 Puppeteer 启动浏览器渲染,所以首次运行可能会下载浏览器内核,耗时较长,这是正常现象。在 CI 环境里,需要确保已经安装了对应的依赖库。
3.4 环境准备小结
| 使用方式 | 安装成本 | 适合场景 | 注意事项 |
|---|---|---|---|
| VS Code 插件 | 低 | 日常写文档、实时预览 | 插件需要能正常加载本地资源 |
| Live Editor | 零安装 | 快速验证、临时导出 | 不要贴敏感信息 |
| mermaid-cli | 中 | 批量渲染、CI 自动化 | 依赖 Puppeteer,首次运行慢 |
4. 核心流程拆解:从文本到图表的完整工作流
理解了基本概念后,下面把一条完整的 Mermaid 工作流拆开讲。这不是简单介绍某个功能,而是告诉你从零到落地,每一步该做什么、为什么这么做、做错了会看到什么。
4.1 在 Markdown 中编写 Mermaid 代码
第一步是建立"图表即代码"的写作习惯。在 Markdown 文档里,Mermaid 代码块的标准写法是:
```mermaid graph TD A[开始] --> B[处理] B --> C[结束] ```注意,代码块的语言标记必须是mermaid,否则一些 Markdown 编辑器不会触发渲染引擎。
这里有一个重要判断:建议把图表直接写在文档里,而不是把渲染后的图片嵌入文档。理由有两点:
第一,图片是静态的,读者看不出来图是历史版本还是最新版本;而 Mermaid 源码可以直接在 Git 中看到变更记录。
第二,直接写源码,读者可以在评论中直接复制、修改,不用下载图片再编辑。
4.2 在 Live Editor 或 VS Code 中快速迭代
修改 Mermaid 图表的体验和修改代码几乎一致。加上一个节点,就加一行C[D] --> E[E];改变分支逻辑,就改一个B -->|新条件| C。
在做这一步时,新手最容易踩的坑是:连线的分支条件写错位置。比如把判断条件写在节点文本里,而不是写在连线上。正确的做法是,判断条件属于"连线上的标签",用竖线包裹,放在箭头之后,例如:
graph TD A{是否登录} -->|已登录| B[进入首页] A{是否登录} -->|未登录| C[跳转登录页]如果写成A{是否登录|已登录|},渲染结果会完全错误。
4.3 用 CLI 导出正式图片文件
文档里嵌入 Mermaid 源码固然方便,但有些场景仍然需要图片文件,比如:
- 发布到不支持 Mermaid 渲染的第三方平台。
- 放入 PPT、企业微信文档或对外汇报材料。
- 需要固定尺寸和背景色的图片资源。
这时候用mmdc批量导出。建议在项目根目录放一个docs/mermaid目录,里面存.mmd源文件,然后用脚本导出到docs/images:
mkdir -p docs/mermaid docs/images例如有一个docs/mermaid/order-flow.mmd,执行:
mmdc -i docs/mermaid/order-flow.mmd -o docs/images/order-flow.svg mmdc -i docs/mermaid/order-flow.mmd -o docs/images/order-flow.png -w 1600 -s 2 -b white-s 2表示两倍缩放,适合高分辨率需求。对于包含中文的图,建议额外指定字体配置,避免渲染出方块字,具体见常见问题部分。
4.4 接入 Git 与文档工程
这一步是工作流的关键分水岭。把.mmd源文件和导出的图片文件都加入 Git 仓库,同时在 README 或 docs 目录里维护这些图表。
具体建议是:
.mmd文件是"源文件",必须入库。- 导出的
.svg或.png是"构建产物",可以选择入库,也可以由 CI 自动生成。 - 文档中的 Mermaid 代码块本身就是源文件,入库自然完成。
如果担心图片产物频繁变动产生噪音,可以只在发布文档时运行导出命令,或者用 CI 在标签发布时自动生成图片附件。
4.5 流程拆解小结
| 阶段 | 做什么 | 为什么 | 容易出错的点 |
|---|---|---|---|
| 编写 | 在 Markdown 里写mermaid代码块 | 让图表可版本化 | 语法写错,预览报错 |
| 迭代 | 用 VS Code 或 Live Editor 实时预览 | 快速调整结构 | 分支标签放错位置 |
| 导出 | 用 mmdc 生成 SVG/PNG | 满足外部发布需求 | 中文乱码、尺寸太小 |
| 入库 | 提交.mmd与渲染产物 | 让团队所有人看到同一份图表 | 图片与源文件不同步 |
5. 完整示例与代码实现
这一节给出几个可以直接复制运行的 Mermaid 完整示例。示例覆盖流程图、时序图、带子图的架构图,以及从 draw.io 迁移到 Mermaid 的落地思路。
5.1 示例一:带判定分支的流程图
这是最常见的业务流程图,适合描述订单、审批、异常处理等流程。将下面代码保存为order-flow.mmd:
graph TD Start([开始]) --> A[用户提交订单] A --> B{库存充足?} B -->|是| C[扣减库存] C --> D[生成支付单] D --> E{支付成功?} E -->|是| F[通知仓库发货] E -->|否| G[订单取消] G --> H[释放库存] B -->|否| I[提示库存不足] I --> End([结束]) F --> End H --> End这段代码用到了:
Start([开始]):圆角矩形表示开始节点。B{库存充足?}:菱形表示判断。B -->|是| C:带条件标签的连线。End([结束]):结束节点。
运行方式可以是:
- 在 VS Code 的 Markdown 预览中查看。
- 在 Mermaid Live Editor 中粘贴查看。
- 用
mmdc -i order-flow.mmd -o order-flow.svg导出。
5.2 示例二:时序图(sequenceDiagram)
时序图在接口设计、分布式事务、调用链排查中非常常用,也是热词中"mermaid 时序图应该怎么画"关注的核心对象。保存为login-sequence.mmd:
sequenceDiagram participant U as 用户 participant C as 前端客户端 participant S as 后端服务 participant D as 数据库 U->>C: 输入用户名密码 C->>S: POST /api/login S->>S: 校验验证码 S->>D: 查询用户信息 D-->>S: 返回用户记录 alt 密码正确 S->>C: 200 OK + Token C->>U: 登录成功,跳转首页 else 密码错误 S->>C: 401 Unauthorized C->>U: 显示"密码错误" end关键点:
participant U as 用户:定义参与者,as后面是显示名。->>:实线箭头,表示同步消息。-->>:虚线箭头,表示异步返回。alt ... else ... end:表示条件分支。
时序图的语法和流程图不同,它更接近"剧本",按时间顺序一行一行写消息。这种方式很适合描述一次完整的请求链路。
5.3 示例三:带子图的系统架构图
当图变复杂时,建议用子图分组,否则所有节点挤在一起很难读。下面是一个电商系统的简化架构图:
graph TB subgraph Client[客户端] UI[Web 前端] APP[移动端 App] end subgraph Gateway[接入层] Nginx[Nginx 网关] Auth[认证服务] end subgraph Service[业务层] Order[订单服务] Pay[支付服务] Stock[库存服务] end subgraph Storage[数据层] MySQL[(订单数据库)] Redis[(缓存)] end UI --> Nginx APP --> Nginx Nginx --> Auth Nginx --> Order Order --> Pay Order --> Stock Order --> MySQL Order --> Redis注意subgraph Client[客户端]的语法:Client是子图 ID,[客户端]是子图标题。如果你写成subgraph 客户端,在某些版本里会把"客户端"当成 ID,显示效果与预期不同。
子图的价值在于:它把物理边界画出来了。别人看你的架构图,第一眼看到的是几个大模块,第二眼才是模块内部的细节。
5.4 示例四:从 draw.io 转换到 Mermaid 的思路
团队里肯定积累了一堆 draw.io 文件。从热词看,drawio 转 mermaid是很多人的刚需。需要注意的是,没有万能工具能 100% 保留 draw.io 里手动调整的布局,因为 Mermaid 本身不保留绝对坐标。但拓扑关系可以转换。
思路是:
- draw.io 文件本质是 XML,包含
mxCell节点。 - 解析 XML 里的
vertex节点作为 Mermaid 节点。 - 解析
edge节点作为 Mermaid 连线。 - 文本拼装成
graph TD输出。
下面是一个最小化的 Python 转换脚本,思路清晰,可直接运行:
import xml.etree.ElementTree as ET def drawio_to_mermaid(drawio_path): tree = ET.parse(drawio_path) root = tree.getroot() # draw.io 文件中的 diagram 元素包含 graphModel diagram = root.find(".//diagram") if diagram is None: raise ValueError("未找到 diagram 元素,请确认是 draw.io 导出的 XML 文件") # 命名空间不固定,直接遍历所有 cell cells = [] for cell in diagram.iter(): if cell.tag.endswith('cell'): cells.append(cell) node_lines = [] edge_lines = [] for cell in cells: cell_id = cell.get('id') value = cell.get('value') style = cell.get('style') or '' edge_attr = cell.get('edge') source = cell.get('source') target = cell.get('target') if edge_attr == '1' and source and target: # 连线:source -> target label = value if value else '' if label: edge_lines.append(f" {source} -->|{label}| {target}") else: edge_lines.append(f" {source} --> {target}") elif value: # 节点:id 与显示文本 if 'shape=image' in style or 'rounded=1' in style: node_lines.append(f" {cell_id}({value})") else: node_lines.append(f" {cell_id}[{value}]") lines = ["graph TD"] lines.extend(node_lines) lines.extend(edge_lines) return "\n".join(lines) if __name__ == "__main__": result = drawio_to_mermaid("architecture.xml") print(result)将这个脚本输出的内容保存成.mmd文件,再交给 Mermaid 渲染即可。需要说明的是,这个脚本是简化版,面对复杂样式(如跨区域连线、泳道图)时需要扩展,但核心思路是对的:先抽取节点和边,再生成 Mermaid 文本。
5.5 示例五:mmdc CLI 导出与主题配置
用 CLI 导出时,可以通过配置文件统一控制颜色、字体、线条风格。新建mermaid.config.json:
{ "theme": "base", "themeVariables": { "primaryColor": "#dce9f7", "primaryTextColor": "#333333", "lineColor": "#555555", "fontSize": "16px", "fontFamily": "Microsoft YaHei, PingFang SC, sans-serif" } }然后执行:
mmdc -i docs/mermaid/order-flow.mmd -o docs/images/order-flow.svg -c mermaid.config.json指定fontFamily为常见中文字体,可以在很大程度上避免中文乱码。如果你在 Linux CI 环境里,确保系统上已经安装了中文字体,否则还是要额外配置。
6. 运行结果与效果验证
写完了代码,怎么确认它真的渲染对了?下面给出验证步骤。
6.1 在 VS Code 中验证
- 打开包含 Mermaid 代码块的 Markdown 文件。
- 按
Ctrl+K V打开拆分预览。 - 观察右侧渲染结果,确认节点、连线、分支标签是否与预期一致。
- 修改 Mermaid 代码,右侧应立即刷新。
预期输出:一张清晰的分层流程图。如果右侧没有渲染出图,而是显示代码原文或报错框,优先检查代码块语言标记是否为mermaid,以及拼写是否正确(如graph误写成grahp)。
6.2 在 Mermaid Live Editor 中验证
- 打开 Live Editor。
- 把 Mermaid 代码粘贴到左侧编辑器。
- 右侧应实时显示渲染结果。
- 如果没有反应,点击"渲染"按钮并查看错误信息。
Live Editor 的报错信息通常能定位到具体行,例如Parse error on line 5,这是调试时最有用的线索。
6.3 用 mmdc 验证导出
mmdc -i order-flow.mmd -o order-flow.svg命令执行成功后,当前目录会出现一个order-flow.svg文件。用浏览器打开时,应该能看到完整的流程图。
如果导出 PNG 后发现中文变成方块,或者文字截断,优先检查:
- 系统字体是否包含中文字体。
- 配置文件中
fontFamily是否指定了中文字体。 - 图片宽度是否足够,必要时加大
-w参数。
6.4 判断成功的标准
一张 Mermaid 图是否渲染正确,可以从这几方面判断:
- 所有节点都显示且文字完整。
- 所有连线方向符合逻辑,条件分支标签没有错位。
- 子图分组边界清晰。
- 没有语法报错。
- 导出图片中文字清晰,没有乱码。
如果以上都满足,这张图就可以放心进入文档或交付物了。
7. 常见问题与排查思路
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| Markdown 预览中 Mermaid 代码没有渲染 | 代码块语言标记不是mermaid | 检查代码块首行是否为```mermaid | 改为```mermaid并重新打开预览 |
预览报Parse error on line X | 语法错误,例如中文括号、缺少end、箭头符号写错 | 查看报错行,对照官方语法手册 | 修正语法,在 Live Editor 中快速验证 |
| 中文字体显示为方块 | 渲染环境缺少中文字体 | 在 mmdc 配置中指定fontFamily | 配置"fontFamily": "Microsoft YaHei, PingFang SC, sans-serif",安装中文字体 |
| 导出 PNG 文字被截断 | 图片宽度不够 | 检查文字长度和图片宽度 | 增加-w参数,或使用-s 2提高缩放 |
| mmdc 命令找不到 | 未正确安装@mermaid-js/mermaid-cli | 运行npx mmdc --version | 执行npm install -g @mermaid-js/mermaid-cli |
| mmdc 首次运行卡住 | 正在下载 Puppeteer 浏览器内核 | 等待或查看网络状态 | 在 CI 中预缓存浏览器内核,或设置镜像源 |
| 子图标题显示为 ID | 子图语法中标题未用[文字] | 检查subgraph行写法 | 改为subgraph Service[业务层] |
| 连线分支条件显示错位 | 条件标签写在了节点文本里 | 检查节点{}内部是否放入了标签 | 将条件写在连线 `--> |
这些是初学者最常遇到的几类问题。如果你遇到的是特殊情况,调试思路是:先缩小范围,把代码粘到 Live Editor,删掉一半内容后再渲染,逐步定位出错行。这个过程和排查代码 bug 没有区别。
8. 最佳实践与工程建议
8.1 把图表当作代码来管理
这是整篇文章最重要的一条建议。Mermaid 的核心优势不是画图,而是"图表代码化"。因此,团队应该约定:
- 架构图、流程图、时序图优先用 Mermaid 写在 Markdown 文档中。
.mmd源文件纳入 Git 仓库。- 不在文档中单独维护一张"看起来很美但与实际代码脱节"的截图。
当图表进入 Git 后,每一次架构调整都有自己的提交记录。代码评审时可以明确看出"新增了哪个服务、删了哪条链路",这是传统图片完全做不到的。
8.2 命名与注释规范
给节点起 ID 时,建议使用有意义的英文名称,而不是A、B、C。虽然在小型图中用单个字母很方便,但当图中节点超过 10 个时,A --> B这种代码可读性非常差。
对比一下:
graph TD A --> C B --> Cgraph TD UserLogin[用户登录] --> AuthService[认证服务] OrderService[订单服务] --> AuthService[认证服务]第二种写法一眼就能看懂节点语义。Mermaid 支持在节点 ID 和显示文本分离时使用形如AuthService[认证服务]的方式,这也是推荐的写法。
8.3 用子图控制复杂度
一张图上超过 20 个节点,阅读体验就会急剧下降。应对策略是:
- 用
subgraph划分层次。 - 不要让跨层连线扎堆。
- 如果一张图实在太大,考虑拆成多张分步图。
架构图的核心价值是传达关键信息,不是把所有细节一次塞满。
8.4 在 CI 中自动渲染并校验语法
当团队开始大量使用 Mermaid 后,可以考虑在 CI 中增加一个自动化任务:
- 扫描文档中的所有 Mermaid 代码块。
- 提取并保存为
.mmd文件。 - 用
mmdc渲染成图片。 - 渲染失败则标记构建失败。
这样至少能保证:文档里的图没有语法错误。更进一步,可以在 PR 时自动生成图片差异,让评审者直观看到图表变化。不过这个做法需要配合团队工作流,适度引入即可。
8.5 在线编辑器的安全边界
Mermaid Live Editor 虽然方便,但也有一个容易被忽略的风险:你粘贴进去的架构图文本,可能包含内部服务名、拓扑关系等敏感信息。个人项目随便用,但公司项目要谨慎。
更稳妥的使用方式是:
- 优先用 VS Code 本地预览。
- 必须在线验证时,使用不含内部细节的脱敏示例。
- 生产环境的架构图,绝对不要粘贴到任何公共在线工具中。
这属于最小权限原则的简单实践,花不了多少时间,但能避免不必要的风险。
8.6 Mermaid 版本升级注意
Mermaid 版本迭代较快,不同版本的语法兼容性不完全一致。例如状态图有stateDiagram和stateDiagram-v2两种写法,部分旧版本不支持mindmap图表类型。
建议:
- 在项目中锁住 Mermaid 版本,尤其是使用 mermaid-cli 时。
- 升级 Mermaid 后,回归测试所有既有图表。
- 参考官方完整语法手册时,注意区分 "n" 版本和 "next" 版本。
9. 总结与后续学习方向
这篇文章不是简单介绍 Mermaid 有什么功能,而是围绕一个核心判断展开:Mermaid 把流程图从"图片"变成了"代码",让图表进入 Git、进入 Code Review、进入 CI 工作流。
你从这篇里应该已经掌握的是:
- Mermaid 的核心语法,包括流程图、时序图和子图分组。
- 从 Markdown 代码块到 Live Editor、VS Code、mermaid-cli 的完整渲染链路。
- 如何把一份 draw.io 的 XML 解析成 Mermaid 源码。
- 中文乱码、语法报错、渲染失败等常见问题的排查方法。
- 正式项目中把 Mermaid 接入文档管理的工程建议。
下一步的实践路径很明确:找一张你最近在维护的架构图或流程图,用 Mermaid 重新写一遍,放进 Markdown 文档里,提交到 Git,体验一次"改文字而不是拖线条"的工作方式。你可能会发现,以前一个月懒得更新一次的文档图,现在改起来其实只要两分钟。
之后值得深入的方向包括:
- 系统阅读 Mermaid 官方完整语法手册,尤其是
stateDiagram-v2、classDiagram、mindmap等进阶图表类型。 - 学习 Mermaid 主题定制,统一团队文档中的配色和字体。
- 尝试把 Mermaid 接入 Obsidian、GitBook、VitePress 等文档站系统,实现文档站点中图表的自动渲染。
- 如果你的团队还在用 draw.io 存量文件,可以参考第 5.4 节的思路,写一个完整的转换工具,把旧图表批量迁移到 Mermaid。
图表的价值不在于画得多复杂,而在于它能在团队里持续被查看、被更新、被讨论。Mermaid 给开发者的不是一种新的画图软件,而是一种把图表纳入软件工程的思考方式。这个思路一旦建立,你文档里的架构图就不会再"活不过三个月"了。