Mermaid 核心 API 全解:Mermaid 主对象、MermaidConfig 配置体系与布局扩展接口深度指南
【免费下载链接】mermaidGeneration of diagrams like flowcharts or sequence diagrams from text in a similar manner as markdown项目地址: https://gitcode.com/GitHub_Trending/me/mermaid
本文以 mermaid 项目自动生成的 API 参考索引 docs/config/setup/mermaid/README.md 为骨架,系统梳理 mermaid 包主模块导出的全部接口、类型别名与函数,并结合 packages/mermaid/src/mermaid.ts 的源码实现,讲清mermaid主对象从初始化、解析到渲染的完整调用链路,以及通过MermaidConfig定制渲染行为的配置体系。读完本篇,你将能够独立编写生产级渲染代码、正确迁移被弃用的旧 API,并具备接入外部图表与自定义布局插件的知识储备。
一、这份 API 索引描述的是什么
docs/config/setup/mermaid/README.md 是 mermaid 主模块(即import mermaid from 'mermaid'得到的对象)的 API 总索引。文件头部明确标注它由文档生成脚本自动产出、禁止手工编辑,其内容来源于 packages/mermaid/src/mermaid.ts 中各成员的 JSDoc 注释。索引页将导出成员分为四类:
| 分类 | 数量 | 成员 |
|---|---|---|
| Interfaces(接口) | 18 个 | AsyncIconLoader、CommonLayoutPaintContext、CommonLayoutPaintOptions、CommonLayoutRenderContext、CommonLayoutRendererDefinition、DetailedError、ExternalDiagramDefinition、LayoutData、LayoutLoaderDefinition、Mermaid、MermaidConfig、ParseOptions、ParseResult、RenderOptions、RenderResult、RunOptions、SyncIconLoader、UnknownDiagramError |
| Type Aliases(类型别名) | 6 个 | CommonLayoutMeasure、IconLoader、InternalHelpers、ParseErrorFunction、SVG、SVGGroup |
| Variables(变量) | 1 个 | default(即mermaid主对象本身) |
| Functions(函数) | 4 个 | clearLayoutRenderState、createCommonLayoutRenderer、defaultMeasureLayout、paintLayoutData |
其中绝大多数成员并非在 mermaid.ts 中原生定义,而是通过export type从config.type.js、types.js、diagram-api/types.js、rendering-util/render.js、rendering-util/types.js、utils.js等模块统一再导出(见 mermaid.ts#L25-L56)。这意味着该索引页实际呈现的是mermaid 包对外暴露的公共 API 表面:它既是集成方(Web 应用、Markdown 渲染器、CLI 工具)编程的入口,也是插件作者(图标包、布局引擎、外部图表)扩展能力的契约。
二、Mermaid 接口:主对象的完整方法清单
核心接口Mermaid定义于 packages/mermaid/src/mermaid.ts#L446-L469,详细文档见 docs/config/setup/mermaid/interfaces/Mermaid.md。它声明了主对象的全部属性与方法,可按“生命周期阶段”分为五组:
1. 初始化组:startOnLoad与initialize
startOnLoad: boolean—— 模块级布尔属性,控制是否在页面加载时自动开始渲染。initialize(config: MermaidConfig): void—— 设置 mermaid 全局配置,必须在run之前调用。注意:旧版通过init(config, nodes, callback)传配置的方式已弃用,配置统一收敛到initialize。
从源码结构看,模块在定义主对象时将其初始值硬编码为startOnLoad: true(mermaid.ts#L471-L487),即默认行为是“页面加载即渲染”,集成方需显式调用initialize({ startOnLoad: false })来关闭自动渲染并改用手触发的run。
2. 解析组:parse与detectType
parse(text, parseOptions?)—— 解析图表文本并做语法校验。它有两个调用签名:parse(text, parseOptions):返回Promise<false | ParseResult>。当parseOptions.suppressErrors为true时,解析失败返回false而不是抛出异常;parse(text):解析失败时直接抛出Error。
成功时返回的
ParseResult对象包含diagramType字段,即图表类型键(如flowchart、sequence)。ParseOptions目前只有一个可选字段suppressErrors,定义于 packages/mermaid/src/types.ts#L96-L101,文档见 docs/config/setup/mermaid/interfaces/ParseOptions.md。detectType(text, config?)—— 仅检测图表文本的类型,返回图表定义键。该函数会考虑文本中%%init指令的存在(mermaid.ts#L466),底层由 packages/mermaid/src/diagram-api/detectType.js 中的detectors表驱动。典型用途:在用户粘贴文本时即时提示“这是哪种图”。
parse与detectType均与 DOM 无关,可在 SSR 或非浏览器环境中安全调用。
3. 渲染组:run、render与contentLoaded
run(options?: RunOptions)—— 扫描文档、找到图表定义并逐个渲染。RunOptions定义于 mermaid.ts#L58-L75,文档见 docs/config/setup/mermaid/interfaces/RunOptions.md:字段 类型 说明 querySelectorstring选择要渲染的元素的选择器,默认 ".mermaid"nodesArrayLike<HTMLElement>直接指定节点集合;若设置则 querySelector被忽略postRenderCallback(id) => unknown每张图表渲染完成后的回调 suppressErrorsboolean为 true时错误只记录到 console 而不抛出,默认falserun的内部实现(mermaid.ts#L143-L214)值得集成方注意三个细节:- 幂等性:每个被处理的元素会被打上
data-processed属性,再次调用run时自动跳过,因此init/run可以被安全地多次触发; - 文本预处理:元素
innerHTML会经过dedent(去缩进,YAML 解析需要)、entityDecode(HTML 实体解码)以及<br>规范化后才进入解析器; - 确定性 ID:图表 ID 由
utils.InitIDGenerator(conf.deterministicIds, conf.deterministicIDSeed)生成,配合deterministicIds/deterministicIDSeed配置项可让产物 ID 稳定,便于版本控制中的 SVG 文件对比。
- 幂等性:每个被处理的元素会被打上
render(id, text, svgContainingElement?)—— 将图表文本渲染为 SVG 并返回Promise<RenderResult>。文档中标注其对外部使用者已弃用(“Deprecated for external use”),建议统一走parse+run的路径;但在需要手动控制 SVG 容器、获取返回 SVG 字符串的场景下它仍是实际可用的方法。contentLoaded()—— 页面加载后的回调入口:拉取 mermaid 渲染所需配置并调用init渲染页面上的图表,是startOnLoad: true自动渲染模式的内部驱动函数。
4. 错误处理组:parseError与setParseErrorHandler
parseError?: ParseErrorFunction—— 可选的解析错误回调,解析失败时接收错误信息与 hash。setParseErrorHandler(handler)—— 以方法形式注册parseError,服务于无法直接向mermaid对象动态添加成员的环境(文档注释中举例为 Dart 互操作包装场景)。文档给出的典型用法:
mermaid.parseError = function (err, hash) { forExampleDisplayErrorInGui(err); // 在界面上展示错误 };从 mermaid.ts#L77-L100 的handleError实现可以确认:无论底层抛出的是字符串形式的详细错误({ str, hash }结构,即DetailedError)还是普通Error,都会归一化后转交给parseError,因此集成方只需处理一种回调签名。
5. 扩展注册组:registerExternalDiagrams、registerLayoutLoaders、registerIconPacks与getRegisteredDiagramsMetadata
registerExternalDiagrams(diagrams, { lazyLoad? })—— 注册外部图表类型。diagrams为ExternalDiagramDefinition[];lazyLoad默认为true,设为false时图表定义会立即加载。该方法是 mermaid 插件生态(如独立图表包)接入主渲染管线的官方入口。registerLayoutLoaders(loaders)—— 注册布局引擎加载器,loaders为LayoutLoaderDefinition[]。mermaid 将布局算法设计为可插拔组件(如 ELK、tidy-tree 均以独立包形式存在,可参考 packages/mermaid-layout-elk 与 packages/mermaid-layout-tidy-tree),此方法是其挂载点。registerIconPacks(iconLoaders)—— 注册图标加载器(IconLoader[],含同步SyncIconLoader与异步AsyncIconLoader两种形态),为 architecture 等图表扩展图标来源。getRegisteredDiagramsMetadata()—— 返回当前已注册图表的元数据数组,目前每项仅含id字段。其实现(mermaid.ts#L440-L444)直接遍历detectors的键,因此返回值可视为“当前运行时支持的全部图表类型清单”,适合用来动态生成编辑器菜单。
6. 弃用成员与迁移路径
接口中有三处显式@deprecated标注,集成方应重点迁移:
| 弃用成员 | 替代方案 |
|---|---|
mermaidAPI(@internal) | 改用顶层的parse与render |
init(config, nodes, callback) | 改用initialize(config)+run(options) |
mermaid.render(经mermaidAPI访问的旧路径) | 改用mermaid.render函数本体 |
官方建议:若新 API 无法覆盖既有使用场景,可向上游发起讨论。
三、变量 default:Mermaid 接口的运行时实例
索引中的Variables → default对应主对象实例本身,文档见 docs/config/setup/mermaid/variables/default.md。其声明位置为 mermaid.ts#L471-L487:
const mermaid: Mermaid = { startOnLoad: true, mermaidAPI, parse, render, init, run, registerExternalDiagrams, registerLayoutLoaders, initialize, parseError: undefined, contentLoaded, setParseErrorHandler, detectType, registerIconPacks, getRegisteredDiagramsMetadata, };几个从源码可直接确认的事实:
parseError的初始值为undefined,即未注册错误处理器前,解析错误不会有任何界面反馈,只会写入日志;run的默认选择器在 mermaid.ts#L122-L126 中被写死为".mermaid",与RunOptions文档描述一致;- 当
run过程中收集到错误且suppressErrors为假时,会重新抛出第一个错误并提示“Use the suppressErrors option to suppress these errors”(mermaid.ts#L136-L139)。
由此可得一段可复制的最小集成范式:
<script type="module"> import mermaid from 'mermaid'; mermaid.initialize({ startOnLoad: false, // 关闭自动渲染,改由代码触发 securityLevel: 'strict', theme: 'default', }); mermaid.setParseErrorHandler((err, hash) => { console.error('diagram parse failed', err, hash); }); // 页面元素 <pre class="mermaid">flowchart LR; a-->b</pre> await mermaid.run({ querySelector: '.mermaid' }); </script>四、MermaidConfig:initialize 接受的完整配置面
MermaidConfig接口定义于 packages/mermaid/src/config.type.ts#L66,文档见 docs/config/setup/mermaid/interfaces/MermaidConfig.md。它同时是initialize与已弃用init第一个参数的类型,是 mermaid 配置的“根对象”。按功能域分组后,关键配置项如下:
渲染外观与安全
| 配置项 | 类型 | 说明 |
|---|---|---|
theme | default|base|dark|forest|neutral|neo|neo-dark|redux系列 |null | 主题样式表;可再用themeCSS字符串覆盖 |
themeVariables/themeCSS | any/string | 主题变量与完整 CSS 覆盖 |
look | neo|classic|handDrawn | 整体视觉风格 |
handDrawnSeed | number | handDrawn 风格的随机种子,默认 0(即随机);自动化测试需固定种子 |
fontFamily/altFontFamily | string | 图表内使用的 CSS 字体族 |
fontSize | number | 基础字号 |
darkMode | boolean | 暗色模式开关 |
securityLevel | strict|loose|antiscript|sandbox | 对解析图表的信任级别,决定 HTML 标签、脚本与外链的处置 |
secure | string[] | 声明哪些配置键视为“安全键”,只能经mermaid.initialize修改,防止恶意图表指令覆盖站点安全设置 |
dompurifyConfig | Config | 传给 DOMPurify 的净化配置 |
运行行为
| 配置项 | 类型 | 说明 |
|---|---|---|
startOnLoad | boolean | 是否页面加载即渲染(与主对象上的startOnLoad属性对应) |
logLevel | 0~5或trace/debug/info/warn/error/fatal | 日志量控制 |
htmlLabels | boolean | 标签是否以 HTML 渲染;注意文档明确标注:图表级htmlLabels(如flowchart.htmlLabels)已弃用,应以根级配置为准 |
arrowMarkerAbsolute | boolean | HTML 中的箭头 marker 用绝对路径还是锚点,使用<base>标签的站点需关注 |
suppressErrorRendering | boolean | 抑制向 DOM 插入“Syntax error”占位图,交由应用自行处理语法错误 |
wrap/markdownAutoWrap | boolean | 文本换行行为 |
maxTextSize/maxEdges | number | 用户图表文本的最大允许尺寸与最大边数 |
布局与确定性
| 配置项 | 类型 | 说明 |
|---|---|---|
layout | string | 指定渲染所用布局算法,与registerLayoutLoaders注册的加载器配合 |
elk | object | ELK 布局引擎参数子对象,含considerModelOrder、cycleBreakingStrategy、forceNodeModelOrder、keepEntryNodeOnTop、mergeEdges、nodePlacementStrategy(SIMPLE|NETWORK_SIMPLEX|LINEAR_SEGMENTS|BRANDES_KOEPF)、nodePlacementAlignment等字段 |
deterministicIds | boolean | SVG 内节点 ID 是否基于种子确定性生成;默认false(按当前时间生成,不可复现) |
deterministicIDSeed | string | 确定性 ID 的种子;deterministicIds: true且未设置种子时使用递增计数器 |
数学公式与图表专属配置
legacyMathML/forceLegacyMathML:前者声明宿主是否包含 KaTeX 的 MathML 样式表(决定浏览器无原生 MathML 支持时回退还是给出警告),后者强制使用 KaTeX 自身样式表渲染 MathML,对跨平台一致渲染有要求时推荐开启,且开启后忽略legacyMathML。- 每个图表类型各有一个可选子配置对象:
flowchart(FlowchartDiagramConfig)、sequence、gantt、class、state、er、pie、quadrantChart、xyChart、gitGraph、journey、timeline、swimlane、kanban、c4、sankey、requirement、packet、block、architecture、mindmap、ishikawa、venn、usecase、radar、wardley-beta、eventmodeling、railroad、cynefin、treeView,均声明于 config.type.ts#L234-L263。各图表类型的配置细节可进一步查阅 docs/config/setup/defaultConfig/README.md 下的默认配置参考与 docs/config/configuration.md。
五、其余接口与类型别名:插件作者的扩展契约
索引页中除Mermaid、MermaidConfig外的成员主要服务于两类深度集成者:
错误与解析类型
DetailedError:{ str, hash, ... }结构的详细错误对象,是parseError回调与run内部错误收集(runThrowsErrors中的errors: DetailedError[])的统一载体,定义于 packages/mermaid/src/utils.js 并自 mermaid.ts 导出;UnknownDiagramError:检测到未知图表类型时使用的错误类型;ParseResult/RenderResult:parse与render的返回结构;InternalHelpers:内部辅助类型别名,供包内编排使用。
外部图表与布局插件类型
ExternalDiagramDefinition:外部图表的注册描述(含id等元数据),是registerExternalDiagrams的参数类型;LayoutLoaderDefinition/LayoutData:布局加载器契约与布局产物数据,registerLayoutLoaders由此接入 ELK 等外部布局引擎;CommonLayoutMeasure、CommonLayoutPaintContext、CommonLayoutPaintOptions、CommonLayoutRenderContext、CommonLayoutRendererDefinition:一组CommonLayout*类型,构成 mermaid 通用布局算法框架的上下文契约。
通用布局函数(Functions 一节)
clearLayoutRenderState、createCommonLayoutRenderer、defaultMeasureLayout、paintLayoutData四个函数在 mermaid.ts#L44-L49 中从rendering-util/layout-algorithms/common再导出,文档分别为 clearLayoutRenderState、createCommonLayoutRenderer、defaultMeasureLayout、paintLayoutData。从导出结构看,它们暴露了“测量(measure)—布局(layout)—绘制(paint)”三段式管线:defaultMeasureLayout提供默认测量实现,createCommonLayoutRenderer基于CommonLayoutRendererDefinition构建渲染器,paintLayoutData将布局结果绘制为 SVG,clearLayoutRenderState负责清理渲染状态以便重复渲染。独立布局包(如 packages/mermaid-layout-elk/src)正是围绕这套契约实现的。
SVG 与图标类型
SVG/SVGGroup:图表节点/分组的轻量结构描述,供图表模块内部与插件间交换数据;IconLoader=SyncIconLoader | AsyncIconLoader:图标加载器类型别名,registerIconPacks接受IconLoader[]。
六、小结:如何在工程中正确使用这套 API
- 常规集成只需三行:
initialize配置 →setParseErrorHandler兜底 →run({ querySelector })触发;data-processed属性保证重复调用安全。 - 服务端/无 DOM 场景用
parse(配合suppressErrors)做校验,用detectType做类型识别,避免触碰run的文档扫描路径。 - 产物稳定性场景(CI 中比对生成的 SVG)应开启
deterministicIds并固定deterministicIDSeed,必要时再固定handDrawnSeed。 - 安全敏感站点用
securityLevel: 'strict'+secure键列表双重设防,并用suppressErrorRendering自行接管错误展示。 - 扩展场景(自定义布局、外部图表、图标包)分别对应
registerLayoutLoaders、registerExternalDiagrams、registerIconPacks三个注册方法,其参数类型即索引页中列出的LayoutLoaderDefinition、ExternalDiagramDefinition、IconLoader等接口。
以上所有行为均可在 packages/mermaid/src/mermaid.ts、packages/mermaid/src/config.type.ts、packages/mermaid/src/types.ts 中对照源码核验;更完整的配置键参考可继续查阅 docs/config/setup/README.md 及其下config、defaultConfig两个子索引。
【免费下载链接】mermaidGeneration of diagrams like flowcharts or sequence diagrams from text in a similar manner as markdown项目地址: https://gitcode.com/GitHub_Trending/me/mermaid
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考