Mermaid.js 图表和流程图

FreeGuideOnline 最新 2026-07-12
flowchart TD
    A[开始] --> B[处理]
    B --> C[结束]

渲染效果将自动呈现一个简单的流程图。

### 核心语法结构

所有 Mermaid 图表的定义都以图表类型声明开头,随后跟随方向或样式信息,最后是节点和连线的定义。基本格式如下:

```
图表类型 [方向]
    节点定义
    连线定义
```

下面我们将逐一解析最常用的图表类型。

## 流程图(Flowchart)

流程图是最常用的图表之一,用于表达步骤、决策和过程流向。

### 节点类型与形状

在 Mermaid 中,节点通过不同的括号组合来定义形状,例如:

| 形状         | 语法示例              |
|--------------|-----------------------|
| 矩形         | `A[矩形内容]`         |
| 圆角矩形     | `B(圆角矩形)`         |
| 菱形(判断) | `C{条件判断}`         |
| 圆形         | `D((圆形))`           |
| 非对称形状   | `E>不对称形状]`       |
| 子程序/块    | `F[[子程序]]`         |

### 连线与箭头

连线使用 `-->` 或 `---` 定义,可在连线上添加文字标签:

- 实线箭头:`A --> B`
- 不带箭头实线:`A --- B`
- 带文字箭头:`A -- 是 --> B`
- 粗箭头:`A ==> B`
- 虚线箭头:`A -.-> B`

### 方向控制

流程图的方向通过图表类型声明后的两个字母指定:

- `flowchart TD` 或 `TB`:自上而下(Top Down/Bottom)
- `flowchart LR`:从左到右(Left Right)
- `flowchart RL`:从右到左
- `flowchart BT`:自下而上

### 完整示例

```mermaid
flowchart LR
    A[用户登录] --> B{验证密码}
    B -- 正确 --> C[进入主页]
    B -- 错误 --> D[显示错误信息]
    D --> A
```

这个例子展示了一个登录流程,包含判断节点和循环结构。

## 序列图(Sequence Diagram)

序列图用于展示对象之间交互的时间顺序,特别适合描述 API 调用、消息传递过程。

### 参与者定义

使用 `participant` 关键字声明参与者,别名采用驼峰式命名:

```
sequenceDiagram
    participant 客户端 as 客户端
    participant 服务器 as 服务器
```

也可以直接使用 `participant 客户端` 的简写形式。

### 消息传递

- 实线同步消息:`客户端->>服务器: 发送请求`
- 虚线异步消息:`客户端-->>服务器: 异步通知`
- 返回消息(带激活框):`服务器-->>客户端: 返回响应`

激活框(生命线)可使用 `activate` 和 `deactivate` 显式控制,或自动管理。

### 逻辑控制

Mermaid 支持在序列图中添加 `alt`-`else` 条件分支、`opt` 可选操作、`loop` 循环:

```
alt 登录成功
    客户端->>客户端: 保存令牌
else 登录失败
    客户端->>客户端: 提示重试
end
```

### 实战:OAuth 2.0 授权流程

```mermaid
sequenceDiagram
    participant U as 用户
    participant C as 客户端
    participant S as 授权服务器
    U->>C: 点击登录
    C->>S: 请求授权码(code)
    S-->>C: 返回授权码
    C->>S: 携带授权码请求令牌(token)
    S-->>C: 返回access_token
    C->>C: 存储令牌,完成登录
```

## 类图(Class Diagram)

类图用于面向对象设计,描述类、接口、属性、方法及类之间的关系。

### 定义类

类使用 `class` 关键字定义,属性和方法直接在下方列出,`+` 表示公共,`-` 表示私有,`#` 表示保护:

```
classDiagram
    class 动物 {
        +String 名称
        +int 年龄
        +void 发出声音()
    }
```

### 继承与实现

关系类型通过特定的箭头语法表达:

- 继承(泛化):`鸟类 --|> 动物`
- 实现接口:`企鹅 ..|> 可飞行` (虚线空心三角)
- 关联:`学生 --> 课程`
- 依赖:`人类 ..> 工具`
- 聚合:`汽车 o-- 发动机`
- 组合:`人 *-- 大脑`

### 示例:简单 Zoo 系统

