Mermaid vs PlantUML 泳道图对比:角色分工、跨泳道流程与选型

OnUML Team··7 min read
mermaidplantumlswimlane-diagramactivity-diagramflowchartdiagram-as-code

本文只关注泳道图本身的图形表达能力。 至于 Markdown 支持、文档平台集成、生态插件、渲染服务这些整体工具差异,本文不会展开,相关内容可以看系列总览:Mermaid vs PlantUML:2026 年该选哪个图表即代码工具?

在这个前提下,结论很直接:按 OnUML 当前使用的 Mermaid 11.6.0 来看,Mermaid 可以用 Flowchart 的 subgraph 近似画泳道图,适合轻量角色分组;PlantUML 有 Activity Diagram 的原生泳道语法,适合真正强调职责边界、跨角色流转和正式流程评审的泳道图。

这里需要补充一个版本说明:Mermaid 官方在 11.16.0+ 新增了 swimlane-beta 泳道图语法,但它是较新的 beta 能力,而 OnUML 当前项目依赖的 Mermaid 版本是 11.6.0,暂不支持 swimlane-beta。所以本文的 Mermaid 示例仍采用当前项目可用的 Flowchart subgraph 写法。

泳道图的关键不是“流程能不能画出来”,而是“每一步到底属于哪个角色、部门、系统或服务”。如果只是把流程节点按区域分组,Mermaid 的 subgraph 很好用。如果需要流程在不同泳道之间自然切换,或者希望每个活动明确归属当前泳道,PlantUML 的 |Lane| 语法更贴近泳道图本身。

更准确的判断是:

Mermaid 胜在分组简单。subgraph 把节点放进 Customer、Sales、Warehouse 这些区域,再用连线表达跨区域流转,语法短、可读性强,适合放在产品说明和轻量流程文档里。

PlantUML 胜在泳道语义明确。 它可以通过 |Customer||Sales||Warehouse| 在活动流程中切换泳道,后续活动天然属于当前泳道;还可以给泳道设置颜色,并和 ifrepeatwhilefork 等活动图语法组合。

本文基于官方文档和 OnUML 当前依赖版本整理,并配合具体案例对比代码和图形效果:

Mermaid vs PlantUML 泳道图核心差异

