Typora+Mermaid文本绘图:流程图、时序图、甘特图实战
2026/9/17 11:45:12 网站建设 项目流程

1. Typora画图这件事,底层到底靠什么跑起来

第一次见到有同事在 Typora 里敲几行像伪代码的东西,一按回车就出来一张带箭头、带分支的流程图,我当时的反应是"这不科学"。后来把它的渲染链路摸清楚才发现,Typora 本身并不绘图,它只是一个 Markdown 编辑器,真正干活的是一套叫Mermaid的文本绘图引擎,被内置进了编辑器的代码块渲染管线里。你写的是字符串,它把你的字符串解析成图形描述语言,再交给渲染层画出 SVG,贴进编辑器里。流程图、时序图、顺序图、甘特图、类图、状态图、饼图,全都是同一套引擎的不同语法分支。

这套机制的价值在于:图形和文档躺在同一个.md文件里,纯文本、可 diff、可版本管理。别人改了你一个节点名字,git 上一眼就能看出来改的是哪一行,而不是像拖拽出来的二进制图形文件那样,只能看到"文件已变更"四个字。做需求文档、毕业设计、系统设计说明的时候,这一点非常要命。

1.1 Mermaid引擎的渲染机制与开启方式

Typora 内置 Mermaid 是默认开启的,但版本差异会让渲染表现不同。你要做的第一步是确认开关:打开偏好设置 → Markdown → 图表(Diagrams),确认勾选状态。有些老版本放在"语法支持"区域,名字可能叫 Mermaid,勾上就完事。关闭状态下,你写的代码块只会显示成一堆带背景色的死文本,很多人以为是语法写错了,其实只是开关没开。

开启之后,输入三个反引号加语言标记mermaid,按回车,Typora 会自动补一段代码块骨架,光标落在中间。你把图形描述写进去,退出代码块(光标移到块外)的那一瞬间,图形就渲染出来了。这个"移出即渲染"的行为值得记住,新手经常在块里盯着源码纳闷为什么不显示图。

编辑器左上角有个源码模式切换按钮,切过去能看到原始字符,切回来又是图。写复杂图的时候建议保持在源码模式里调,渲染后再切回来验收,否则每次都要点进块里改,来回跳很累。另外要注意,渲染出来的图是 SVG,可以右键复制图片,也可以整体导出。

1.2 为什么我推荐用文本绘图,而不是拖拽式工具

拖拽式绘图工具上手确实快,但用到中后期会撞墙。我踩过的坑集中在三处:

  • 改一处要动全身。节点一多,拖动一个框,所有连线跟着乱跑,对齐、避让、重排。改十次需求,等于重画十次图。
  • 版本管理几乎失效。图形文件是压缩过的二进制,diff 出来毫无意义,多人协作只能靠"谁最后保存谁说了算"。
  • 风格不统一。三个人画出三种颜色三种圆角,放进同一份文档里像拼贴画。

文本绘图把这些问题一次性解决。样式统一靠classDef和主题配置,改版靠改文字,协作靠 git 合并。代价是你要花两三个小时记语法——而这正是这篇内容存在的理由。我更倾向于把 Mermaid 当成"画图的快捷键",而不是"画图软件":日常结构图、流程、排期、交互,它能覆盖八成需求;真要画复杂的架构大图、精细的电路时序,再换专业工具补位。

1.3 环境准备与授权问题的现实处理

环境上没什么可折腾的:官网下载安装包,Windows 是 exe,macOS 是 dmg,装完直接能用。不建议去折腾来路不明的第三方打包版本,我见过有人装到的版本被塞了额外的启动脚本,编辑器还莫名其妙往外发请求,写文档的工具反倒成了风险源。

关于授权,说句实在话:Typora 的免费试用期过了之后,启动时会弹出提醒窗口。这个弹窗是授权校验机制在起作用,属于正常商业软件的提醒,不是什么故障。正规做法是购买许可证,学生身份通常可以申请教育优惠价格,一个授权可以激活若干台自己的设备,对个人用户来说成本并不高。至于网上流传的各种"免费序列号""激活工具""一直弹窗怎么关"的方案,我不建议碰——轻则激活后反复弹窗、授权状态不稳定,重则替换了程序核心文件,后续升级直接报错甚至数据丢失。写作环境最重要的是稳定,为了省一笔小钱把文档工具搞成半残状态,不划算。

