搜 索

Mermaid 从入门到放弃

  • 38阅读
  • 2024年12月31日
  • 0评论
首页 / 编程 / 正文

前言:程序员の画图之痛

作为一名程序员,你一定经历过这样的场景:

  • 产品经理:「能不能画个流程图给我看看?」
  • 你:打开 Visio,卡了
  • 你:打开 Visual Paradigm,启动了 30 秒,License 过期了
  • 你:打开 ProcessOn,要登录
  • 你:打开 draw.io,画了半小时对齐箭头
  • 你:「我用代码给你讲一遍吧...」

又或者:

  • 写技术文档时,画了一张精美的架构图
  • 需求变更,要加两个模块
  • 重新打开源文件,发现是同事画的,用的 OmniGraffle
  • 你用的 Windows
  • 你:🙂

再或者:

  • 用 Visual Paradigm 画了一套完整的 UML 图
  • 换了台电脑,没有 License
  • 导出成图片?改不了
  • 导出成 XML?谁看得懂
  • 你:🙂

如果画图能像写代码一样,用纯文本描述,Git 能 diff,改动能追溯,那该多好?

恭喜你,Mermaid 就是答案。


一、Mermaid 是什么?

Mermaid 是一个基于 JavaScript 的图表生成工具,让你用类似 Markdown 的纯文本语法来描述图表,然后自动渲染成 SVG 图形。

graph LR A[纯文本] --> B[Mermaid 引擎] --> C[精美图表] style A fill:#4ecdc4,color:#fff style B fill:#ffe66d,color:#333 style C fill:#ff6b6b,color:#fff

1.1 为什么说它最适合程序员?

痛点传统工具Mermaid
版本控制二进制文件,diff 是乱码纯文本,Git 友好
协作修改「你发我源文件」直接改 Markdown
修改成本拖拽、对齐、调整箭头改一行代码
学习成本每个工具不一样语法统一,10 分钟上手
跨平台格式不兼容纯文本,哪里都能用
嵌入文档截图、贴图、图裂了原生支持 Markdown
AI 生成无法直接生成一句话生成图表

1.2 AI 时代的杀手锏

这是 2024 年 Mermaid 最大的优势:AI 可以直接生成 Mermaid 代码

graph LR A[你的需求] --> B[AI] B --> C[Mermaid 代码] C --> D[精美图表] style B fill:#4ecdc4,color:#fff

试试对 ChatGPT / Claude 说:

「帮我画一个用户下单的时序图,包括用户、订单服务、库存服务、支付服务」

几秒钟后,一张完整的时序图就出来了。

对比传统工具:

场景传统工具Mermaid + AI
画一张流程图打开软件 → 拖拽 → 对齐 → 30分钟描述需求 → AI 生成 → 微调 → 3分钟
修改图表找源文件 → 打开软件 → 修改 → 导出告诉 AI 「把XX改成YY」→ 完成
不会画某种图搜教程 → 学习 → 尝试「帮我画一个XX图」→ 直接出结果

这就是为什么说 Mermaid 是 AI 时代最适合程序员的图表工具——因为 AI 能理解它、生成它、修改它。

而 Visio、Draw.io 的二进制格式?AI 无能为力。

1.3 支持情况

graph TB subgraph native["原生支持"] GitHub GitLab Notion Typora Obsidian VSCode[VS Code] end subgraph plugin["插件支持"] Confluence JIRA WordPress Hexo VuePress end subgraph online["在线渲染"] MermaidLive[Mermaid Live Editor] Kroki end

基本上,程序员常用的文档工具都支持


二、快速入门:5 种最常用的图表

2.1 流程图 (Flowchart) —— 最常用

graph TD Start([开始]) --> Input[/输入用户请求/] Input --> Validate{参数校验} Validate -->|通过| Process[业务处理] Validate -->|失败| Error[返回错误] Process --> DB[(数据库操作)] DB --> Response[/返回响应/] Response --> End([结束]) Error --> End

语法要点:

graph TD           # TD=从上到下,LR=从左到右
    A[矩形]         # 普通节点
    B([圆角矩形])    # 开始/结束
    C{菱形}         # 判断
    D[(圆柱)]       # 数据库
    E[/平行四边形/]  # 输入/输出
    A --> B         # 箭头
    A -->|标签| B   # 带标签的箭头
    A --- B         # 无箭头连线
    A -.-> B        # 虚线箭头
    A ==> B         # 粗箭头

