超越静态图像:利用 Mermaid 与 AI 工具解锁“图表即代码”的潜力
文档危机
每个工程团队都深知这种痛苦:你花费数周时间设计精美的微服务架构,精心制作令利益相关者印象深刻的 Visio 图表。然而六个月后,系统已经演进——新增了服务、迁移了数据库、废弃了 API 端点,但图表却凝固在原地。它成了一件文物,甚至是一种谎言。
这就是“文档腐烂”,它是工程生产力的隐形杀手。当图表失真时,开发人员会忽视它们;当开发人员忽视文档时,部落知识便会占据主导;当唯一了解系统的人离开时,你留下的将是一个复杂的代码库和一张缺失的地图。
图表即代码(DaC)是解决方案。其核心在于Mermaid——一款基于 JavaScript 的图表工具,能将纯文本转化为精美的可视化图形。

核心理念:像对待软件一样对待图表
图表即代码带来的根本转变,在于以与应用程序代码相同的严谨性来对待图表。这意味着:
1. 版本控制成为标准
当你的图表是一个.mermaid文件时,它就与源代码一起存在于你的 Git 仓库中。每一次变更都会被追踪。你可以git blame来查看是谁添加了该新服务,git diff在合并前审查变更,并回滚到任意之前的状态。

gitGraph
commit id: "初始架构"
commit id: "添加用户服务"
branch feature/order-service
commit id: "订单服务 v1"
commit id: "添加支付网关"
checkout main
merge feature/order-service
commit id: "更新 API 网关"
示例:使用 Mermaid 的 Git Graph 语法可视化图表自身的 Git 历史
2. 图表的代码审查
拉取请求不再仅用于代码。当开发人员提议新增服务或修改数据流时,该变更会以可读的差异形式出现在拉取请求中。审查者可以直接对图表本身进行评论,确保架构决策在合并前经过讨论和批准。
3. CI/CD 流水线集成
你的图表可以在流水线中自动生成并验证。想象一个 GitHub Action 能够:
-
将所有 Mermaid 图表渲染为 PNG/SVG 格式
-
将它们上传至你的文档站点
-
如果检测到无效的 Mermaid 语法,则构建失败

flowchart LR
A[开发者推送代码] --> B[CI 流水线运行]
B --> C[运行测试]
B --> D[渲染 Mermaid 图表]
D --> E{语法有效?}
E -->|是| F[上传至文档]
E -->|否| G[构建失败并通知团队]
F --> H[部署应用程序]
G --> I[开发者修复语法]
I --> A
示例:用于图表验证和部署的 CI/CD 工作流
Mermaid 实战:真实世界示例
让我们通过实际、真实的示例,探索 Mermaid 支持的各类图表。
示例 1:微服务架构(流程图)
这是最常见的用例——可视化您的服务如何通信。

flowchart TB
subgraph "客户端层"
MobileApp[移动应用]
WebApp[Web 应用程序]
end
subgraph "API 网关"
Gateway[API 网关]
end
subgraph "微服务"
UserSvc[用户服务]
OrderSvc[订单服务]
ProductSvc[产品服务]
PaymentSvc[支付服务]
end
subgraph "数据层"
UserDB[(用户数据库)]
OrderDB[(订单数据库)]
ProductDB[(产品数据库)]
Redis[(Redis 缓存)]
end
subgraph "外部服务"
Stripe[Stripe 支付]
EmailAPI[电子邮件 API]
end
MobileApp --> Gateway
WebApp --> Gateway
Gateway --> UserSvc
Gateway --> OrderSvc
Gateway --> ProductSvc
Gateway --> PaymentSvc
UserSvc --> UserDB
UserSvc --> Redis
OrderSvc --> OrderDB
OrderSvc --> Redis
ProductSvc --> ProductDB
ProductSvc --> Redis
PaymentSvc --> Stripe
OrderSvc --> EmailAPI
PaymentSvc --> EmailAPI
示例:包含缓存、数据库和外部依赖的完整微服务架构
示例 2:用户认证流程(序列图)
序列图非常适合记录服务之间复杂的交互。