装好之后建议顺手做两件事:把默认主题换成自己喜欢的(偏好设置 → 外观 → 打开主题文件夹),再在"图像"设置里配置好图片保存路径,把粘贴进来的图片自动复制到./assets之类的相对目录,这样整个文档目录可以整体打包带走,不会出现"图挂了一堆红叉"。

2. 流程图:从最简骨架到复杂分支的完整实操

流程图是使用频率最高的一类。我见过它出现在需求评审、毕业设计、工艺说明、审批链路说明各种场合。它的语法结构其实只有三层:声明方向、定义节点、连接节点。搞懂这三层,剩下的都是形状和样式的排列组合。

2.1 方向声明与节点定义的基本写法

图的第一行决定整体布局方向,写法是graph加上方向缩写,或者用flowchart加上方向缩写,两个关键字在大部分场景下可以互换,但flowchart支持更完整的子图与样式能力,新写的图我建议统一用flowchart,少踩兼容性的坑。

方向缩写一共五个:TDTB表示从上到下,BT从下到上,LR从左到右,RL从右到左。业务流程图一般用TD,因为它读起来像文档的自然顺序;而"输入→处理→输出"这种横向链路,用LR视觉上更紧凑。

节点定义的最小形式是给一个标识符然后跟文案,标识符是内部用的变量名,文案是显示出来的中文或英文。标识符尽量用英文或拼音,避免中文和空格,这是我早期踩坑最多的地方:一个中文标识符在复杂图里引发的解析报错,能让你排查半小时。

flowchart TD A[开始] --> B[读取输入] B --> C{校验通过?} C -->|是| D[写入数据] C -->|否| E[返回错误] D --> F[结束] E --> F

这段不到十行,就是一张完整的判断分支流程图。你需要理解的重点是:节点第一次出现时定义形状,之后再用只写标识符即可,不需要重复写文案。如果重复写了不同文案,后面的会覆盖前面的定义,图形位置也会变,这是很多人"明明定义了两个节点却只显示一个"的原因。

2.2 流程图各种框的含义与形状对照

形状不是随便选的,它承载语义。工程文档里如果形状用错,评审的时候会被直接挑出来。我把常用形状和它的标准含义整理成一张对照表,写流程图前扫一眼就不会出错。

语法写法形状名称标准语义
A[文案]矩形处理步骤、普通操作
A(文案)圆角矩形起止节点、状态入口
A([文案])体育场形终止、结束点
A[[文案]]子程序框调用子流程、函数
A[(文案)]圆柱形数据库、数据存储
A((文案))圆形连接点、聚合点
A{文案}菱形条件判断、分支
A{{文案}}六边形准备、初始化
A[/文案/]平行四边形数据输入输出
A[\文案\]反向平行四边形数据输入输出(反向)
A>文案]非对称形注释、标记

我个人的经验是,一张业务流程图里最多出现三到四种形状:圆角矩形做起止、矩形做操作、菱形做判断、平行四边形做输入输出。形状过多会让图变成"符号大杂烩",阅读成本反而上升。只有涉及数据库交互时才加圆柱形,涉及独立子流程时才加子程序框。

毕业设计里的"图书管理系统流程图""用户管理模块流程图"这类图,基本可以套用同一个骨架:登录校验 → 权限判断 → 主循环 → 增删改查分支 → 数据落库 → 退出。区别只在于分支数量。把形状用对,评审老师那一关就稳了一半。

2.3 连线类型、文字标注与样式美化

连线是流程图的骨架。常用的就几种:实线箭头-->、无箭头实线---、虚线箭头-.->、粗线箭头==>。加上文字标注有两种写法,一种是把文字塞在箭头中间--文字-->,另一种是用竖线包裹-->|文字|我习惯用竖线括号的写法,因为箭头带文字的语法对中文支持偶尔抽风,竖线写法更稳。

双向关系用<-->,圆形端点用o--o,叉形端点用x--x。跨层级的长连线很容易把图搅乱,这时候子图就派上用场了。subgraph可以把一组节点圈起来并加标题,适合表达"前端层""服务层""数据层"这种分层结构,也可以把图按模块拆开,让主流程干净清爽。

