Skip to content

图表

图表有助于传达不同技术组件之间复杂的关系和相互连接,是项目文档的一个很好的补充。Material for MkDocs 集成了 Mermaid.js,这是一个非常流行且灵活的绘图解决方案。

配置

8.2.0

此配置启用对 Mermaid.js 图表的原生支持。当页面包含 mermaid 代码块时,Material for MkDocs 将自动初始化 JavaScript 运行时:

markdown_extensions:
  - pymdownx.superfences:
      custom_fences:
        - name: mermaid
          class: mermaid
          format: !!python/name:pymdownx.superfences.fence_code_format

无需进一步配置。与自定义集成相比的优势:

  • 即时加载 一起工作,无需额外努力
  • 图表自动使用在 mkdocs.yml 中定义的字体和颜色1
  • 可以使用 附加样式表 自定义字体和颜色
  • 支持浅色和深色配色方案 – 在此页面上试试!

使用

使用流程图

流程图 是表示工作流程或过程的图表。步骤以各种类型的节点呈现,并通过边连接,描述步骤的必要顺序:

流程图
``` mermaid
graph LR
  A[开始] --> B{错误?};
  B -->|是| C[嗯...];
  C --> D[调试];
  D --> B;
  B ---->|否| E[太棒了!];
```
graph LR
  A[开始] --> B{错误?};
  B -->|是| C[嗯...];
  C --> D[调试];
  D --> B;
  B ---->|否| E[太棒了!];

使用时序图

时序图 描述特定场景中多个对象或参与者之间的顺序交互,包括这些参与者之间交换的消息:

时序图
``` mermaid
sequenceDiagram
  autonumber
  Alice->>John: 你好,约翰,你好吗?
  loop 健康检查
      John->>John: 对抗疑病症
  end
  Note right of John: 理性的思考!
  John-->>Alice: 很好!
  John->>Bob: 你怎么样?
  Bob-->>John: 非常好!
```
sequenceDiagram
  autonumber
  Alice->>John: 你好,约翰,你好吗?
  loop 健康检查
      John->>John: 对抗疑病症
  end
  Note right of John: 理性的思考!
  John-->>Alice: 很好!
  John->>Bob: 你怎么样?
  Bob-->>John: 非常好!

使用状态图

状态图 是描述系统行为的一个很好的工具,将其分解为有限数量的状态和这些状态之间的转换:

状态图
``` mermaid
stateDiagram-v2
  state fork_state <<fork>>
    [*] --> fork_state
    fork_state --> State2
    fork_state --> State3

    state join_state <<join>>
    State2 --> join_state
    State3 --> join_state
    join_state --> State4
    State4 --> [*]
```
stateDiagram-v2
  state fork_state <<fork>>
    [*] --> fork_state
    fork_state --> State2
    fork_state --> State3

    state join_state <<join>>
    State2 --> join_state
    State3 --> join_state
    join_state --> State4
    State4 --> [*]

使用类图

类图 是面向对象编程的核心,通过将实体建模为类及其之间的关系来描述系统的结构:

类图
``` mermaid
classDiagram
  Person <|-- Student
  Person <|-- Professor
  Person : +String name
  Person : +String phoneNumber
  Person : +String emailAddress
  Person: +purchaseParkingPass()
  Address "1" <-- "0..1" Person:lives at
  class Student{
    +int studentNumber
    +int averageMark
    +isEligibleToEnrol()
    +getSeminarsTaken()
  }
  class Professor{
    +int salary
  }
  class Address{
    +String street
    +String city
    +String state
    +int postalCode
    +String country
    -validate()
    +outputAsLabel()
  }
```
classDiagram
  Person <|-- Student
  Person <|-- Professor
  Person : +String name
  Person : +String phoneNumber
  Person : +String emailAddress
  Person: +purchaseParkingPass()
  Address "1" <-- "0..1" Person:lives at
  class Student{
    +int studentNumber
    +int averageMark
    +isEligibleToEnrol()
    +getSeminarsTaken()
  }
  class Professor{
    +int salary
  }
  class Address{
    +String street
    +String city
    +String state
    +int postalCode
    +String country
    -validate()
    +outputAsLabel()
  }

使用实体关系图

实体关系图 由实体类型组成,并指定实体之间存在的关系。它描述了特定知识领域中相互关联的事物:

实体关系图
``` mermaid
erDiagram
  CUSTOMER ||--o{ ORDER : places
  ORDER ||--|{ LINE-ITEM : contains
  LINE-ITEM {
    string name
    int pricePerUnit
  }
  CUSTOMER }|..|{ DELIVERY-ADDRESS : uses
```
erDiagram
  CUSTOMER ||--o{ ORDER : places
  ORDER ||--|{ LINE-ITEM : contains
  LINE-ITEM {
    string name
    int pricePerUnit
  }
  CUSTOMER }|..|{ DELIVERY-ADDRESS : uses

其他图表类型

除了上述列出的图表类型,Mermaid.js 还支持 饼图甘特图用户旅程Git 图需求图,这些在 Material for MkDocs 中并未正式支持。这些图表仍应按照 Mermaid.js 的说明正常工作,但我们不认为它们是一个好的选择,主要是因为它们在移动设备上表现不佳。

自定义

如果您想自定义 Mermaid.js,例如引入对 ELK 布局 的支持,可以通过将自定义 JavaScript 文件添加到您的 mkdocs.yml 来实现:

import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs';
import elkLayouts from 'https://cdn.jsdelivr.net/npm/@mermaid-js/layout-elk@0/dist/mermaid-layout-elk.esm.min.mjs';

mermaid.registerLayoutLoaders(elkLayouts);
mermaid.initialize({
  startOnLoad: false,
  securityLevel: "loose",
  layout: "elk",
});

// 重要:使其对 Material for MkDocs 可见
window.mermaid = mermaid;
extra_javascript:
  - javascripts/mermaid.mjs

  1. 虽然所有 Mermaid.js 功能应该开箱即用,但 Material for MkDocs 目前仅会调整流程图、时序图、类图、状态图和实体关系图的字体和颜色。有关为什么目前未对所有图表实现此功能的更多信息,请参见 其他图表 部分。