2.2 时序图 (Sequence Diagram) —— 接口交互必备

sequenceDiagram autonumber participant C as Client participant G as API Gateway participant A as Auth Service participant B as Business Service participant D as Database C->>G: POST /api/payment G->>A: 验证 Token A-->>G: Token 有效 G->>B: 转发请求 B->>D: 查询账户余额 D-->>B: 返回余额 alt 余额充足 B->>D: 扣减余额 D-->>B: 扣减成功 B-->>G: 支付成功 G-->>C: 200 OK else 余额不足 B-->>G: 余额不足 G-->>C: 400 Bad Request end

语法要点:

sequenceDiagram
    participant A as 别名     # 定义参与者
    A->>B: 同步请求          # 实线箭头
    B-->>A: 异步响应         # 虚线箭头
    A-xB: 丢失的消息         # 带 x 的箭头
    
    Note over A,B: 注释      # 跨参与者的注释
    
    alt 条件1               # 条件分支
        操作1
    else 条件2
        操作2
    end
    
    loop 循环条件            # 循环
        操作
    end
    
    opt 可选条件             # 可选
        操作
    end

2.3 类图 (Class Diagram) —— 面向对象设计

classDiagram class PaymentService { -PaymentRepository repository -AccountService accountService +processPayment(request) PaymentResult +refund(paymentId) RefundResult -validateRequest(request) boolean } class PaymentRepository { <> +save(payment) Payment +findById(id) Payment +findByOrderId(orderId) List~Payment~ } class JpaPaymentRepository { +save(payment) Payment +findById(id) Payment +findByOrderId(orderId) List~Payment~ } class Payment { -Long id -String orderId -BigDecimal amount -PaymentStatus status -LocalDateTime createdAt } class PaymentStatus { <> PENDING SUCCESS FAILED REFUNDED } PaymentService --> PaymentRepository : uses PaymentRepository <|.. JpaPaymentRepository : implements PaymentService --> Payment : creates Payment --> PaymentStatus : has

关系符号速查:

A <|-- B    继承(B 继承 A)
A *-- B     组合(A 包含 B,强依赖)
A o-- B     聚合(A 包含 B,弱依赖)
A --> B     关联
A ..> B     依赖
A <|.. B    实现接口

2.4 状态图 (State Diagram) —— 状态机必备

stateDiagram-v2 [*] --> Created: 创建订单 Created --> Paying: 发起支付 Paying --> Paid: 支付成功 Paying --> PayFailed: 支付失败 PayFailed --> Paying: 重试支付 PayFailed --> Cancelled: 超时取消 Paid --> Shipping: 发货 Shipping --> Delivered: 确认收货 Delivered --> Completed: 完成 Paid --> Refunding: 申请退款 Refunding --> Refunded: 退款成功 Created --> Cancelled: 取消订单 Cancelled --> [*] Completed --> [*] Refunded --> [*] note right of Paying 支付超时时间:30分钟 end note

2.5 ER 图 (Entity Relationship Diagram) —— 数据库设计