样式方面,classDef定义样式类,class把类挂到节点上,linkStyle按连线序号改线的颜色和粗细。样式不要滥用,我的原则是:只给三类节点上色——成功路径、异常路径、外部系统。颜色超过三种,图就开始显得业余。

flowchart LR subgraph 前端 A([用户操作]) --> B[表单校验] end subgraph 服务端 B --> C{业务规则} C -->|通过| D[(写入库表)] C -->|拒绝| E[返回提示] end classDef ok fill:#d4edda,stroke:#28a745 classDef bad fill:#f8d7da,stroke:#dc3545 class D ok class E bad

这段代码同时用到了子图、形状、分支文字和样式类,是一个可以直接拿去改名的模板。把子图标题换成你自己的分层名,把节点文案换掉,就是一张能进正式文档的图。

2.4 实战:一张用户管理模块流程图的完整拆解

拿一个真实场景走一遍。假设要画"用户管理模块"的操作流程,需求是:管理员登录后能查询、新增、修改、禁用用户,所有写操作要记日志。

第一步先想清楚主干。主干是"登录 → 鉴权 → 进入管理页 → 选择操作",这一步用TD方向就能表达。第二步想清楚分支:查询是只读,新增要校验手机号唯一,修改要判断用户是否存在,禁用要考虑是否最后一个管理员。第三步想清楚异常:所有分支失败都汇入统一的错误处理节点。

写完主干之后再补细节,比一开始就堆节点效率高得多。新手最容易犯的错是把异常分支全画在主线上,图会变得又宽又乱。正确做法是异常节点单独放在一侧,用虚线连过去,视觉上就能区分主流程和异常流。

还要提一句流程图的方向微调。flowchart TDflowchart LR有时候换一下,图的宽高比会舒服很多。排版进 A4 页面的时候,横向过宽的图在导出 PDF 时会被压缩得很小,这时候把方向改成TD或拆成两张图,阅读体验会明显改善。这个细节我在写需求文档时被排版问题折磨过好几次才总结出来。

最后是节点文案的长度控制。一个节点里塞二十个字,框会被撑得很长,整体比例失调。我的处理办法是把长文案拆成"动作 + 对象"两段,比如把"校验用户提交的手机号是否已被占用"改成"校验手机号唯一性",必要信息保留,冗余修饰删掉。图是给人快速扫的,不是给人逐字读的。

3. 时序图:把"谁先调用谁"这件事讲明白

时序图和流程图解决的是两类完全不同的问题。流程图回答"按什么顺序处理",时序图回答"哪个角色在哪一刻向谁发了什么消息,等了多久,返回了什么"。接口联调、协议分析、框架调用链梳理,时序图的表达效率是最高的。Typora 里同样用代码块渲染,关键字是sequenceDiagram

3.1 参与者声明、消息类型与激活条

图的第二行开始声明参与者。写法是participant 标识符 as 显示名,也可以用actor代替participant,画出来就是个小人图标,适合表示真实用户。参与者的声明顺序决定它们在图上的左右排列顺序,这一点要提前想好,因为顺序错了,消息线会交叉成一团麻。

消息类型有五种常用写法:->>实线加实心箭头,表示同步调用;-->>虚线箭头,表示返回;-)表示异步消息,箭头是开放的;->只有线没有箭头,表示不关心返回的单向消息;-x表示消息丢失或异常中断。同步调用配虚线返回是最规范的写法,看的人一眼就知道哪段是请求、哪段是响应。

激活条用activatedeactivate成对出现,表示某个参与者在这段时间内处于处理状态。它最大的作用是让读者一眼看出"谁在忙"。状态机、请求转发链这类图里,激活条几乎是必加的,没有激活条的时序图看起来会很平。

序号可以用autonumber自动生成,写在第一行声明之后。加了之后每条消息前面会带上递增数字,评审的时候可以直接说"第 5 步这里有问题",沟通效率很高。

3.2 循环、条件、并行与注释的使用场景

时序图真正强大的地方在于它能把控制结构画进去。loop表示循环,altelse表示分支,opt表示可选分支,parand表示并行,critical表示关键区段,break表示中断退出。

