Mermaid 简介
Mermaid 是一个基于文本的图表绘制工具,让你用类似 Markdown 的简单语法描述图表,由渲染引擎自动生成 SVG 图形。GitHub 从 2022 年 2 月起原生支持 Mermaid,无需任何插件。
为什么用 Mermaid 而不是图片
图片需要额外的绘图工具(draw.io、Lucidchart),难以版本控制,修改需要重新导出。Mermaid 代码可以像代码一样 diff、review、提交。架构图和流程图随代码一起演进,始终与实现保持同步。
Mermaid 的工作原理
Mermaid 代码块被解析后,交给 Mermaid.js 库(JavaScript)渲染为 SVG。GitHub/GitLab 在服务端渲染,VS Code 通过插件渲染,Obsidian 内置支持,Notion 也支持。
```mermaid
# 所有 Mermaid 图表都写在 mermaid 代码块内
graph TD
A[开始] --> B{条件判断}
B -->|是| C[执行操作]
B -->|否| D[跳过]
C --> E[结束]
D --> E
```
流程图(Flowchart)
流程图是 Mermaid 最常用的图表类型,用于展示算法逻辑、业务流程、决策树等。
基本流程图
```mermaid
flowchart TD
A([开始]) --> B[/获取用户输入/]
B --> C{输入是否合法?}
C -- 合法 --> D[(保存到数据库)]
C -- 非法 --> E[显示错误提示]
E --> B
D --> F([结束])
```
([开始])
↓
[/获取用户输入/]
↓
{输入是否合法?}
合法 ↓
↓ 非法
[(数据库)]
[错误提示] → 循环回输入
↓
([结束])
流程图方向
| 关键字 | 方向 | 适用场景 |
|---|---|---|
TD / TB | 从上到下(Top Down) | 树形结构、层级关系 |
LR | 从左到右(Left Right) | 流水线、CI/CD、时间序列 |
BT | 从下到上(Bottom Top) | 倒树形 |
RL | 从右到左(Right Left) | 较少使用 |
节点形状大全
| 语法 | 形状 | 适用场景 |
|---|---|---|
A[矩形] | 矩形 | 处理步骤、操作(最常用) |
A(圆角矩形) | 圆角矩形 | 一般步骤 |
A{菱形} | 菱形 | 判断/条件 |
A([体育场]) | 椭圆 | 开始/结束 |
A[[双边框]] | 子程序形 | 函数调用、子流程 |
A[(圆柱体)] | 圆柱体 | 数据库 |
A((圆形)) | 圆形 | 连接点 |
A[/平行四边形/] | 平行四边形 | 输入/输出 |
A[\平行四边形\] | 反向平行四边形 | 输入/输出 |
A[/梯形\] | 梯形 | 特殊操作 |
连接线类型
| 语法 | 样式 | 含义 |
|---|---|---|
A --> B | 实线箭头 | 普通流转 |
A --- B | 实线无箭头 | 无向连接 |
A -.-> B | 虚线箭头 | 可选/异步流转 |
A ==> B | 粗实线箭头 | 主要/强调路径 |
A --"标签"--> B | 带标签的箭头 | 条件说明 |
A -->|标签| B | 带标签的箭头 | 条件说明(另一种写法) |
完整流程图示例
```mermaid
flowchart LR
subgraph 用户侧
U([用户])
end
subgraph 服务端
API[API 网关]
Auth{认证通过?}
DB[(数据库)]
Cache[(Redis 缓存)]
end
U -->|HTTP 请求| API
API --> Auth
Auth -->|否| E[返回 401]
Auth -->|是| Cache
Cache -->|命中| U
Cache -->|未命中| DB
DB -->|查询结果| Cache
DB -->|返回数据| U
```
用户 → API网关 → [认证通过?]
├── 否 → 返回 401
└── 是 → Redis缓存 → 命中 → 返回用户
└── 未命中 → 数据库 → 写缓存 → 返回用户
时序图(Sequence Diagram)
时序图展示多个系统/角色之间的交互时间顺序,是 API 文档、系统设计文档的标配。
```mermaid
sequenceDiagram
actor 用户
participant 前端 as 前端 (React)
participant 网关 as API 网关
participant 服务 as 后端服务
participant DB as 数据库
用户 ->> 前端: 点击登录按钮
前端 ->> 网关: POST /auth/login {email, password}
网关 ->> 服务: 转发请求
服务 ->> DB: SELECT * FROM users WHERE email=?
DB -->> 服务: 返回用户记录
服务 ->> 服务: 验证密码 bcrypt
alt 验证通过
服务 -->> 网关: {token, user}
网关 -->> 前端: 200 OK {token}
前端 -->> 用户: 跳转到首页
else 验证失败
服务 -->> 网关: 401 Unauthorized
网关 -->> 前端: 401 错误
前端 -->> 用户: 显示"密码错误"
end
```
时序图关键语法
| 语法 | 含义 | 线型 |
|---|---|---|
A ->> B: 消息 | 同步请求 | 实线 + 实心箭头 |
A -->> B: 消息 | 响应/异步 | 虚线 + 实心箭头 |
A -> B: 消息 | 同步(无箭头) | 实线 |
A --> B: 消息 | 响应(无箭头) | 虚线 |
A -x B: 消息 | 失败/销毁 | 实线 + X |
actor A | 声明为"人"形角色 | 人形图标 |
participant A as 别名 | 带别名的参与者 | 矩形 |
alt 条件/else/end | 条件分支 | 区域框 |
loop 循环条件/end | 循环 | 循环框 |
opt 可选/end | 可选操作 | 虚线区域框 |
Note over A,B: 说明 | 跨越多参与者的注释 | 便利贴形状 |
activate A/deactivate A | 激活/停用(显示激活条) | 长条高亮 |
类图(Class Diagram)
类图用于展示面向对象设计中的类结构和关系,适合代码架构文档。
```mermaid
classDiagram
class Animal {
+String name
+int age
#String species
-bool isAlive
+makeSound() String
+eat(food: Food) void
+getAge() int
}
class Dog {
+String breed
+fetch(item: Item) void
+bark() void
}
class Cat {
+bool isIndoor
+purr() void
+scratch() void
}
class ServiceDog {
+String serviceType
+assist(person: Person) void
}
Animal <|-- Dog : 继承
Animal <|-- Cat : 继承
Dog <|-- ServiceDog : 继承
Dog "1" *-- "many" Toy : 组合
Cat "1" o-- "0..1" Owner : 聚合
```
类图的关系类型
| 语法 | 关系 | 含义 |
|---|---|---|
A <|-- B | 继承 | B 继承 A(泛化) |
A *-- B | 组合 | A 包含 B(强关联,B 不能独立存在) |
A o-- B | 聚合 | A 包含 B(弱关联,B 可独立存在) |
A --> B | 关联 | A 使用 B |
A -- B | 链接 | 双向关联 |
A ..> B | 依赖 | A 依赖 B(虚线) |
A ..|> B | 实现 | A 实现接口 B |
类成员可见性
| 符号 | 可见性 |
|---|---|
+ | public(公开) |
- | private(私有) |
# | protected(受保护) |
~ | package(包级别) |
$ | static(静态,加在成员前) |
* | abstract(抽象) |
ER 图(Entity Relationship Diagram)
实体关系图用于数据库设计,展示表结构和表间关系:
```mermaid
erDiagram
USER {
int id PK
string email UK "唯一邮箱"
string name
datetime created_at
}
ORDER {
int id PK
int user_id FK
decimal total_amount
string status
datetime created_at
}
ORDER_ITEM {
int id PK
int order_id FK
int product_id FK
int quantity
decimal unit_price
}
PRODUCT {
int id PK
string name
decimal price
int stock
}
USER ||--o{ ORDER : "下单"
ORDER ||--|{ ORDER_ITEM : "包含"
PRODUCT ||--o{ ORDER_ITEM : "属于"
```
ER 图基数符号
| 左侧 | 右侧 | 含义 |
|---|---|---|
|| | || | 恰好一个(1:1) |
|| | o{ | 一对零个或多个(1:N) |
|| | |{ | 一对一个或多个(1:1+) |
}o | o{ | 多对多(N:M) |
|o | o| | 零或一(可选) |
其他常用图表类型
甘特图(Gantt Chart)
```mermaid
gantt
title 项目开发计划
dateFormat YYYY-MM-DD
section 设计阶段
需求分析 :done, des1, 2026-03-01, 2026-03-07
UI 设计 :done, des2, 2026-03-05, 2026-03-14
数据库设计 :done, des3, 2026-03-10, 2026-03-16
section 开发阶段
后端 API 开发 :active, dev1, 2026-03-15, 20d
前端开发 : dev2, after dev1, 15d
联调测试 : dev3, after dev2, 7d
section 上线阶段
预发布测试 :crit, rel1, after dev3, 3d
正式上线 :crit, rel2, after rel1, 1d
```
状态图(State Diagram)
```mermaid
stateDiagram-v2
[*] --> 待支付
待支付 --> 已支付 : 用户付款
待支付 --> 已取消 : 超时取消
已支付 --> 备货中 : 触发发货
备货中 --> 已发货 : 发货完成
已发货 --> 已签收 : 用户签收
已签收 --> [*]
已取消 --> [*]
已发货 --> 退款中 : 申请退款
退款中 --> 已退款 : 退款审核通过
已退款 --> [*]
```
饼图
```mermaid
pie title 编程语言使用分布
"JavaScript" : 35
"Python" : 28
"Java" : 15
"TypeScript" : 12
"Go" : 6
"其他" : 4
```
数学公式(LaTeX / MathJax)
GitHub 从 2022 年起支持 LaTeX 数学公式,使用 MathJax 渲染(GitHub)或 KaTeX(Docusaurus/MkDocs 等)。
内联公式(行内公式)
用单个美元符号 $...$ 包裹(GitHub 支持):
著名的质能方程 $E = mc^2$ 由爱因斯坦提出。
二次方程的解为 $x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}$。
黄金比例 $\varphi = \frac{1+\sqrt{5}}{2} \approx 1.618$。
独立公式块
用双美元符号 $$...$$ 创建独立居中的公式块:
$$
\sum_{i=1}^{n} x_i = x_1 + x_2 + \cdots + x_n
$$
$$
\int_{-\infty}^{+\infty} e^{-x^2} dx = \sqrt{\pi}
$$
$$
\begin{pmatrix}
a & b \\
c & d
\end{pmatrix}
\begin{pmatrix}
x \\
y
\end{pmatrix}
=
\begin{pmatrix}
ax + by \\
cx + dy
\end{pmatrix}
$$
常用 LaTeX 语法速查
| 功能 | LaTeX 写法 | 示例输出 |
|---|---|---|
| 上标 | x^{2} / x^2 | x² |
| 下标 | x_{i} / x_i | xᵢ |
| 分数 | \frac{a}{b} | a/b |
| 平方根 | \sqrt{x} | √x |
| n次根 | \sqrt[n]{x} | ⁿ√x |
| 求和 | \sum_{i=1}^{n} x_i | Σxᵢ (i=1 to n) |
| 乘积 | \prod_{i=1}^{n} x_i | Π |
| 积分 | \int_a^b f(x)dx | ∫ |
| 偏导 | \partial f / \partial x | ∂f/∂x |
| 无穷 | \infty | ∞ |
| alpha 等希腊字母 | \alpha \beta \gamma \delta | α β γ δ |
| 大写希腊字母 | \Sigma \Pi \Delta \Omega | Σ Π Δ Ω |
| 约等于 | \approx | ≈ |
| 不等于 | \neq | ≠ |
| 小于等于 | \leq | ≤ |
| 大于等于 | \geq | ≥ |
| 属于 | \in | ∈ |
| 矩阵 | \begin{pmatrix}...\end{pmatrix} | 圆括号矩阵 |
| 分段函数 | \begin{cases}...\end{cases} | 大括号分段 |
| 文字 | \text{说明文字} | 公式中的中文/文字 |
| 粗体 | \mathbf{x} | 向量 x(粗体) |
LaTeX 支持情况
| 平台 | 内联 $ $ | 块级 $$ $$ | 备注 |
|---|---|---|---|
| GitHub | ✅ 支持 | ✅ 支持 | 2022年起,使用 MathJax |
| VS Code(预览) | 需插件 | 需插件 | Markdown+Math 插件 |
| Obsidian | ✅ 内置 | ✅ 内置 | 使用 MathJax |
| Typora | ✅ 内置 | ✅ 内置 | 使用 MathJax/KaTeX |
| MkDocs Material | 需插件配置 | 需插件配置 | arithmatex 插件 |
| Docusaurus | 需配置 | 需配置 | KaTeX 或 MathJax 插件 |
| Jupyter Notebook | ✅ 内置 | ✅ 内置 | 使用 MathJax |
WARNING如果你的 Markdown 文档发布到不支持 LaTeX 的平台,数学公式会显示为原始
$...$ 文本,非常难看。在选择使用数学公式之前,先确认目标平台是否支持。如果不支持,可以用截图图片代替,或者用 CodePen 渲染后截图。
Mermaid 的局限性与替代方案
Mermaid 适合
- 流程图(中等复杂度)
- 时序图(系统交互)
- 类图(小型类结构)
- ER 图(数据库设计)
- 状态图(有限状态机)
考虑其他工具的情况
- 极复杂图表(节点很多):draw.io / Excalidraw
- 需要精确定位节点:drawio / Visio
- 架构图(云服务图标):Diagrams.net + 图标库
- 网络拓扑图:专业网络工具
小结
本章要点
- Mermaid:文字语法绘图,GitHub 2022 年起原生支持;代码放在
```mermaid代码块中 - 流程图:
flowchart TD/LR,支持多种节点形状(矩形、菱形、圆柱体等)和连接线类型 - 时序图:
sequenceDiagram,展示角色间交互;支持alt、loop、opt结构 - 类图:
classDiagram,支持继承、组合、聚合等关系;成员用+/-/#表示可见性 - ER 图:
erDiagram,支持 PK/FK/UK 约束和基数表示 - LaTeX 数学公式:内联用
$...$,块级用$$...$$;GitHub 2022 年起支持 - 选择正确的工具:Mermaid 适合中等复杂度图表;过于复杂时改用专业绘图工具