对比点MermaidPlantUML选择建议
泳道/角色分组当前项目版本用 subgraph 近似;Mermaid 11.16.0+ 有 swimlane-beta原生 `Lane
活动归属节点属于某个 subgraph当前泳道下的活动天然归属该泳道角色职责 PlantUML 更明确
跨泳道流转用跨 subgraph 连线表达切换泳道后继续写活动简单图 Mermaid 足够
条件分支用菱形节点和连线表达原生 if/else/endif复杂分支 PlantUML 更清楚
循环用回边表达原生 while / repeat循环流程 PlantUML 更稳
并行用多条连线近似原生 fork并发泳道流程 PlantUML 更合适
泳道颜色可通过 subgraph 样式近似支持泳道颜色语法需要职责区分时 PlantUML 更直观
Markdown 友好度很高取决于渲染集成文档内轻量泳道图 Mermaid 更轻
正式 UML 语义近似表达更贴近 UML Activity Diagram 泳道评审归档选 PlantUML

先给一句话结论:

Mermaid 的泳道图更像“带分组的流程图”;PlantUML 的泳道图更像“按职责切分的活动图”。

Mermaid 可以用 subgraph 画轻量泳道图

下面是一个售后退货流程:客户提交申请,客服审核,仓库收货,财务退款。这个流程的重点是让读者快速看出不同角色负责哪些步骤。

Mermaid 代码和图

flowchart LR
  subgraph Customer
    C1[Submit return request]
    C2[Ship item back]
    C3[Receive refund]
  end

  subgraph Support
    S1[Review request]
    S2[Send return label]
    S3[Notify result]
  end

  subgraph Warehouse
    W1[Receive item]
    W2[Inspect item]
  end

  subgraph Finance
    F1[Issue refund]
  end

  C1 --> S1
  S1 --> S2
  S2 --> C2
  C2 --> W1
  W1 --> W2
  W2 --> S3
  S3 --> F1
  F1 --> C3

PlantUML 代码和图

@startuml
|Customer|
start
:Submit return request;

|Support|
:Review request;
:Send return label;

|Customer|
:Ship item back;

|Warehouse|
:Receive item;
:Inspect item;

|Support|
:Notify result;

|Finance|
:Issue refund;

|Customer|
:Receive refund;
stop
@enduml

对这种“角色分组 + 顺序流转”的流程,Mermaid 和 PlantUML 都能讲清楚。Mermaid 的 subgraph 更像视觉分组,PlantUML 的泳道切换更像职责声明。

PlantUML 更适合复杂跨泳道流程

当泳道图里有条件分支、拒绝路径、重复修改或跨角色并行协作时,PlantUML 的优势会更明显。下面这个采购审批流程包含审批通过/拒绝,以及仓库和财务的并行处理。

Mermaid 代码和图

flowchart LR
  subgraph Requester
    R1[Create purchase request]
    R2[Revise request]
    R3[Receive goods]
  end

  subgraph Manager
    M1[Review request]
    M2{Approved?}
  end

  subgraph Procurement
    P1[Create purchase order]
    P2[Confirm supplier]
  end

  subgraph Warehouse
    W1[Prepare receiving plan]
  end

  subgraph Finance
    F1[Reserve budget]
  end

  R1 --> M1 --> M2
  M2 -- No --> R2 --> M1
  M2 -- Yes --> P1 --> P2
  P2 --> W1
  P2 --> F1
  W1 --> R3
  F1 --> R3

PlantUML 代码和图

@startuml
|Requester|
start
:Create purchase request;

|Manager|
:Review request;

if (Approved?) then (yes)
  |Procurement|
  :Create purchase order;
  :Confirm supplier;

  fork
    |Warehouse|
    :Prepare receiving plan;
  fork again
    |Finance|
    :Reserve budget;
  end fork

  |Requester|
  :Receive goods;
  stop
else (no)
  |Requester|
  :Revise request;
  |Manager|
  :Review request again;
  stop
endif
@enduml

为什么这个场景更适合 PlantUML?

Mermaid 可以用 subgraph、菱形节点和多条连线近似表达,但复杂度会明显转移到连线组织上:

  • Mermaid 的泳道是分组容器,PlantUML 的泳道是活动归属语义。
  • Mermaid 的并行通常靠一对多连线表达,PlantUML 有 fork
  • Mermaid 的拒绝后重提通常靠回边表达,PlantUML 可以把它写成活动控制结构。
  • PlantUML 在跨泳道流程里切换角色更自然,代码顺序也更接近实际流程叙事。

这就是 PlantUML 在泳道图里的真正优势:它不是只把节点放进不同区域,而是让流程本身带着角色归属往前走。

Mermaid 更适合文档内的职责分组

如果你的泳道图主要用于说明“谁负责什么”,而不是完整建模活动语义,Mermaid 的 subgraph 很轻快。

Mermaid 代码和图

flowchart TD
  subgraph Product
    P1[Define requirement]
    P2[Accept result]
  end

  subgraph Engineering
    E1[Design solution]
    E2[Implement change]
    E3[Fix feedback]
  end

  subgraph QA
    Q1[Test change]
    Q2{Passed?}
  end

  P1 --> E1 --> E2 --> Q1 --> Q2
  Q2 -- No --> E3 --> Q1
  Q2 -- Yes --> P2

这类图的目标是快速对齐职责边界,不一定要满足严格 UML 活动图语义。对这种场景,Mermaid 的可读性和 Markdown 友好度就是优势。

泳道图选择建议

选 Mermaid 写泳道图,如果这张图的重点是:

  • 用几个角色分组说明流程。
  • 放在 README、产品文档、轻量方案或协作说明里。
  • 流程主要是顺序节点和少量判断。
  • 不需要严格表达 fork/join、循环、中断和活动归属语义。
  • 读者更关心“哪个角色做哪件事”。

选 PlantUML 写泳道图,如果这张图的重点是:

  • 需要正式的活动图泳道语义。
  • 每个活动必须明确属于某个角色、部门、系统或服务。
  • 流程包含复杂条件、循环、并行或提前结束。
  • 需要在泳道之间频繁切换,并保持代码叙事清楚。
  • 需要给泳道设置颜色或输出统一评审图。

常见问题

Mermaid 有原生泳道图语法吗?

Mermaid 11.16.0+ 官方新增了 swimlane-beta,但 OnUML 当前使用的 Mermaid 11.6.0 暂不支持。因此在当前项目里,仍建议用 Flowchart 的 subgraph 近似表达泳道。它适合轻量分组,但不像 PlantUML 的 |Lane| 那样是稳定的活动图泳道语义。

Mermaid 的 subgraph 能不能跨泳道连线?

可以。你可以把节点放在不同 subgraph 中,再用普通连线连接这些节点。这也是 Mermaid 画轻量泳道图最常见的方式。

PlantUML 泳道图可以和条件、循环、并行一起用吗?

可以。PlantUML 官方 Activity Diagram 语法中的泳道可以和 ifrepeatwhilefork 等控制结构组合使用,适合复杂跨角色流程。

只看图形能力,泳道图怎么选?

如果你只是想按角色分组展示流程,Mermaid 足够。如果你需要正式泳道语义、复杂控制结构和清晰职责归属,PlantUML 更合适。

最终结论:

泳道图这一项上,Mermaid 适合轻量职责分组,PlantUML 适合正式跨角色活动流程。Mermaid 画得快,PlantUML 语义更稳。

你可以在 OnUML 编辑器 中分别使用 Mermaid 和 PlantUML 模式,把上面的示例复制进去对比效果。