我用得最多的是altloop。比如登录流程里"密码错误"和"密码正确"是典型的分支,用alt包起来,图标里会画出分割线;重试逻辑用loop包起来,会画成一个带标签的框。但要注意别把控制结构嵌太深,三层嵌套的时序图基本没法读,这时候应该拆成两张图,主图只画成功路径,异常路径单独出一张。

注释用Note overNote right ofNote left ofNote over A,B表示横跨两个参与者的注释,用来解释一段交互的整体意图。我的习惯是在关键节点上挂注释,说明"这里为什么要加一次校验""这个字段是做什么用的",因为时序图本身只表达"发生了什么",不表达"为什么"。

线的样式还可以进一步区分,比如把跨系统的调用统一用虚线,系统内部的调用用实线。这个约定在跨团队评审时特别有用,一眼就能看出哪些是外部依赖、哪些是内部逻辑。

3.3 实战:一个请求链路的时序图写法

拿最常见的登录链路举例。参与者有用户、前端页面、服务端接口、认证服务、数据库。顺序按调用先后排:用户 → 前端 → 接口 → 认证 → 数据库。

sequenceDiagram autonumber actor U as 用户 participant W as 前端页面 participant S as 服务端接口 participant A as 认证服务 participant D as 数据库 U->>W: 输入账号密码并提交 W->>S: POST 登录请求 activate S S->>A: 校验凭据 activate A A->>D: 查询账号记录 D-->>A: 返回账号与密码摘要 alt 凭据匹配 A-->>S: 校验通过并签发令牌 S-->>W: 返回登录成功 W-->>U: 跳转首页 else 凭据不匹配 A-->>S: 校验失败 S-->>W: 返回错误提示 W-->>U: 显示"账号或密码错误" end deactivate A deactivate S

这张图有几个值得说的处理:一是激活条只加在服务端和认证服务上,前端不加,因为它们是被动响应,加了反而让图变乱;二是用alt把成功和失败两条路径并排画出来,比两张图更省空间;三是每条消息的文案都写成"动作 + 数据",读者能直接看出传了什么。

写接口文档的时候,我会在时序图下面紧跟着放接口字段表,图和表互相印证。光有图没有字段说明,对接方还是要来问你,这一步补上,沟通成本能省一大截。

4. 甘特图:项目排期可视化的低成本方案

甘特图在 Typora 里的存在感比时序图低,但实用性被严重低估。项目排期、学习计划、内容排产、装修进度,都能用它表达。它的语法比前两种更接近"表格式"思维:日期格式、标题、任务段落、任务条目。

4.1 语法结构与任务状态的表达

起始写法是gantt关键字,然后依次声明titledateFormataxisFormatexcludesdateFormat决定你后续写日期时用什么格式,常用的是YYYY-MM-DDaxisFormat决定横轴显示成什么样,比如%m-%d就只显示月和日;excludes用来排除周末或指定日期,写excludes weekends就能让排期跳过周六日。

任务写在section里,一个 section 就是一组。每个任务的基本格式是"任务名 : 状态, 标识符, 开始日期, 持续时间"。状态有四种写法:不写表示待开始,done表示已完成,active表示进行中,crit表示关键任务(渲染成红色高亮),milestone表示里程碑(渲染成菱形)。

持续时间用30d2w1m这种单位,d 是天,w 是周,m 是月。如果同时写了开始日期和持续时间,引擎按这个算;如果只写持续时间,它会接在上一任务后面,这个特性在快速排期时很好用,但也很容易因为漏写日期导致整条排期错位,我建议还是把日期写全。

4.2 依赖关系、里程碑与分段任务

依赖关系是甘特图的灵魂。写法是不写开始日期,而是写after 任务标识符,表示这个任务排在另一个任务结束之后。这里有个坑:after后面必须跟标识符,不是任务名。标识符是你在任务定义里起的那个短名字,任务名是显示给人看的中文。新手经常把中文任务名写进after里,然后发现图渲染不出来或者依赖没生效。

里程碑用milestone标记,画出来是一个菱形点,适合标"需求评审通过""首次上线"这种零时长的关键节点。它不占时间,所以日期写哪一天就在哪一天。

分段任务指的是把一个任务拆成若干段,语法上写多个同名任务、多条日期,或者直接用多个任务条目串起来。我在实际使用中不太用分段,而是把大任务拆成几个子任务放进同一个 section,这样每段可以独立标状态,进度更新更直观。