sequenceDiagram
autonumber
participant 用户
participant 前端
participant AuthSvc as 认证服务
participant UserDB as 用户数据库
participant Cache as Redis 缓存
participant EmailSvc as 邮件服务
用户->>前端:输入凭据
前端->>AuthSvc:POST /login (邮箱,密码)
AuthSvc->>UserDB:按邮箱查询用户
UserDB-->>AuthSvc:返回加密后的密码及用户数据
AuthSvc->>AuthSvc:使用 bcrypt 验证密码
alt 凭据有效
AuthSvc->>AuthSvc:生成 JWT 令牌
AuthSvc->>Cache:存储会话(键:user_id,过期时间:1 小时)
AuthSvc-->>前端:200 OK + JWT 令牌
前端-->>用户:重定向至仪表板
else 凭据无效
AuthSvc->>EmailSvc:触发登录失败警报
AuthSvc-->>前端:401 未授权
前端-->>用户:显示错误消息
end
Note over AuthSvc,EmailSvc:5 次失败尝试后,锁定账户 15 分钟
示例:详细的认证流程,展示成功与失败路径,包括缓存和警报等副作用
示例 3:AWS 云基础设施(类图)
类图不仅用于代码,还可以建模云资源及其关系。

classDiagram
class VPC {
+string cidr_block
+string region
+createSubnet()
+deleteSubnet()
}
class Subnet {
+string availability_zone
+string cidr_block
+boolean is_public
+attachRouteTable()
}
class EC2Instance {
+string instance_type
+string ami_id
+int storage_gb
+start()
+stop()
+reboot()
}
class RDSDatabase {
+string engine
+string version
+int storage_gb
+boolean multi_az
+takeSnapshot()
+restoreFromSnapshot()
}
class S3Bucket {
+string bucket_name
+string region
+boolean versioning_enabled
+uploadFile()
+downloadFile()
}
class IAMRole {
+string role_name
+string policy_document
+attachPolicy()
+detachPolicy()
}
VPC "1" --> "*" Subnet
Subnet "1" --> "*" EC2Instance
Subnet "1" --> "0..1" RDSDatabase
VPC "1" --> "0..*" S3Bucket
EC2Instance --> IAMRole
RDSDatabase --> IAMRole
示例:将 AWS 基础设施建模为具有属性和方法的类,适用于文档编写和基础设施即代码规划
示例 4:电子商务订单处理(状态图)
状态图擅长展示实体如何在不同状态之间转换。

stateDiagram-v2
[*] --> Cart: 用户添加商品
Cart --> Checkout: 用户进入结算
Checkout --> PaymentPending: 用户提交订单
PaymentPending --> PaymentProcessing: 启动支付网关
PaymentProcessing --> Paid: 支付成功
PaymentProcessing --> PaymentFailed: 支付被拒
PaymentFailed --> Checkout: 用户重试支付
PaymentFailed --> [*]: 用户放弃购物车
Paid --> OrderConfirmed: 发送确认邮件
OrderConfirmed --> Preparing: 分配至仓库
Preparing --> Shipped: 移交承运商
Shipped --> InTransit: 承运商取件
InTransit --> Delivered: 配送确认
Delivered --> ReviewPrompted: 请求用户评价
ReviewPrompted --> [*]: 用户提交评价
Delivered --> RefundRequested: 用户发起退款
RefundRequested --> RefundApproved: 客服批准
RefundApproved --> RefundProcessed: 退款完成
RefundProcessed --> [*]: 订单关闭
state "高风险欺诈检查" as FraudCheck {
[*] --> CheckScore
CheckScore --> LowRisk: 分数 < 50
CheckScore --> HighRisk: 分数 >= 50
HighRisk --> ManualReview: 标记供团队审核
ManualReview --> LowRisk: 批准
ManualReview --> PaymentFailed: 拒绝
}
PaymentPending --> FraudCheck: 触发风险评估
FraudCheck --> PaymentProcessing: 低风险
示例:包含欺诈检测嵌套状态的完整电商订单状态机
示例 5:使用 GitHub 问题(Git 图)进行冲刺规划
Git 图可以表示超越 Git 本身的工作流。

