本文档描述了 Mermaid.js 中的核心渲染管道,它将基于文本的图表定义转换为可视化的 SVG 输出。渲染管道涵盖了从初始图表文本输入到解析、布局计算和最终 SVG 渲染的完整流程。
有关图表类型检测的具体信息,请参阅图表类型检测。
渲染管道是处理图表定义并生成可视化输出的核心机制。它涉及几个关键阶段:
来源:packages/mermaid/src/mermaidAPI.ts306-475 packages/mermaid/src/Diagram.ts17-46
渲染管道涉及协同工作的几个核心组件:
来源:packages/mermaid/src/mermaidAPI.ts534-552 packages/mermaid/src/Diagram.ts16-67 packages/mermaid/src/diagram-api/types.ts68-92
渲染管道主要在 mermaidAPI.ts 的 render 函数中实现。以下序列图说明了渲染过程中发生的详细步骤:
来源:packages/mermaid/src/mermaidAPI.ts306-475 packages/mermaid/src/Diagram.ts17-46 packages/mermaid/src/diagram-api/detectType.ts36-51
当渲染过程开始时,系统首先处理图表文本中的所有配置指令并应用它们。
processAndSetConfigs(text) {
const processed = preprocessDiagram(text);
configApi.reset();
configApi.addDirective(processed.config ?? {});
return processed;
}
来源:packages/mermaid/src/mermaidAPI.ts54-59
系统使用 Diagram.fromText 方法创建一个新的图表实例,该方法会执行以下操作:
来源:packages/mermaid/src/Diagram.ts17-46
图表创建后,系统会为图表生成 CSS 样式:
createCssStyles 根据配置和类定义生成样式getStyles 检索图表特有的样式来源:packages/mermaid/src/mermaidAPI.ts110-172 packages/mermaid/src/styles.ts7-102
通过调用渲染器的 draw 方法来绘制图表。
渲染器会执行以下操作:
来源:packages/mermaid/src/mermaidAPI.ts425-426 packages/mermaid/src/diagram-api/types.ts116-121
绘制完成后,会进行几个后处理步骤:
来源:packages/mermaid/src/mermaidAPI.ts183-204 packages/mermaid/src/mermaidAPI.ts522-530
渲染管道实施了多项安全措施:
| 安全级别 | 行为 |
|---|---|
| "sandbox"(沙盒) | SVG 在具有受限权限的沙盒 iframe 中渲染 |
| "loose"(宽松) | SVG 直接渲染,不进行净化处理 |
| 默认 | SVG 使用 DOMPurify 进行净化以防止 XSS 攻击 |
安全级别可以作为 Mermaid 配置的一部分进行设置。
来源:packages/mermaid/src/mermaidAPI.ts33-35 packages/mermaid/src/mermaidAPI.ts453-460
mermaid.ts 中的 mermaid.render() 函数是渲染管道的公共 API。此函数会执行以下操作:
mermaidAPI.render() 执行实际渲染来源:packages/mermaid/src/mermaid.ts392-416
渲染管道是一个复杂的流程,负责处理从文本到可视化图表的转换。它涉及图表类型检测、解析、样式化、布局计算和渲染,并额外考虑了安全性和辅助功能。
这种架构使 Mermaid 能够通过一致的接口支持各种图表类型,同时保持灵活性和可扩展性。