关键路径用crit标出来。项目的关键路径往往只有几条任务,标红之后一眼就能看到"哪几条拖了,整个项目就拖了"。这个功能在做项目汇报的时候非常讨巧。

4.3 实战:一个月迭代排期的排法

假设一个为期四周的迭代,从某月 1 日开始,包含需求、设计、开发、测试、上线五个阶段,中间有个里程碑。

gantt title 单迭代排期 dateFormat YYYY-MM-DD axisFormat %m-%d excludes weekends section 前期 需求梳理 :done, req, 2024-03-01, 3d 方案设计 :active, dsg, after req, 4d section 开发 接口开发 :crit, dev1, after dsg, 6d 前端联调 : dev2, after dev1, 4d section 验收 测试回归 : tst, after dev2, 3d 灰度上线 :milestone, m1, after tst, 0d

排期图的第一价值不是好看,而是暴露冲突。我通常会把这张图和实际进度表对照着看,哪个任务标了done但实际没完成,说明进度同步出了问题;哪条关键路径没有缓冲,说明这个排期是乐观估计。图中用excludes weekends之后,你会直观看到实际工作日和自然日的差距,这对跨周排期很重要。

另外提醒一点:甘特图的日期粒度别太细。按小时排的甘特图在文本绘图里维护成本极高,改一次要动十几个条目。排期粒度按天就够了,真要细化到小时,应该放到看板工具里。

5. 顺带能画的其他图:类图、状态图、饼图与硬件时序

除了上面三类,Mermaid 还支持一批高频图表。写系统设计文档的时候,这些图能让你不用切换工具就把一份文档写完整。

5.1 类图与关系型结构图

类图用classDiagram声明。类定义写在花括号里,字段和方法各占一行,用+-#表示公开、私有、受保护。关系符号有讲究:<|--是继承,*--是组合,o--是聚合,-->是关联,..>是依赖,..|>是接口实现。这些符号的方向不能写反,空心三角永远指向父类,实心菱形永远指向"整体"那一端。

这套东西还有个变体叫实体关系图,关键字是erDiagram,专门画表和表之间的关系,一对一和一对多都能标。做数据库设计说明的时候,比手画连线图省事太多。

5.2 状态图、饼图与用户旅程

状态图用stateDiagram-v2,起止状态写成[*],中间状态直接写名字,转移写成A --> B: 触发条件。它特别适合描述订单状态、工单状态、审批状态这类"有明确状态机"的业务。复杂状态可以用state 名称 { ... }做嵌套,用choice做条件分支,用forkjoin表示并行状态。

饼图是 Mermaid 里最简单的,pie加标题,然后一行一个标签加冒号加数值,引擎自动算百分比。用户旅程图用journey,能按阶段画出体验评分,做产品复盘时挺好用。

5.3 硬件时序图必须换工具:为什么 Mermaid 画不了

这里必须说清楚一件事,避免有人走弯路。网络上搜"时钟时序图""总线协议时序图"这类关键词的人很多,但要明确:Mermaid 的时序图是"消息交互时序",不是"电平波形时序"。你想画时钟线的高低电平、数据线的建立保持时间、片选信号什么时候拉低,Mermaid 做不到。

这类"真波形图"有专门的工具,比如基于 JSON 描述的波形绘制方案。它的基本思路是用一串字符表示信号的波形变化,不同字符代表高电平、低电平、上升沿、下降沿、高阻态,还可以在波形上叠标记和文字。写 I2C 的起始条件、SPI 的时钟极性相位、总线的握手时序,都适合用它。语法上先定义时钟信号,再定义数据信号,然后加标注和注释文字。

判断标准很简单:如果图里要表达"信号在第几个时钟周期变成高电平",用波形工具;如果要表达"系统 A 在第几步调用了系统 B",用 Mermaid 时序图。这两类图长得像,但语义完全不同,混用会闹笑话。

6. 常见问题与排查技巧实录

写得多了,问题基本集中在固定的几类。我把它们整理成速查表,再补充一些不太容易查到的经验。

6.1 渲染失败与报错速查