gitGraph
commit id: "Sprint Planning" type: HIGHLIGHT
branch sprint-1
commit id: "用户故事 #101: 登录页面"
commit id: "用户故事 #102: 用户注册"
branch bugfix/hotfix
commit id: "热修复:认证令牌过期"
checkout sprint-1
merge bugfix/hotfix
commit id: "用户故事 #103: 密码重置"
checkout main
merge sprint-1 tag: "v1.0.0"
branch sprint-2
commit id: "功能 #201: 购物车"
commit id: "功能 #202: 结账流程"
branch experiment/ai-recommendations
commit id: "概念验证:机器学习推荐引擎"
checkout sprint-2
commit id: "功能 #203: 订单历史"
checkout main
merge sprint-2 tag: "v2.0.0"
commit id: "发布说明:第 1 和第 2 次冲刺完成"
示例:将项目管理、冲刺和功能分支可视化为 Git 图
图表绘制领域的 AI 革命
尽管 Mermaid 优雅,但其语法可能成为障碍。谁想在记录系统时还要调试错位箭头或缺失的括号呢?
这正是 AI 驱动工具改变一切的地方。
AI 自动修复
像这样的工具VPasCode(Visual Paradigm 的图表即代码平台)以及Mermaid Chart已集成 AI 模型(如 Google Gemini 和 OpenAI),能够:
-
自动检测语法错误
-
修复损坏的图表只需单击一次
-
建议图表结构的改进方案
让我们看看实际效果:
损坏的 Mermaid 代码:

flowchart LR
A[前端] --> B(API 网关
B --> C[用户服务]
C --> D[(数据库
D --> E[缓存]
AI 修复的代码:

flowchart LR
A[前端] --> B(API 网关)
B --> C[用户服务]
C --> D[(数据库)]
D --> E[缓存]
AI 能够识别缺失的右括号和右方括号,并立即修复它们。
自然语言转图表
也许最强大的功能是从自然语言描述生成图表。借助像OpenDocs(VP 的文档平台),你可以简单地描述你想要的内容:
“创建一个流程图,显示用户登录。如果凭据有效,则重定向到仪表板。如果无效,则显示错误并允许尝试 3 次。3 次失败后,锁定账户。”
AI 生成的 Mermaid:

flowchart TD
Start([用户尝试登录]) --> EnterCreds[输入电子邮件和密码]
EnterCreds --> Validate{验证凭据}
Validate -->|有效| Dashboard[重定向到仪表板]
Validate -->|无效| CheckAttempts{尝试次数 < 3}
CheckAttempts -->|是| Increment[增加尝试计数器]
Increment --> ShowError[显示错误消息]
ShowError --> EnterCreds
CheckAttempts -->|否| LockAccount[锁定账户 15 分钟]
LockAccount --> SendAlert[发送安全警报邮件]
SendAlert --> End([流程结束])
Dashboard --> End
图表类型之间的转换
AI 还可以在不同图表格式之间进行转换。需要将 PlantUML 图表转换为 Mermaid 吗?AI 工具可以处理:
PlantUML 输入:

@startuml
actor User
participant "前端" as FE
participant "后端" as BE
database "数据库" as DB
User -> FE: 点击登录
FE -> BE: POST /login
BE -> DB: SELECT user
DB --> BE: 用户数据
BE --> FE: JWT token
FE --> User: 显示仪表板
@enduml
AI 转换的 Mermaid:

sequenceDiagram
actor User
participant Frontend
participant Backend
participant Database
User->>Frontend: 点击登录
Frontend->>Backend: POST /login
Backend->>Database: SELECT user
Database-->>Backend: 用户数据
Backend-->>Frontend: JWT token
Frontend-->>User: 显示仪表板
交互式聊天机器人集成
一些平台现在提供用于创建图表的聊天机器人界面。你可以进行对话:
用户: “在我的架构图中添加一个名为‘库存服务’的新服务。”
AI: “我将添加一个库存服务,连接到您现有的产品和服务和订单服务。”
图表会自动更新
用户: “实际上,让它也连接到一个名为‘InventoryDB’的新数据库。”
AI: “完成。库存服务现在已连接到产品服务、订单服务以及新的InventoryDB。”
将“图表即代码”集成到您的工作流中
步骤 1:从小处着手
不要试图一次性绘制整个系统的图表。从一个组件开始——比如您的身份验证流程或您正在构建的新功能。
步骤 2:嵌入到文档中
将您的.mermaid文件与您的文档放在一起(例如,在/docs文件夹中)。使用如mermaid-cli等工具在构建过程中渲染它们。
步骤 3:利用 VPasCode 的统一引擎
如果您在一个偏好各异的团队中工作,VPasCode将极具价值。它在一个地方支持多种图表即代码语言:
# 在 VPasCode 中,您可以混合搭配:
diagrams/
├── architecture.mermaid
├── deployment.puml # PlantUML
├── database-erd.mermaid
└── workflow.d2 # D2 语言
步骤 4:通过 CI/CD 实现自动化
在您的 GitHub Actions 或 GitLab CI 中添加一个步骤:
- name: 渲染 Mermaid 图表
run: |
for file in $(find docs -name "*.mermaid"); do
npx @mermaid-js/mermaid-cli -i $file -o ${file%.mermaid}.png
done
- name: 上传到文档站点
run: |
aws s3 sync docs/ s3://your-docs-bucket/
步骤 5:在拉取请求中审查
制定一项政策:所有架构变更都必须更新图表。使用拉取请求评论来讨论视觉变更:
审查者:“缓存不应该位于订单服务和数据库之间吗?目前它仅附加到用户服务。”
作者:“抓得准。我会更新图表。”
实际影响:案例研究
考虑一家采用 Mermaid 和 VPasCode 实施“图表即代码”的金融科技公司:
-
之前:47 个静态 Visio 文件,大多数超过 6 个月未更新。新员工花费 3 周时间理解架构。
-
之后:12 个 Mermaid 图表,全部存储在 Git 中,随每个功能更新。新员工在第一周即开始高效工作。
团队首席技术官指出:“我们从将图表视为合规性勾选项,转变为将其作为开发流程中的活跃组成部分。当我们讨论新架构时,我们会打开 Mermaid 编辑器,直接用代码绘制草图。这彻底改变了我们的工作方式。”
未来:持续文档
最终目标是实现“持续文档”,即根据基础设施或代码自动生成图表。相关工具已经出现,能够:
-
扫描您的 Kubernetes 清单并生成服务拓扑图
-
解析 OpenAPI/Swagger 文件并创建 API 流程图
-
监控您的云资源并自动更新架构图
Mermaid 处于这场运动的核心,提供了一种简单、基于文本的格式,机器可以生成,人类也能理解。
今日开始
准备好超越静态图像了吗?这是您的行动计划:
-
安装 Mermaid 扩展在您喜欢的 IDE 中(VS Code、IntelliJ)
-
创建您的第一个图表在
.md文件中,使用 Mermaid 语法 -
体验 VPasCode 的免费层级以体验 AI 驱动的图表绘制功能
-
启动一个动态更新的文档仓库与你的代码库并存
-
与你的团队分享这篇文章并开启讨论
你的架构值得拥有比被遗忘文件夹中积灰的图表更好的待遇。是时候将你的图表视为关键资产来对待了。