```mermaid
classDiagram
    动物 <|-- 哺乳动物
    动物 <|-- 鸟类
    哺乳动物 <|-- 猫
    哺乳动物 <|-- 狗
    鸟类 <|-- 企鹅
    动物 : +String 名称
    动物 : +void 移动()
    鸟类 : +void 飞行()
    猫 : +void 喵喵叫()
    狗 : +void 汪汪叫()
```

## 状态图(State Diagram)

状态图用于描述对象在其生命周期内的状态变化及触发条件。

### 定义状态

使用 `state` 关键字或直接写状态名:

```
stateDiagram-v2
    [*] --> 待支付
    待支付 --> 已支付 : 用户付款
    已支付 --> 已发货 : 商家发货
    已发货 --> 已完成 : 用户签收
    已完成 --> [*]
```

`[*]` 表示初始状态或最终状态,也可以添加 `<<fork>>` 复合状态。

### 复合状态

复合状态内部可以包含子状态图:

```
stateDiagram-v2
    state 正常状态 {
        [*] --> 空闲
        空闲 --> 忙碌 : 接到任务
        忙碌 --> 空闲 : 任务结束
    }
    正常状态 --> 故障状态 : 异常发生
    故障状态 --> 正常状态 : 修复完毕
```

## 甘特图(Gantt Chart)

甘特图用于展示项目计划、任务时间线和依赖关系。

### 基本结构

`gantt` 关键字后跟日期格式和标题,每个任务使用 `section` 分组:

```
gantt
    title 网站开发计划
    dateFormat  YYYY-MM-DD
    section 设计阶段
    UI设计           :a1, 2025-04-01, 7d
    评审             :after a1, 2d
    section 开发阶段
    前端开发         :2025-04-10, 10d
    后端开发         :2025-04-10, 12d
```

### 任务依赖

- `:after taskID` 表示在某个任务之后开始
- 可以使用 `:crit` 表示关键任务,显示为红色
- 可指定持续时间(如 `7d`)或具体结束日期

### 示例:迭代冲刺

```mermaid
gantt
    title Sprint 1 规划
    dateFormat  YYYY-MM-DD
    axisFormat %m-%d

    section 需求
    需求收集       :active, req, 2025-04-01, 3d
    需求评审       :after req, 1d

    section 开发
    用户注册模块   :dev1, after req, 5d
    登录模块       :dev2, after dev1, 3d
    测试           :after dev2, 2d
```

## 饼图(Pie Chart)

饼图语法极其简洁,适合快速展示占比。

### 语法

```
pie title 产品销量占比
    "手机" : 45
    "电脑" : 30
    "平板" : 15
    "其他" : 10
```

数值不需要加百分号,Mermaid 会自动计算百分比并生成图例。

### 完整示例

```mermaid
pie
    title 网站访问来源
    "直接访问" : 40
    "搜索引擎" : 25
    "社交媒体" : 20
    "邮件营销" : 15
```

## 其它常用图表速览

### 用户旅程图(Journey)

用于描述用户完成目标的步骤与情绪变化:

```
journey
    title 在线购物旅程
    section 浏览商品
      打开首页: 3: 用户
      搜索商品: 4: 用户
      查看详情: 5: 用户
    section 下单购买
      加入购物车: 4: 用户
      支付: 2: 用户
      收到确认: 5: 用户
```

每个步骤后跟 `数字: 参与者`,数字表示满意度(1-5)。

### Git 图(Gitgraph)

展示分支、合并和提交历史:

```
gitGraph
    commit
    branch develop
    checkout develop
    commit
    branch feature-a
    checkout feature-a
    commit
    commit
    checkout develop
    merge feature-a
    commit
    checkout main
    merge develop
    commit
```

## 样式与主题定制

Mermaid 允许通过初始化配置或 CSS 自定义图表外观。

### 调整主题

在 `mermaid.initialize` 中设置 `theme` 属性:

```javascript
mermaid.initialize({
  startOnLoad: true,
  theme: 'forest', // 可选: default, forest, dark, neutral, base
});
```

### 节点自定义样式

可以直接为节点添加类名,然后在 CSS 中定义样式。Mermaid 也支持内联表达式定义填充色:

```
flowchart LR
    A[普通节点]
    style A fill:#f9f,stroke:#333,stroke-width:4px
```

### 主题变量

使用 `themeVariables` 可以精细控制主题颜色:

```javascript
mermaid.initialize({
  theme: 'base',
  themeVariables: {
    primaryColor: '#1E90FF',
    primaryTextColor: '#fff',
    primaryBorderColor: '#000',
    lineColor: '#F00',
  }
});