现象常见原因处理方式
代码块显示为普通文本图表功能未开启,或语言标记拼错检查偏好设置,确认标记拼写
图不渲染且无提示语法错误被静默吞掉切源码模式逐行排查,先简化再恢复
中文节点报解析错误节点文案含括号、逗号等符号给文案加英文双引号包裹
子图报语法错误子图声明与节点定义顺序混乱先声明子图,再在内部写节点
连线文字不显示连字符与文字之间缺空格补齐空格或改用竖线包裹写法
甘特图依赖不生效after后写了中文任务名改为引用任务标识符
时序图顺序错乱参与者声明顺序与预期不符显式声明全部参与者并排序
导出 PDF 图被截断图宽超出页面调整布局方向或拆图

这张表里最容易被忽略的是"中文特殊符号"这一类。中文文案里带括号、冒号、逗号、斜杠的时候,解析器可能会把它当成语法符号。统一给含特殊符号的文案加双引号,能规避掉九成以上的解析异常。

6.2 排版、居中与导出相关的问题

关于居中,这是被问得最多的一类。图片居中的处理方式,是在图片外面套一层 HTML 容器,给它设置文本居中样式;文字居中同理,用带样式的容器包住段落即可。需要注意的是,这类 HTML 块在部分导出格式里可能失效,导出前最好预览一遍。

表格内容想上下居中,可以给单元格加垂直对齐样式,但在 Markdown 表格里生效情况取决于主题的 CSS。如果要严格控制排版,建议在导出后用其他工具做最终微调,别指望 Markdown 源文件能精确控制到像素级。

导出方面,Typora 支持导出 HTML、PDF、Word、EPUB 等格式。导出 PDF 前建议先切成阅读模式看一遍,确认图表都渲染完成再导,否则偶尔会导出成半成品。导出图片格式时注意分辨率,默认设置下放大后可能发虚,可以在导出选项里调高缩放倍数。

主题定制是另一个进阶玩法。Mermaid 的配色可以通过主题 CSS 变量覆盖,你在主题文件夹里改一次,全文档所有图都跟着变,比自己一个个写classDef高效得多。团队协作时把主题文件一起纳入版本管理,大家的图就能保持同一套视觉规范。

6.3 我踩过的坑与实操心得

一条一条说,都是实际用出来的经验。

第一,图不要画太大。我早期喜欢把整个系统的所有流程塞进一张图,结果渲染出来密密麻麻,导出 PDF 之后字小到看不清。后来改成每张图只讲一件事,图的数量多了,但每张都能读。判断标准是:一张图打印出来,一米外能看清主干

第二,节点命名要统一。同一个概念在不同图里叫不同名字,是文档维护的灾难。我现在会先写一份名词表,所有图的节点文案都从表里取,改的时候全局替换,不会出现"用户中心"和"用户模块"两个名字指同一个东西的情况。

第三,先写文字大纲再画图。直接开画容易陷入细节。我现在的习惯是先用列表把流程写清楚,确认逻辑没有遗漏,再翻译成语法。翻译过程基本是机械劳动,很快,而且不会边画边改结构。

第四,把常用模板存成片段。登录流程、请求链路、迭代排期这几类图,结构高度一致,我存了几个模板文件,新需求来了直接改文案。重复劳动能省则省,把时间花在逻辑梳理上更值。

第五,渲染异常先做二分排查。图突然不显示了,不要盯着整段代码看。把代码块砍掉一半,看还渲不渲染,能渲染说明问题在后半段,不能渲染说明问题在前半段,几轮下来很快定位。这比逐行读到眼花高效得多。

第六,注意编辑器的保存与同步。文档和图都在同一个文件里,文件损坏意味着全丢。我吃过一次亏之后,重要文档都放在版本库目录里,编辑器自动保存加上定期提交,心里踏实。

第七,版本升级后回看一遍旧图。渲染引擎升级偶尔会带来语法兼容变化,老图可能突然报错或样式跑偏。升级完之后把常用文档翻一遍,比在关键时刻掉链子强。

最后再分享一个我常用的处理方式:把图的源码块上面加一行说明文字,写清楚这张图表达什么、更新于什么时间、对应哪个需求编号。图的受众不只是你自己,过两个月回头看,没有这行说明的图,你也不知道当时想说什么。这个习惯看起来琐碎,实际省下来的沟通时间相当可观。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询