Mermaid 默认导出对象 default 解析:mermaid 实例的成员结构与 run、parse、render 核心 API 深度剖析
【免费下载链接】mermaidGeneration of diagrams like flowcharts or sequence diagrams from text in a similar manner as markdown项目地址: https://gitcode.com/GitHub_Trending/me/mermaid
本文以自动生成的 API 文档 变量 default 为主体,解读 mermaid 包对外暴露的默认导出对象——类型为 Mermaid 接口的const实例。读懂这一对象,你就能掌握 Mermaid 在浏览器端集成的全部入口能力:如何通过initialize注入配置、用run批量渲染页面中的图表、用parse校验语法、用render手动生成 SVG,以及startOnLoad自动加载机制的工作原理。
文档定位:default 变量是什么
变量 default 是 Mermaid 官方 API 文档(TypeDoc 自动生成)中"变量(Variables)"一节唯一的条目,原文信息如下:
- 声明形式:
constdefault,类型为Mermaid接口; - 定义位置:packages/mermaid/src/mermaid.ts 第 471 行;
- 该文档属于 mermaid 模块文档(与 config 模块、defaultConfig 模块 并列),整个 API 文档树入口见 docs/config/setup。
需要特别注意:该文档开头明确标注为AUTOGENERATED FILE. DO NOT EDIT,真实维护位置在packages/mermaid/src/docs下由源码注释驱动生成。也就是说,default变量的每一项能力,都以 packages/mermaid/src/mermaid.ts 中的源码事实为准。
源码中的实例构造:mermaid 对象长什么样
在 mermaid.ts 中,Mermaid接口(第 446–469 行)与默认导出实例(第 471–489 行)一一对应:
// packages/mermaid/src/mermaid.ts (L471-L487) const mermaid: Mermaid = { startOnLoad: true, mermaidAPI, parse, render, init, run, registerExternalDiagrams, registerLayoutLoaders, initialize, parseError: undefined, contentLoaded, setParseErrorHandler, detectType, registerIconPacks, getRegisteredDiagramsMetadata, }; export default mermaid;从源码结构看,这个对象就是你在import mermaid from 'mermaid'时拿到的那个实例:startOnLoad默认为true,parseError初始为undefined(未挂载错误回调),其余成员全部是对文件内同名函数的封装。下面按"实例字段 / 方法 / 函数"三类逐项展开。
实例字段:startOnLoad 与 parseError
| 成员 | 类型 | 默认值 | 说明 |
|---|---|---|---|
startOnLoad | boolean | true | 页面load事件触发后是否自动渲染 |
parseError | ParseErrorFunction? | undefined | 解析错误回调,可选挂载 |
startOnLoad的完整工作链路是:
- 模块加载时注册全局监听(mermaid.ts 第 296–301 行):
if (typeof document !== 'undefined') { window.addEventListener('load', contentLoaded, false); }contentLoaded(第 287–294 行)做双重判断——实例上的mermaid.startOnLoad与站点配置mermaidAPI.getConfig().startOnLoad都通过后才调用mermaid.run():
const contentLoaded = function () { if (mermaid.startOnLoad) { const { startOnLoad } = mermaidAPI.getConfig(); if (startOnLoad) { mermaid.run().catch((err) => log.error('Mermaid failed to initialize', err)); } } };也就是说,想要"页面加载即自动渲染所有class="mermaid"节点",只需保持默认值;想要完全接管渲染时机,可通过mermaid.startOnLoad = false或initialize({ startOnLoad: false })关闭,再手动调用run。
parseError字段用于在解析/渲染出错时接收回调,例如在 run 内部,错误会先经handleError统一处理(第 77–100 行)再转发给mermaid.parseError。若运行环境不允许给 mermaid 对象直接添加属性(如 Dart interop 场景),可用后文介绍的setParseErrorHandler替代。
方法:initialize 与 run——推荐的集成主路径
initialize(config)
第 222–224 行的实现极简,直接委托给mermaidAPI.initialize:
const initialize = function (config: MermaidConfig) { mermaidAPI.initialize(config); };接口注释强调"应在调用run之前执行"。MermaidConfig的完整字段可参考 MermaidConfig 接口文档,而securityLevel、主题等配置项的语义在 配置使用指南 中有详细说明(例如securityLevel取值sandbox/strict/loose/antiscript,控制点击事件的信任级别)。
run(options)
run(第 122–141 行)是批量渲染入口,对应RunOptions接口(第 58–75 行):
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
querySelector | string | ".mermaid" | 查找图表定义的选择器 |
nodes | ArrayLike<HTMLElement> | — | 直接指定节点集合;设置后忽略querySelector |
postRenderCallback | (id: string) => unknown | — | 每张图渲染完成后的回调 |
suppressErrors | boolean | false | 为true时错误只打日志不抛出 |
其内部runThrowsErrors(第 143–214 行)的处理流程值得拆解:
- 读取站点配置
mermaidAPI.getConfig();若配置中显式设置了startOnLoad,会同步回写updateSiteConfig; - 用
utils.InitIDGenerator(conf.deterministicIds, conf.deterministicIDSeed)生成图表 id(第 168 行)——这就是deterministicIds/deterministicIDSeed配置项影响渲染 id 稳定性的底层依据; - 遍历节点,给已处理的元素打上
data-processed属性并跳过,因此run可安全地多次触发(第 178–181 行); - 读取
element.innerHTML,经dedent、HTML 实体解码与<br>归一化后交给render(id, txt, element),将返回的 SVG 写回element.innerHTML,随后调用postRenderCallback(id)与bindFunctions(element)(第 197–205 行); - 出错时进入
handleError:若为结构化错误则调用parseError(str, hash),普通Error归一化为{ str, message, hash, error }收集,最终统一抛出第一个错误(第 210–213 行)。
run顶部的 JSDoc 还配了一张内置流程图描述"查找元素 → 是否已处理 → 转换渲染"的流程(第 111–116 行),与上述源码逻辑一致。
废弃的 init
init(第 240–260 行)被标记为@deprecated,接口注释建议改用initialize+run。它保留了对旧版三参数签名init(config, nodes, callback)的兼容:先log.warn提示、有config则调用initialize,再把参数翻译成RunOptions后走run。在 Mermaid 接口文档 中init()也带有删除线标注,属于兼容层而非新代码应使用的 API。
函数:parse 与 render——串行执行队列保护
parse(第 360–384 行)与render(第 409–433 行)是对外函数式 API 的两道核心能力,二者共享同一套执行队列机制:
const executionQueue: (() => Promise<unknown>)[] = []; let executionQueueRunning = false; const executeQueue = async () => { if (executionQueueRunning) return; executionQueueRunning = true; while (executionQueue.length > 0) { const f = executionQueue.shift(); if (f) { try { await f(); } catch (e) { log.error('Error executing queue', e); } } } executionQueueRunning = false; };从源码结构看,parse/render的每次调用都被封装成performCall压入executionQueue,由executeQueue串行执行——这就是接口文档中"Multiple calls to this function will be enqueued to run serially"(多次调用排队串行执行)的实现依据,目的是保证并发渲染时 DOM 临时节点与 id 不互相干扰。
parse的语义与返回值(源码 JSDoc,第 341–358 行):
- 校验图表文本语法;
- 合法时解析为
{ diagramType }等ParseResult(JSDoc 示例返回{ diagramType: 'flowchart-v2' }); - 语法错误时默认抛出
Error;若parseOptions.suppressErrors为true,则返回false不抛错。
render的签名与用法(JSDoc 示例,第 386–395 行):
element = document.querySelector('#graphDiv'); const graphDefinition = 'graph TB\na-->b'; const { svg, bindFunctions } = await mermaid.render('graphDiv', graphDefinition); element.innerHTML = svg; bindFunctions?.(element);要点:id是生成的 SVG 根元素 id;text为图表定义;可选的container元素用于临时插入测量用div,不提供时临时节点会挂在body上并在渲染完成后移除;返回值RenderResult含svg字符串与可选的bindFunctions(用于绑定点击事件,见 docs/config/usage.md 中关于securityLevel的说明——启用节点点击事件需先放宽securityLevel)。两个方法的parseOptions/ 选项细节分别见 ParseOptions 与 RenderOptions 文档。
注册类 API:扩展图表、布局与图标
default对象上还挂载了三类"注册"能力,是扩展 Mermaid 的官方途径:
| 成员 | 签名 | 实现位置与行为 |
|---|---|---|
registerExternalDiagrams | (diagrams: ExternalDiagramDefinition[], { lazyLoad? = true }) => Promise<void> | mermaid.ts 第 267–280 行:先addDiagrams(),再registerLazyLoadedDiagrams(...diagrams);lazyLoad为false时立即loadRegisteredDiagrams() |
registerLayoutLoaders | (loaders: LayoutLoaderDefinition[]) => void | 实例属性,直接导出自 rendering-util/render.js |
registerIconPacks | (iconLoaders: IconLoader[]) => void | 实例属性,导出自 rendering-util/icons.js |
ExternalDiagramDefinition、LayoutLoaderDefinition、IconLoader的字段定义分别见 对应接口文档 与 type-aliases 文档。仓库内 packages/mermaid-example-diagram 包就是外部图表注册的参考示例工程。
辅助函数:detectType、setParseErrorHandler、getRegisteredDiagramsMetadata
- detectType(text, config?):识别图表类型,返回图定义键名;接口文档指出它会考虑
%%init指令的存在(示例见 Mermaid 接口文档),实现位于 diagram-api/detectType.js。 - setParseErrorHandler(parseErrorHandler)(第 317–319 行):
mermaid.parseError = parseErrorHandler的等价函数式写法,为无法直接挂载parseError成员的环境(如 Dart interop 包装层)提供替代方案,JSDoc 中给出了forExampleDisplayErrorInGui(err)的典型用法。 - getRegisteredDiagramsMetadata()(第 440–444 行):遍历
detectors的键,返回当前已注册图表的id数组(Pick<ExternalDiagramDefinition, 'id'>[]),可用于运行时枚举支持的图表类型。 - contentLoaded():见上文
startOnLoad小节,它是window load事件的回调,也是手动接管"何时自动渲染"的关键钩子。
内部字段 mermaidAPI 与布局工具导出
Mermaid接口中的mermaidAPI被标记为@internal且已废弃(接口注释:改用parse与render,mermaid.ts 第 449–453 行)。在 接口文档 中可见其只读形状包含defaultConfig、getConfig、setConfig、updateSiteConfig、globalReset、reset、parse、render、initialize等成员——run内部的mermaidAPI.getConfig()/updateSiteConfig()调用正是走这条内部通道。新代码应视为私有实现,不要直接依赖。
此外,mermaid.ts 顶部还从 rendering-util/layout-algorithms/common 再导出四个布局算法工具函数,与 mermaid 模块文档 的 Functions 一一对应:
- clearLayoutRenderState
- createCommonLayoutRenderer
- defaultMeasureLayout
- paintLayoutData
它们面向自定义布局算法的开发者(如实现registerLayoutLoaders时的测量与绘制环节),属于进阶集成面。
实战串联:从 import 到渲染的最小路径
结合源码事实,浏览器端集成的最小可行路径(与 使用文档 中 npm 安装方式npm install mermaid配合):
<pre class="mermaid"> graph LR A --- B B --> C[fa:fa-ban forbidden] </pre> <script type="module"> import mermaid from 'mermaid'; // 1. 配置(应在 run 之前) mermaid.initialize({ startOnLoad: true, logLevel: 'fatal' }); // 2a. 保持 startOnLoad 默认 true:页面 load 后自动 run,无需手写代码 // 2b. 或手动控制: // mermaid.startOnLoad = false; // await mermaid.run({ querySelector: '.mermaid', suppressErrors: true }); // 3. 单图按需渲染 const { svg, bindFunctions } = await mermaid.render('chart1', 'graph TB\na-->b'); document.querySelector('#chartDiv').innerHTML = svg; bindFunctions?.(document.querySelector('#chartDiv')); // 4. 语法校验(不渲染) const ok = await mermaid.parse('flowchart\n a --> b'); </script>需要注意的适用前提:run依赖 DOM(document.querySelectorAll),因此运行环境必须是浏览器;源码中typeof document !== 'undefined'的判断(第 296 行)也表明自动加载监听只在浏览器环境注册。
小结:default 变量的知识地图
- 入口对象:
export default mermaid的 15 个成员构成 Mermaid 的公开 API 面,定义于 packages/mermaid/src/mermaid.ts 第 471–489 行,类型契约为 Mermaid 接口; - 自动渲染:
startOnLoad(默认true)+contentLoaded+window load监听三者构成"加载即渲染"链路; - 手动控制:
initialize注入配置 →run批量处理data-processed去重与错误收集 →parse/render经串行队列保护单图操作; - 扩展能力:
registerExternalDiagrams/registerLayoutLoaders/registerIconPacks分别扩展图表类型、布局算法与图标包; - 兼容与内部:
init与mermaidAPI均为废弃/内部成员,新集成应统一走initialize+run+parse+render的函数式 API。
深入阅读路径建议:先看 变量 default 文档 与 Mermaid 接口文档 建立 API 清单,再对照 mermaid.ts 源码核对行为,最后用 docs/config/usage.md 的配置章节(securityLevel、主题等)补全配置侧知识。
【免费下载链接】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),仅供参考