erDiagram USER ||--o{ ORDER : places USER { bigint id PK varchar username UK varchar email UK varchar password_hash timestamp created_at } ORDER ||--|{ ORDER_ITEM : contains ORDER { bigint id PK bigint user_id FK varchar order_no UK decimal total_amount enum status timestamp created_at } ORDER_ITEM }|--|| PRODUCT : references ORDER_ITEM { bigint id PK bigint order_id FK bigint product_id FK int quantity decimal unit_price } PRODUCT ||--o{ INVENTORY : has PRODUCT { bigint id PK varchar name varchar sku UK decimal price text description } INVENTORY { bigint id PK bigint product_id FK int quantity varchar warehouse }

关系符号:

||--||  一对一
||--o{  一对多
}|--|{  多对多

三、进阶图表

3.1 甘特图 (Gantt) —— 项目排期

gantt title 支付系统重构项目排期 dateFormat YYYY-MM-DD section 需求分析 需求调研 :done, req1, 2024-01-01, 7d 需求评审 :done, req2, after req1, 3d section 技术设计 架构设计 :done, des1, after req2, 5d 数据库设计 :done, des2, after req2, 4d 接口设计 :active, des3, after des1, 3d section 开发阶段 核心模块开发 :dev1, after des3, 14d 接口对接 :dev2, after dev1, 7d section 测试上线 联调测试 :test1, after dev2, 5d UAT测试 :test2, after test1, 5d 生产发布 :milestone, after test2, 1d

3.2 饼图 (Pie Chart) —— 数据占比

pie showData title 系统故障原因分布 "代码Bug" : 35 "配置错误" : 25 "第三方服务" : 20 "网络问题" : 12 "不可抗力" : 5 "玄学问题" : 3

3.3 Git 图 (Git Graph) —— Git 流程

gitGraph commit id: "init" branch develop checkout develop commit id: "feature-1" commit id: "feature-2" branch feature/payment checkout feature/payment commit id: "payment-api" commit id: "payment-service" checkout develop merge feature/payment checkout main merge develop tag: "v1.0.0" checkout develop commit id: "hotfix" checkout main merge develop tag: "v1.0.1"

3.4 思维导图 (Mindmap)

mindmap root((Mermaid)) 基础图表 流程图 时序图 类图 高级图表 状态图 ER图 甘特图 特殊图表 饼图 Git图 思维导图 使用场景 技术文档 架构设计 需求分析 项目管理

3.5 架构图示例:微服务支付系统

graph TB subgraph client["客户端"] App[移动App] Web[Web端] end subgraph gateway["网关层"] Kong[Kong Gateway] Auth[认证服务] end subgraph services["业务服务"] Payment[支付服务] Order[订单服务] Account[账户服务] Notify[通知服务] end subgraph mq["消息队列"] Kafka[(Kafka)] end subgraph storage["存储层"] MySQL[(MySQL)] Redis[(Redis)] ES[(Elasticsearch)] end subgraph external["外部服务"] Bank[银行接口] SMS[短信服务] end App --> Kong Web --> Kong Kong --> Auth Kong --> Payment Kong --> Order Payment --> Account Payment --> Kafka Order --> Kafka Kafka --> Notify Payment --> MySQL Account --> MySQL Payment --> Redis Order --> Redis Notify --> ES Payment --> Bank Notify --> SMS style Kong fill:#4ecdc4 style Kafka fill:#ffe66d style MySQL fill:#ff6b6b

3.6 架构图

architecture-beta group api(cloud)[Cloud VPC] service server(server)[Web Server] in api service db(database)[Database] in api service cache(disk)[Redis Cache] in api service internet(internet)[Internet] internet:R -- L:server server:R -- L:db server:B -- T:cache

3.7 kanban

kanban column1[To Do] task1[Task 1] task2[Task 2] column2[In Progress] task3[Task 3]

四、实用技巧

4.1 样式美化

graph LR A[默认样式] --> B[自定义样式] C[成功] --> D[警告] --> E[错误] style A fill:#f9f9f9,stroke:#333,stroke-width:2px style B fill:#4ecdc4,stroke:#2a9d8f,stroke-width:2px,color:#fff style C fill:#52c41a,color:#fff style D fill:#faad14,color:#fff style E fill:#ff4d4f,color:#fff

样式属性:

fill        背景色
stroke      边框色
stroke-width 边框宽度
color       文字颜色

4.2 使用 FontAwesome 图标

graph LR A[fa:fa-user 用户] --> B[fa:fa-server 服务器] B --> C[fa:fa-database 数据库]

4.3 添加链接

graph LR A[点击跳转] --> B[普通节点] click A "https://mermaid.js.org" "Mermaid 官网"

4.4 子图嵌套

graph TB subgraph outer["外层"] subgraph inner1["内层1"] A[节点A] end subgraph inner2["内层2"] B[节点B] end inner1 --> inner2 end

五、踩坑指南:从入门到放弃的 N 个理由

经过大量实践,我总结了 Mermaid 让人想放弃的几个坑:

5.1 坑一:中文 ID 问题

错误写法:

graph LR
    subgraph 读取数据
        A[JSON]
    end
    style 读取数据 fill:#f00   # 报错!

正确写法:

graph LR
    subgraph read["读取数据"]
        A[JSON]
    end
    style read fill:#f00       # 正常!

规则:ID 用英文,显示文本用 ["中文"]

5.2 坑二:特殊字符转义

错误写法:

A[查询 user_id > 100 的数据]   # > 会被解析成箭头

正确写法:

A["查询 user_id > 100 的数据"]  # 用引号包裹

需要转义的字符: >, <, {, }, |, #

5.3 坑三:Subgraph 样式兼容性

部分渲染器不支持对 subgraph 使用 style:

# 可能不生效
style mySubgraph fill:#f00

替代方案:使用 CSS 类或接受默认样式

5.4 坑四:自引用循环

某些渲染器不支持:

subgraph A
    ...
end
A --> A   # 可能报错

替代方案:使用内部节点连接

subgraph A
    node1 --> node2
    node2 --> node1
end

5.5 坑五:渲染器差异

graph TD A[同一份代码] --> B{不同渲染器} B --> C[GitHub: 正常] B --> D[Typora: 正常] B --> E[某些工具: 报错] B --> F[另一些: 样式丢失] style E fill:#ff6b6b,color:#fff style F fill:#faad14,color:#fff

建议:以 GitHub 渲染结果为准,它的兼容性最好

5.6 坑六:版本兼容性地狱

这是最让人崩溃的坑:不同客户端内置的 Mermaid 版本不同,语法支持也不同

graph TB subgraph versions["Mermaid 版本分布"] V8["v8.x
老旧客户端"] V9["v9.x
部分工具"] V10["v10.x+
最新特性"] end subgraph features["语法支持情况"] F1["mindmap
v9.3+"] F2["quadrantChart
v9.4+"] F3["sankey
v10.0+"] F4["packet
v10.5+"] end V8 -.->|不支持| F1 V8 -.->|不支持| F2 V9 -->|支持| F1 V9 -->|支持| F2 V10 -->|支持| F3 V10 -->|支持| F4

各平台 Mermaid 版本参考(截至 2024 年):

平台内置版本常见问题
GitHub较新基本都支持
GitLab中等mindmap 可能不支持
Typora取决于版本老版本很多语法不认
Notion中等部分高级图表不支持
Obsidian插件决定更新插件可解决
IDEA插件决定插件版本很重要
Confluence较老很多新语法不支持

血泪教训:

# 你在 Mermaid Live Editor 写的(v10.6)
sankey-beta
    Agricultural 'waste',Bio-conversion,124.729

# 扔到 Confluence 一看
❌ Parse error: Unknown diagram type: sankey-beta

解决方案:

  1. 确认目标平台版本:在写图之前,先确认你的目标平台支持哪个版本
  2. 使用保守语法:如果要跨多平台使用,坚持用 flowchart、sequenceDiagram、classDiagram 这些经典图表
  3. 查阅更新日志https://github.com/mermaid-js/mermaid/releases
  4. 本地预览时指定版本:Mermaid Live Editor 可以切换版本测试

5.7 调试工具推荐

  1. Mermaid Live Editor: https://mermaid.live/

    • 实时预览
    • 错误提示清晰
    • 可导出 SVG/PNG
  2. IntelliJ IDEA 插件: Mermaid

    • 插件市场搜索「Mermaid」安装
    • Markdown 文件内实时预览
    • 支持所有 JetBrains IDE(IDEA、WebStorm、PyCharm 等)
    • 配合 Markdown 插件使用体验更佳
  3. VS Code 插件: Markdown Preview Mermaid Support

    • 本地预览
    • 语法高亮

六、最佳实践

6.1 文档规范

## 系统架构

下图展示了支付系统的整体架构:

​```mermaid
graph TB
    ...
​```

> 图 1:支付系统架构图

如图所示,系统分为三层...

6.2 复杂图表拆分

不要把所有内容塞进一张图:

graph LR A[整体架构图] --> B[模块A详细图] A --> C[模块B详细图] A --> D[模块C详细图] style A fill:#4ecdc4,color:#fff

6.3 命名约定

# 推荐
graph LR
    userService[用户服务]
    paymentDB[(支付数据库)]
    
# 不推荐
graph LR
    a[用户服务]
    b[(支付数据库)]

七、Mermaid vs 其他工具

7.1 工具定位象限图

quadrantChart title 图表工具定位对比 x-axis "低学习成本" --> "高学习成本" y-axis "低灵活性" --> "高灵活性" quadrant-1 "专业但复杂" quadrant-2 "理想选择" quadrant-3 "简单但受限" quadrant-4 "性价比低" Mermaid: [0.25, 0.65] PlantUML: [0.45, 0.75] Visio: [0.7, 0.85] "Draw.io": [0.35, 0.7] Excalidraw: [0.2, 0.5] "Visual-Paradigm": [0.8, 0.9] PDManer: [0.3, 0.6] PPT: [0.3, 0.3]

7.2 同类产品详细对比

graph TB subgraph textBased["代码驱动型"] Mermaid["Mermaid
🌟 Markdown 原生"] PlantUML["PlantUML
📚 语法最丰富"] D2["D2
🆕 新起之秀"] Graphviz["Graphviz
👴 老牌经典"] end subgraph guiBased["GUI 驱动型"] DrawIO["Draw.io
🆓 免费好用"] Visio["Visio
💰 企业标配"] VP["Visual Paradigm
🏢 UML 专业户"] Lucid["Lucidchart
☁️ 云端协作"] end subgraph specialized["专业领域型"] PDManer["PDManer
🗄️ 数据库设计"] Excalidraw["Excalidraw
✏️ 手绘风格"] Figma["Figma
🎨 设计为主"] end style Mermaid fill:#4ecdc4,color:#fff style PDManer fill:#ffe66d,color:#333

7.3 全面对比表

特性MermaidPlantUMLDraw.ioVisioVisual ParadigmPDManer
学习曲线⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
Git 友好⚠️⚠️
免费使用
Markdown 集成✅ 原生⚠️ 插件
AI 可生成
流程图✅ 优秀✅ 优秀✅ 优秀✅ 优秀✅ 优秀⚠️ 一般
时序图✅ 优秀✅ 优秀⚠️ 一般✅ 良好✅ 优秀
类图/UML✅ 良好✅ 优秀⚠️ 一般✅ 良好✅ 专业
ER 图⚠️ 简单✅ 良好✅ 良好✅ 良好✅ 专业专业
样式定制⚠️ 有限⚠️ 中等✅ 强大✅ 强大✅ 强大✅ 良好
DDL 生成专业
团队协作⚠️ Git⚠️ Git✅ 云端⚠️ SharePoint✅ 服务器版⚠️ 文件共享
离线使用
跨平台❌ Win/Mac

7.4 使用场景推荐

graph TD Start([需要画图]) --> Type{什么类型的图?} Type -->|流程图/架构图| Flow{需要 Git 管理?} Flow -->|是| Mermaid1[Mermaid ✅] Flow -->|否| DrawIO1[Draw.io] Type -->|时序图| Seq{复杂程度?} Seq -->|简单/中等| Mermaid2[Mermaid ✅] Seq -->|超复杂| PlantUML1[PlantUML] Type -->|UML 全家桶| UML{预算?} UML -->|有预算| VP1[Visual Paradigm] UML -->|免费| PlantUML2[PlantUML] Type -->|ER 图/数据库设计| ER{需要生成 DDL?} ER -->|是| PDManer1[PDManer ✅] ER -->|否/简单展示| Mermaid3[Mermaid] Type -->|手绘风格| Excali[Excalidraw] Type -->|给老板看| PPT[PPT/Keynote] style Mermaid1 fill:#4ecdc4,color:#fff style Mermaid2 fill:#4ecdc4,color:#fff style Mermaid3 fill:#4ecdc4,color:#fff style PDManer1 fill:#ffe66d,color:#333

7.5 代码驱动工具语法对比

同一张时序图,不同工具的写法:

Mermaid:

sequenceDiagram
    Client->>Server: Request
    Server-->>Client: Response

PlantUML:

@startuml
Client -> Server: Request
Server --> Client: Response
@enduml

D2:

Client -> Server: Request
Server -> Client: Response

Mermaid 胜在 Markdown 原生支持,PlantUML 胜在 语法更丰富,D2 胜在 语法最简洁


八、总结:什么时候该放弃?

说了这么多,Mermaid 确实不是万能的。

继续使用 Mermaid 当:

  • 画技术文档中的流程图、时序图、架构图
  • 需要版本控制和协作
  • 追求效率而非极致美观
  • 图表需要频繁修改
  • 让 AI 帮你快速生成图表

考虑放弃 Mermaid 当:

  • 需要高度定制化的视觉设计
  • 给非技术人员看的宣传图
  • 需要复杂的布局控制
  • 图表元素超过 50 个(会很乱)
  • 复杂的 ER 图和数据库设计(下面重点说)

8.1 Mermaid 的 ER 图:能用,但仅限于「能用」

Mermaid 的 erDiagram 语法简洁,画个简单的实体关系没问题:

erDiagram USER ||--o{ ORDER : places ORDER ||--|{ ORDER_ITEM : contains

但是,当你的数据库设计进入实战阶段,Mermaid 就歇菜了:

graph TD subgraph mermaidCan["Mermaid 能做的"] A[展示实体关系] B[简单字段定义] C[PK/FK 标注] end subgraph mermaidCant["Mermaid 做不到的"] D[生成 DDL 语句] E[多数据库方言支持] F[索引设计] G[字段注释/备注] H[版本对比] I[逆向工程] J[数据字典导出] end style mermaidCan fill:#4ecdc4,color:#fff style mermaidCant fill:#ff6b6b,color:#fff

8.2 复杂 ER 图的正确打开方式:PDManer

如果你需要正经做数据库设计,推荐使用 PDManer(原 PDMan):

功能MermaidPDManer
可视化 ER 图
字段详细定义⚠️ 基础✅ 完整(类型、长度、默认值、注释)
生成 DDL✅ MySQL/PostgreSQL/Oracle/SQLServer...
生成代码✅ Java/C#/Go 实体类
版本管理✅ 内置版本对比
逆向工程✅ 从数据库导入
数据字典✅ Word/Markdown/HTML 导出
团队协作Git 管理文本Git 管理 JSON

PDManer 的 ER 图长这样:

┌─────────────────────────────────────────────┐
│ t_user                                       │
├─────────────────────────────────────────────┤
│ 🔑 id          BIGINT        主键           │
│    username    VARCHAR(50)   用户名 UK      │
│    email       VARCHAR(100)  邮箱           │
│    created_at  TIMESTAMP     创建时间       │
│ 📇 idx_email                 索引           │
└─────────────────────────────────────────────┘
          │
          │ 1:N
          ▼
┌─────────────────────────────────────────────┐
│ t_order                                      │
├─────────────────────────────────────────────┤
│ 🔑 id          BIGINT        主键           │
│ 🔗 user_id     BIGINT        用户ID FK      │
│    order_no    VARCHAR(32)   订单号 UK      │
│    amount      DECIMAL(12,2) 金额           │
└─────────────────────────────────────────────┘

然后一键生成:

  • MySQL DDL
  • PostgreSQL DDL
  • Java Entity
  • 数据字典文档

这才是数据库设计该有的样子。

8.3 决策流程图

graph TD Start([需要画图]) --> Q1{是技术文档?} Q1 -->|否| Other[用 Figma/PPT] Q1 -->|是| Q2{什么类型?} Q2 -->|流程图/架构图/时序图| Q3{需要频繁修改?} Q3 -->|是| Mermaid[用 Mermaid ✅] Q3 -->|否| Q4{追求美观?} Q4 -->|是| DrawIO[用 Draw.io] Q4 -->|否| Mermaid Q2 -->|ER图/数据库设计| Q5{复杂程度?} Q5 -->|简单展示关系| Mermaid2[用 Mermaid] Q5 -->|正经数据库设计| PDManer[用 PDManer ✅] Q2 -->|完整UML建模| VP[用 Visual Paradigm] style Mermaid fill:#4ecdc4,color:#fff style Mermaid2 fill:#4ecdc4,color:#fff style PDManer fill:#ffe66d,color:#333 style Other fill:#ff6b6b,color:#fff style DrawIO fill:#ffe66d,color:#333

一句话总结:

Mermaid 是技术文档的最佳拍档,但不是数据库设计的专业工具

该用 Mermaid 时用 Mermaid,该用 PDManer 时别硬撑。


九、参考资源

Mermaid 相关:

数据库设计工具:

其他图表工具:


后记

写完这篇文章,我用 Mermaid 画了 20+ 张图,没有打开任何绘图软件,全程在 Markdown 编辑器里完成。

这就是 Mermaid 的魅力:让画图回归写代码的感觉

当然,它的坑也确实不少。但作为一个程序员,比起用鼠标拖拽对齐,我宁愿多背几个语法、多踩几个坑。

毕竟,能用代码解决的问题,就不要用鼠标

这大概就是为什么我还没放弃 Mermaid 的原因吧。


——Joey,写于又一次被 Mermaid 渲染器坑了之后

评论区
暂无评论
avatar