Mermaid 图表教程

Mermaid 语法规则与最佳实践

什么是 Mermaid

Mermaid 是一个基于文本的图表工具,可以通过简单的文本描述来生成各种图表。它使用类似 Markdown 的语法,可以嵌入在 Markdown 文件中,由 Mermaid 渲染引擎解析并生成 SVG/PNG 图表。

支持的图表类型

类型 关键词 说明
流程图 flowchart 用于表示流程或过程
时序图 sequenceDiagram 用于表示组件交互顺序
类图 classDiagram 用于表示面向对象结构
状态图 stateDiagram 用于表示状态机
实体关系图 erDiagram 用于表示数据库实体关系
甘特图 gantt 用于表示项目进度
饼图 pie 用于表示占比

流程图

flowchart TD
    A[开始] --> B{判断}
    B -->|是| C[处理1]
    B -->|否| D[处理2]
    C --> E[结束]
    D --> E
  • 方向:TD (上到下), BT (下到上), LR (左到右), RL (右到左)
  • 节点形状:[] 矩形, () 圆角, {} 菱形, [] 圆柱
  • 连接线:--> 实线, -- 虚线, -.- 点线
  • 箭头样式:>|实心箭头, >空心箭头
  • 连接文字:|文字| 在箭头后添加说明

时序图

sequenceDiagram
    participant A as 客户端
    participant B as 服务器
    participant C as 数据库
    A->>B: 发送请求
    B->>C: 查询数据
    C-->>B: 返回结果
    B-->>A: 响应结果
  • 参与者:使用 participant 关键字定义
  • 消息类型:-> 实线箭头, --> 虚线箭头, ->> 实线返回
  • 激活框:activate/deactivate 表示激活状态
  • 注释:Note 用于添加说明
  • 循环/条件:loop/alt/opt 表示复杂逻辑

类图

classDiagram
    Animal <|-- Duck
    Animal <|-- Fish
    Animal <|-- Zebra
    Animal : +String name
    Animal : +int age
    Animal: +makeSound()
    class Duck{
        +String beakColor
        +swim()
        +quack()
    }
    class Fish{
        -sizeInFeet
        -canEat()
    }
  • 继承:<|-- 表示继承关系
  • 接口:<| 表示实现关系
  • 关联:--> 表示关联关系
  • 成员:+ public, - private, # protected
  • 方法:() 表示方法,无括号表示属性

状态图

stateDiagram-v2
    [*] --> 初始状态
    初始状态 --> 处理中: 触发事件
    处理中 --> 完成: 处理成功
    处理中 --> 错误: 处理失败
    完成 --> [*]
    错误 --> [*]
  • 开始/结束:[*] 表示开始或结束状态
  • 状态转换:--> 表示状态变化
  • 复合状态:使用 state 定义复合状态

甘特图

gantt
    title 项目进度表
    dateFormat YYYY-MM-DD
    section 阶段一
    任务A: a1, 2024-01-01, 7d
    任务B: a2, after a1, 5d
    section 阶段二
    任务C: c1, after a2, 10d
    任务D: c2, after c1, 5d
  • 标题:title 定义图表标题
  • 日期格式:dateFormat 定义日期显示格式
  • 任务定义:任务名, 开始日期, 持续时间
  • 依赖关系:after 关键字表示依赖前置任务
  • 分组:section 用于任务分组

饼图

pie title 市场份额
    "产品A" : 45
    "产品B" : 30
    "产品C" : 15
    "其他" : 10
  • 标题:title 定义图表标题
  • 数据:使用 "标签" : 数值 格式

使用技巧

  • 调试:使用 format.cool 的 Mermaid 工具实时预览
  • 换行:使用 \n 在节点文本中换行
  • 特殊字符:使用引号包裹包含特殊字符的文本
  • 注释:使用 %% 开头添加注释
  • 样式:使用 subgraph 定义子图进行分组