用 mermaid 在文章里画图
有些东西用文字讲很绕,画一张图最快。生成器现在支持 mermaid:把代码块的围栏语言标成 mermaid,里面照常写图表定义,页面加载时会自动渲染成矢量图。
下面拿三种常用图各演示一个,顺便当语法示例。
流程图
flowchart TD
A[写下 markdown] --> B{围栏语言是 mermaid?}
B -->|是| C[输出图容器 + pre.mermaid]
B -->|否| D[照旧输出代码块]
C --> E[浏览器端渲染成 SVG]
D --> F[原文显示]
时序图
sequenceDiagram participant R as 读者 participant P as 页面 participant M as mermaid.js R->>P: 打开文章 P->>M: 按需加载脚本 M->>M: 解析图表定义 M-->>P: 替换成内联 SVG P-->>R: 看到图
状态图
stateDiagram-v2 [*] --> idle idle --> rendering: initialize() rendering --> done: 生成 SVG rendering --> failed: 语法有误 failed --> idle: 保留源码可读
实现上的几个取舍
- 只在有图表的页面加载脚本。mermaid 压缩后 3.4MB,放在列表页和标签页上纯属浪费,所以解析阶段就记下「这篇有没有图」,没有的页面一个字节都不下发。
- 库跟站点一起发布,不走公共 CDN。内网和离线环境照样能显示,也不把读者的访问记录交给第三方。
- 主题跟随系统。深色模式用暗色主题,浅色模式用默认主题——否则深色页面上会突然出现一块白底流程图。
- 没有 JavaScript 时优雅降级。脚本没跑起来的话,看到的是图表源码而不是一片空白。
图比卡片宽的时候会等比缩到容器内,手机上不会被撑破。