Mermaid高级配置与API集成开发
本文全面介绍了Mermaid图表库的高级配置功能、安全机制、JavaScript API调用方法以及与主流前端框架的集成方案。内容涵盖主题配置与样式自定义、安全配置与沙箱模式、API调用详解以及React、Vue、Angular等框架的具体集成实践,为开发者提供完整的Mermaid高级应用指南。
主题配置与样式自定义
Mermaid提供了强大的主题配置系统,允许开发者根据项目需求自定义图表的外观样式。从8.7.0版本开始,Mermaid引入了动态和集成的主题配置功能,支持站点级全局主题配置和单个图表的特定主题定制。
可用主题类型
Mermaid内置了多个预设主题,每个主题都有其特定的应用场景:
| 主题名称 | 描述 | 适用场景 |
|---|---|---|
| default | 默认主题 | 所有图表的基准主题 |
| neutral | 中性主题 | 黑白文档打印场景 |
| dark | 深色主题 | 深色元素或暗色模式 |
| forest | 森林主题 | 包含绿色色调的自然风格 |
| base | 基础主题 | 唯一可自定义的主题,作为自定义的基础 |
全局主题配置
要进行站点级的全局主题配置,需要在初始化Mermaid时通过initialize方法设置主题参数:
mermaid.initialize({
securityLevel: 'loose',
theme: 'base',
themeVariables: {
primaryColor: '#1a73e8',
primaryTextColor: '#ffffff',
primaryBorderColor: '#0d47a1',
lineColor: '#4285f4',
background: '#f8f9fa'
}
});
图表级主题定制
对于单个图表,可以使用init指令进行特定的主题配置:
%%{init: {'theme':'base', 'themeVariables': {'primaryColor':'#ff6b6b', 'primaryTextColor':'#fff', 'lineColor':'#4ecdc4'}}}%%
graph TD
A[开始] --> B{处理数据}
B --> C[分析结果]
B --> D[生成报告]
C --> E[完成]
D --> E
主题变量详解
Mermaid的主题系统基于一系列可配置的变量,这些变量控制着图表各个元素的样式:
核心主题变量
| 变量名 | 默认值 | 描述 |
|---|---|---|
| background | #f4f4f4 | 图表背景色,用于计算其他颜色 |
| primaryColor | #fff4dd | 节点背景色,其他颜色由此派生 |
| primaryTextColor | 自动计算 | 节点文本颜色 |
| lineColor | 自动计算 | 连接线颜色 |
| fontFamily | "trebuchet ms", verdana, arial | 字体家族 |
| fontSize | 16px | 字体大小 |
流程图特定变量
themeVariables: {
nodeBorder: '#e0e0e0', // 节点边框颜色
clusterBkg: '#f5f5f5', // 子图背景色
clusterBorder: '#bdbdbd', // 子图边框颜色
defaultLinkColor: '#757575', // 默认连接颜色
titleColor: '#424242', // 标题颜色
nodeTextColor: '#212121' // 节点文本颜色
}
序列图变量配置
themeVariables: {
actorBkg: '#bbdefb', // 参与者背景色
actorBorder: '#64b5f6', // 参与者边框颜色
actorTextColor: '#0d47a1', // 参与者文本颜色
signalColor: '#f44336', // 信号线颜色
activationBkgColor: '#e3f2fd' // 激活背景色
}
饼图样式定制
饼图支持丰富的样式配置选项:
themeVariables: {
pie1: '#ff6b6b', // 第一区块颜色
pie2: '#4ecdc4', // 第二区块颜色
pie3: '#45b7d1', // 第三区块颜色
pieTitleTextSize: '20px', // 标题文字大小
pieSectionTextColor: '#2c3e50', // 区块文本颜色
pieStrokeWidth: '1px', // 边框宽度
pieOpacity: '0.8' // 透明度
}
颜色计算机制
Mermaid的主题引擎采用智能的颜色计算机制,确保图表的可读性:
- 派生颜色:许多变量的默认值是从其他变量计算得出的
- 暗色模式支持:设置
darkMode: true会自动调整颜色计算 - 十六进制颜色:只支持十六进制颜色值,不支持颜色名称
- 对比度保证:自动确保文本颜色与背景色有足够的对比度
实际应用示例
企业品牌主题配置
// 企业蓝色主题
const corporateTheme = {
theme: 'base',
themeVariables: {
primaryColor: '#1a56db',
primaryTextColor: '#ffffff',
primaryBorderColor: '#1e3a8a',
secondaryColor: '#3b82f6',
lineColor: '#93c5fd',
background: '#f8fafc',
fontFamily: '"Segoe UI", Tahoma, Geneva, Verdana, sans-serif'
}
};
// 应用到所有图表
mermaid.initialize(corporateTheme);
学术论文主题
%%{init: {'theme':'base', 'themeVariables': {'primaryColor':'#f8f9fa', 'primaryTextColor':'#212529', 'primaryBorderColor':'#dee2e6', 'lineColor':'#6c757d', 'background':'#ffffff'}}}%%
graph LR
A[文献综述] --> B[研究方法]
B --> C[数据分析]
C --> D[结论]
subgraph 研究过程
B
C
end
状态图主题定制
%%{init: {'theme':'base', 'themeVariables': {'primaryColor':'#e9ecef', 'primaryTextColor':'#495057', 'lineColor':'#868e96', 'stateBkg':'#f1f3f5', 'transitionColor':'#adb5bd'}}}%%
stateDiagram-v2
[*] --> Idle
Idle --> Processing: Start
Processing --> Success: Complete
Processing --> Error: Fail
Error --> Idle: Retry
Success --> [*]
最佳实践建议
- 保持一致性:在整个项目中保持主题样式的一致性
- 可访问性:确保颜色对比度符合WCAG可访问性标准
- 性能考虑:避免过度复杂的主题配置影响渲染性能
- 测试验证:在不同设备和浏览器上测试主题效果
- 文档记录:为主题配置创建详细的文档说明
通过灵活运用Mermaid的主题配置系统,开发者可以创建出既美观又符合项目品牌形象的图表,大大提升文档的可读性和专业性。
安全配置与沙箱模式
Mermaid作为一款强大的图表生成工具,在处理用户提供的图表定义时面临着重要的安全挑战。为了应对潜在的安全风险,Mermaid提供了多层次的安全配置选项,使开发者能够根据应用场景选择适当的安全级别。
安全级别配置
Mermaid支持四种不同的安全级别,通过securityLevel配置项进行设置:
| 安全级别 | 描述 | 适用场景 |
|---|---|---|
strict |
最高安全级别,完全禁用脚本执行和交互功能 | 公共网站、不受信任的用户输入 |
loose |
宽松模式,允许有限的交互功能 | 内部系统、受信任的用户 |
antiscript |
防脚本模式(已弃用) | 向后兼容 |
sandbox |
沙箱模式,在隔离的iframe中渲染图表 | 需要交互功能的安全环境 |
配置示例
// 严格模式配置 - 完全禁用交互
mermaid.initialize({
securityLevel: 'strict',
startOnLoad: true
});
// 沙箱模式配置 - 在隔离环境中允许交互
mermaid.initialize({
securityLevel: 'sandbox',
startOnLoad: true,
logLevel: 1
});
// 宽松模式配置 - 允许有限的交互
mermaid.initialize({
securityLevel: 'loose',
startOnLoad: true
});
沙箱模式实现原理
沙箱模式是Mermaid最高级别的安全保护机制,其核心实现基于以下技术:
1. iframe隔离渲染
当启用sandbox安全级别时,Mermaid会在沙箱化的iframe中渲染图表:
const IFRAME_SANDBOX_OPTS = 'allow-top-navigation-by-user-activation allow-popups';
const IFRAME_WIDTH = '100%';
const IFRAME_HEIGHT = '100%';
export const putIntoIFrame = (svgCode = '', svgElement?: D3Element): string => {
const height = svgElement?.viewBox?.baseVal?.height
? svgElement.viewBox.baseVal.height + 'px'
: IFRAME_HEIGHT;
const base64encodedSrc = toBase64(`<body style="margin:0">${svgCode}</body>`);
return `<iframe style="width:${IFRAME_WIDTH};height:${height};border:0;margin:0;"
src="data:text/html;charset=UTF-8;base64,${base64encodedSrc}"
sandbox="${IFRAME_SANDBOX_OPTS}">
The "iframe" tag is not supported by your browser.
</iframe>`;
};
2. 安全级别检测与处理
在渲染过程中,Mermaid会检测当前的安全级别并采取相应的处理措施:
const isSandboxed = config.securityLevel === SECURITY_LVL_SANDBOX;
const isLooseSecurityLevel = config.securityLevel === SECURITY_LVL_LOOSE;
// 清理SVG代码
svgCode = cleanUpSvgCode(svgCode, isSandboxed, evaluate(config.arrowMarkerAbsolute));
if (isSandboxed) {
// 沙箱模式:将SVG放入iframe
const svgEl = root.select(enclosingDivID_selector + ' svg').node();
svgCode = putIntoIFrame(svgCode, svgEl);
} else if (!isLooseSecurityLevel) {
// 非宽松模式:使用DOMPurify进行HTML净化
svgCode = DOMPurify.sanitize(svgCode, {
ADD_TAGS: ['foreignobject'],
ADD_ATTR: ['dominant-baseline'],
});
}
DOMPurify集成配置
Mermaid集成了DOMPurify库来处理HTML净化,开发者可以通过dompurifyConfig选项进行自定义配置:
// 自定义DOMPurify配置
mermaid.initialize({
securityLevel: 'strict',
dompurifyConfig: {
ADD_TAGS: ['custom-element'],
ADD_ATTR: ['data-custom-attr'],
FORBID_TAGS: ['script', 'style'],
FORBID_ATTR: ['onclick', 'onload']
}
});
安全配置最佳实践
1. 公共网站安全配置
对于面向公众的网站,推荐使用严格模式:
mermaid.initialize({
securityLevel: 'strict',
maxTextSize: 50000, // 限制图表文本大小
secure: ['securityLevel', 'maxTextSize'] // 保护关键配置
});
2. 内部系统配置
对于受信任的内部系统,可以使用宽松模式:
mermaid.initialize({
securityLevel: 'loose',
htmlLabels: true,
fontFamily: 'Arial, sans-serif'
});
3. 需要交互功能的安全环境
对于需要图表交互但又要求安全性的场景,使用沙箱模式:
mermaid.initialize({
securityLevel: 'sandbox',
startOnLoad: true,
logLevel: 2 // 启用日志用于调试
});
安全配置验证示例
通过以下流程图展示不同安全级别的行为差异:
flowchart TD
A[用户输入图表定义] --> B{安全级别检测}
B -->|strict| C[严格模式]
B -->|loose| D[宽松模式]
B -->|sandbox| E[沙箱模式]
C --> F[禁用所有交互]
C --> G[DOMPurify净化]
C --> H[输出安全SVG]
D --> I[允许有限交互]
D --> J[基本HTML净化]
D --> K[输出交互SVG]
E --> L[创建沙箱iframe]
E --> M[在隔离环境渲染]
E --> N[输出安全iframe]
H --> O[最终输出]
K --> O
N --> O
安全漏洞防护
Mermaid实施了多层次的安全防护措施:
- 配置项保护:通过
secure数组保护关键配置不被覆盖 - 原型污染防护:检测并阻止
__proto__等原型操作 - XSS防护:过滤HTML标签和危险属性
- 数据URL防护:阻止包含潜在恶意代码的data URL
// 安全配置保护示例
const secureKeys = ['secure', ...(siteConfig.secure ?? [])];
secureKeys.forEach((key) => {
if (Object.hasOwn(options, key)) {
log.debug(`Denied attempt to modify a secure key ${key}`);
delete options[key];
}
});
// 原型污染防护
Object.keys(options).forEach((key) => {
if (key.startsWith('__')) {
delete options[key];
}
});
实际应用场景
场景1:技术文档平台
// 技术文档平台通常需要平衡安全性和功能性
mermaid.initialize({
securityLevel: 'sandbox',
theme: 'default',
fontFamily: 'Consolas, monospace',
maxTextSize: 30000
});
场景2:在线教育平台
// 教育平台需要安全的交互功能
mermaid.initialize({
securityLevel: 'sandbox',
startOnLoad: true,
logLevel: 3,
themeVariables: {
primaryColor: '#3498db',
secondaryColor: '#2ecc71'
}
});
场景3:企业内部系统
// 企业内部系统可以使用更宽松的配置
mermaid.initialize({
securityLevel: 'loose',
htmlLabels: true,
arrowMarkerAbsolute: false,
theme: 'forest'
});
通过合理配置Mermaid的安全级别,开发者可以在提供丰富图表功能的同时,确保应用程序的安全性。沙箱模式特别适用于需要图表交互但又必须防范安全风险的场景,为现代Web应用提供了可靠的安全保障。
JavaScript API调用方法
Mermaid提供了丰富的JavaScript API,允许开发者在各种环境中灵活集成和使用图表功能。通过API调用,您可以实现动态图表生成、配置管理、错误处理等高级功能。
核心API方法
Mermaid的核心API主要通过mermaidAPI对象提供,包含以下主要方法:
1. 初始化配置
使用initialize方法设置全局配置,应在调用其他API之前使用:
// 初始化Mermaid配置
mermaid.initialize({
startOnLoad: true,
theme: 'dark',
flowchart: {
useMaxWidth: false,
htmlLabels: true,
curve: 'basis'
},
sequence: {
useMaxWidth: false,
noteMargin: 10,
actorMargin: 50
}
});
配置参数说明:
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
startOnLoad |
boolean | true | 页面加载时自动渲染图表 |
theme |
string | 'default' | 主题样式:'default', 'dark', 'forest', 'neutral' |
fontFamily |
string | - | 自定义字体 |
logLevel |
number | 1 | 日志级别:0-5 |
securityLevel |
string | 'strict' | 安全级别:'strict', 'loose', 'sandbox' |
2. 渲染图表
render方法是核心的图表渲染API,支持异步操作:
// 基本渲染示例
const diagramDefinition = `
graph TD
A[开始] --> B{判断}
B -->|是| C[执行操作]
B -->|否| D[结束]
C --> D
`;
// 渲染到指定元素
const { svg, bindFunctions } = await mermaid.render('graph-div', diagramDefinition);
document.getElementById('graph-container').innerHTML = svg;
if (bindFunctions) {
bindFunctions(document.getElementById('graph-container'));
}
3. 批量处理
run方法用于批量处理页面中的所有Mermaid图表:
// 处理所有.mermaid类的元素
await mermaid.run({
querySelector: '.mermaid',
postRenderCallback: (id) => {
console.log(`图表 ${id} 渲染完成`);
},
suppressErrors: true
});
// 处理特定节点
const nodes = document.querySelectorAll('.custom-diagram');
await mermaid.run({ nodes });
高级API用法
1. 动态图表生成
// 动态生成流程图
function generateFlowchart(steps) {
let definition = 'graph TB\n';
steps.forEach((step, index) => {
if (index === 0) {
definition += ` Start[${step}] --> `;
} else if (index === steps.length - 1) {
definition += `End[${step}]\n`;
} else {
definition += `Step${index}[${step}] --> `;
}
});
return definition;
}
// 使用动态生成的图表
const steps = ['需求分析', '设计', '开发', '测试', '部署'];
const flowchartDef = generateFlowchart(steps);
mermaid.render('dynamic-flowchart', flowchartDef).then(({ svg }) => {
document.getElementById('flowchart-container').innerHTML = svg;
});
2. 序列图API调用
// 序列图API示例
const sequenceDefinition = `
sequenceDiagram
participant 用户
participant 系统
participant 数据库
用户->>系统: 登录请求
系统->>数据库: 验证用户
数据库-->>系统: 验证结果
系统-->>用户: 登录成功
`;
// 渲染序列图
mermaid.render('sequence-diagram', sequenceDefinition).then(({ svg }) => {
document.getElementById('sequence-container').innerHTML = svg;
});
3. 类图配置
// 类图配置示例
mermaid.initialize({
class: {
useMaxWidth: true,
dividerMargin: 10,
padding: 5,
nodeSpacing: 50,
rankSpacing: 50
}
});
const classDefinition = `
classDiagram
class Animal {
+String name
+int age
+eat()
+sleep()
}
class Dog {
+bark()
}
class Cat {
+meow()
}
Animal <|-- Dog
Animal <|-- Cat
`;
mermaid.render('class-diagram', classDefinition);
错误处理与调试
Mermaid API提供了完善的错误处理机制:
// 设置错误处理回调
mermaid.parseError = function(err, hash) {
console.error('Mermaid解析错误:', err);
console.error('错误哈希:', hash);
// 可以在这里显示用户友好的错误信息
};
// 使用try-catch处理渲染错误
try {
const result = await mermaid.render('my-diagram', invalidDefinition);
// 处理成功结果
} catch (error) {
console.error('图表渲染失败:', error);
// 显示错误界面
showErrorToUser('图表格式有误,请检查语法');
}
// 启用详细日志
mermaid.initialize({
logLevel: 3 // 0: trace, 1: debug, 2: info, 3: warn, 4: error, 5: fatal
});
性能优化技巧
1. 延迟加载
// 延迟加载Mermaid
async function loadMermaidWhenNeeded() {
if (document.querySelector('.mermaid')) {
const mermaid = await import('mermaid');
mermaid.initialize();
await mermaid.run();
}
}
// 监听元素出现
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
loadMermaidWhenNeeded();
observer.unobserve(entry.target);
}
});
});
document.querySelectorAll('.mermaid').forEach(el => {
observer.observe(el);
});
2. 缓存渲染结果
// 图表缓存机制
const diagramCache = new Map();
async function renderWithCache(id, definition) {
if (diagramCache.has(definition)) {
return diagramCache.get(definition);
}
const result = await mermaid.render(id, definition);
diagramCache.set(definition, result);
return result;
}
集成示例
React组件集成
import React, { useEffect, useRef } from 'react';
import mermaid from 'mermaid';
const MermaidChart = ({ definition }) => {
const ref = useRef(null);
useEffect(() => {
const renderDiagram = async () => {
try {
const { svg, bindFunctions } = await mermaid.render(
'mermaid-' + Date.now(),
definition
);
ref.current.innerHTML = svg;
if (bindFunctions) {
bindFunctions(ref.current);
}
} catch (error) {
console.error('Failed to render diagram:', error);
}
};
renderDiagram();
}, [definition]);
return <div ref={ref} className="mermaid-chart" />;
};
export default MermaidChart;
Vue组件集成
<template>
<div ref="chartContainer" class="mermaid-container"></div>
</template>
<script>
import mermaid from 'mermaid';
export default {
props: {
definition: String
},
async mounted() {
await this.renderChart();
},
methods: {
async renderChart() {
try {
const { svg, bindFunctions } = await mermaid.render(
`chart-${this._uid}`,
this.definition
);
this.$refs.chartContainer.innerHTML = svg;
if (bindFunctions) {
bindFunctions(this.$refs.chartContainer);
}
} catch (error) {
console.error('图表渲染失败:', error);
}
}
},
watch: {
definition() {
this.renderChart();
}
}
};
</script>
通过掌握这些JavaScript API调用方法,您可以灵活地在各种项目中集成Mermaid图表功能,实现动态、交互式的数据可视化需求。
与主流框架集成方案
Mermaid作为一款强大的图表生成工具,在现代Web开发中与各种主流前端框架都有着深度的集成方案。无论是React、Vue、Angular还是新兴的Svelte、Solid等框架,Mermaid都提供了灵活的集成方式,让开发者能够轻松地在应用中嵌入流程图、序列图、类图等各种图表。
React集成方案
在React应用中集成Mermaid主要有两种方式:使用现有的React组件库或手动集成。
使用React-Mermaid组件库
对于React项目,社区提供了专门的react-mermaid组件库,可以快速集成:
import React from 'react';
import Mermaid from 'react-mermaid';
const FlowchartComponent = () => {
const flowchart = `
graph TD
A[Christmas] -->|Get money| B(Go shopping)
B --> C{Let me think}
C -->|One| D[Laptop]
C -->|Two| E[iPhone]
C -->|Three| F[Car]
`;
return (
<div>
<h2>购物决策流程图</h2>
<Mermaid chart={flowchart} />
</div>
);
};
export default FlowchartComponent;
手动集成方案
如果需要更多自定义控制,可以手动集成Mermaid:
import React, { useEffect, useRef } from 'react';
import mermaid from 'mermaid';
const MermaidChart = ({ chartDefinition }) => {
const ref = useRef(null);
useEffect(() => {
mermaid.initialize({
startOnLoad: true,
theme: 'default',
securityLevel: 'loose',
fontFamily: 'Arial, sans-serif',
});
if (ref.current) {
mermaid.run({
nodes: [ref.current],
});
}
}, [chartDefinition]);
return (
<div ref={ref} className="mermaid">
{chartDefinition}
</div>
);
};
// 使用示例
const SequenceDiagram = () => {
const sequenceDiagram = `
sequenceDiagram
participant Alice
participant Bob
Alice->>Bob: Hello Bob, how are you?
Bob-->>Alice: I'm good thanks!
`;
return <MermaidChart chartDefinition={sequenceDiagram} />;
};
Vue集成方案
在Vue生态中,Mermaid可以通过自定义指令或组件的方式集成。
Vue 3 Composition API集成
<template>
<div>
<div ref="mermaidContainer" class="mermaid">
{{ chartDefinition }}
</div>
</div>
</template>
<script setup>
import { ref, onMounted, watch } from 'vue';
import mermaid from 'mermaid';
const props = defineProps({
chartDefinition: String,
config: {
type: Object,
default: () => ({
theme: 'forest',
securityLevel: 'loose',
flowchart: { curve: 'basis' }
})
}
});
const mermaidContainer = ref(null);
onMounted(() => {
mermaid.initialize(props.config);
renderMermaid();
});
watch(() => props.chartDefinition, renderMermaid);
const renderMermaid = async () => {
if (mermaidContainer.value) {
try {
await mermaid.run({
nodes: [mermaidContainer.value]
});
} catch (error) {
console.error('Mermaid rendering error:', error);
}
}
};
</script>
<style>
.mermaid {
font-family: 'Arial', sans-serif;
background: white;
padding: 20px;
border-radius: 8px;
}
</style>
Vue插件方式
可以创建可重用的Vue插件:
// mermaid-plugin.js
import mermaid from 'mermaid';
export default {
install: (app, options = {}) => {
mermaid.initialize({
startOnLoad: true,
theme: 'default',
securityLevel: 'loose',
...options
});
app.directive('mermaid', {
mounted(el, binding) {
const { value } = binding;
if (value) {
el.innerHTML = value;
mermaid.init(undefined, el);
}
},
updated(el, binding) {
const { value } = binding;
if (value) {
el.innerHTML = value;
mermaid.init(undefined, el);
}
}
});
app.provide('mermaid', mermaid);
}
};
Angular集成方案
在Angular中,可以通过自定义指令或服务来集成Mermaid。
Angular指令方式
// mermaid.directive.ts
import { Directive, ElementRef, Input, OnInit, OnChanges } from '@angular/core';
import mermaid from 'mermaid';
@Directive({
selector: '[appMermaid]'
})
export class MermaidDirective implements OnInit, OnChanges {
@Input() appMermaid: string = '';
constructor(private el: ElementRef) {}
ngOnInit() {
mermaid.initialize({
theme: 'default',
securityLevel: 'loose',
startOnLoad: true
});
this.render();
}
ngOnChanges() {
this.render();
}
private async render() {
if (this.appMermaid) {
this.el.nativeElement.innerHTML = this.appMermaid;
try {
await mermaid.run({
nodes: [this.el.nativeElement]
});
} catch (error) {
console.error('Mermaid rendering failed:', error);
}
}
}
}
Angular服务方式
// mermaid.service.ts
import { Injectable } from '@angular/core';
import mermaid from 'mermaid';
@Injectable({
providedIn: 'root'
})
export class MermaidService {
private initialized = false;
constructor() {
this.initialize();
}
initialize(config: any = {}) {
mermaid.initialize({
startOnLoad: true,
theme: 'default',
securityLevel: 'loose',
...config
});
this.initialized = true;
}
async render(container: HTMLElement, definition: string): Promise<string> {
if (!this.initialized) {
this.initialize();
}
container.innerHTML = definition;
try {
const { svg } = await mermaid.render(
`mermaid-${Date.now()}`,
definition
);
container.innerHTML = svg;
return svg;
} catch (error) {
console.error('Mermaid rendering error:', error);
throw error;
}
}
parse(text: string): Promise<any> {
return mermaid.parse(text);
}
}
现代化框架集成
Svelte集成
<script>
import { onMount, afterUpdate } from 'svelte';
import mermaid from 'mermaid';
export let chart = '';
let container;
onMount(() => {
mermaid.initialize({
theme: 'forest',
securityLevel: 'loose'
});
renderChart();
});
afterUpdate(() => {
renderChart();
});
async function renderChart() {
if (container && chart) {
try {
container.innerHTML = chart;
await mermaid.run({
nodes: [container]
});
} catch (error) {
console.error('Mermaid error:', error);
}
}
}
</script>
<div bind:this={container} class="mermaid">
{chart}
</div>
<style>
.mermaid {
margin: 20px 0;
padding: 15px;
background: #f8f9fa;
border-radius: 6px;
}
</style>
SolidJS集成
import { createSignal, onMount, createEffect } from 'solid-js';
import mermaid from 'mermaid';
const MermaidChart = (props) => {
let container;
const [rendered, setRendered] = createSignal(false);
onMount(() => {
mermaid.initialize({
theme: 'default',
securityLevel: 'loose',
startOnLoad: false
});
setRendered(true);
});
createEffect(async () => {
if (rendered() && props.chart && container) {
try {
container.innerHTML = props.chart;
await mermaid.run({
nodes: [container]
});
} catch (error) {
console.error('Mermaid rendering failed:', error);
}
}
});
return <div ref={container} class="mermaid" />;
};
// 使用示例
const App = () => {
const flowchart = `
flowchart TD
Start --> Stop
`;
return <MermaidChart chart={flowchart} />;
};
服务端渲染(SSR)支持
Mermaid也支持服务端渲染,特别是在Next.js、Nuxt.js等框架中:
// Next.js API路由示例
import { NextApiRequest, NextApiResponse } from 'next';
import mermaid from 'mermaid';
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
const { chart, theme = 'default' } = req.body;
mermaid.initialize({
theme,
securityLevel: 'loose'
});
try {
const { svg } = await mermaid.render('mermaid-chart', chart);
res.setHeader('Content-Type', 'image/svg+xml');
res.status(200).send(svg);
} catch (error) {
res.status(400).json({ error: 'Failed to render chart' });
}
}
配置最佳实践
在不同框架中集成Mermaid时,推荐使用统一的配置策略:
| 配置项 | 推荐值 | 说明 |
|---|---|---|
| theme | 'default' 或 'forest' | 主题样式 |
| securityLevel | 'loose' | 安全级别,允许更多HTML特性 |
| startOnLoad | false | 手动控制渲染时机 |
| fontFamily | '系统字体' | 确保字体一致性 |
| flowchart.curve | 'basis' | 流程图曲线样式 |
性能优化建议
- 延迟加载: 对于大量图表,使用Intersection Observer实现懒加载
- 缓存渲染结果: 对静态图表进行缓存,避免重复渲染
- 错误边界: 实现错误处理机制,确保单图失败不影响整体应用
- 按需导入: 使用动态导入减少初始包大小
// 动态导入示例
const renderMermaid = async (container, chart) => {
const mermaid = await import('mermaid');
mermaid.initialize({ /* 配置 */ });
// 渲染逻辑
};
通过以上集成方案,开发者可以在各种现代前端框架中无缝使用Mermaid,创建丰富的图表可视化体验。每种框架都有其特定的最佳实践,但核心的Mermaid API保持一致,确保了跨框架的兼容性和一致性。
Mermaid作为功能强大的图表生成工具,通过灵活的主题配置系统、多层次的安全防护机制和丰富的JavaScript API,为开发者提供了全面的图表可视化解决方案。本文详细介绍了从基础配置到高级集成的各个方面,包括主题定制、安全级别设置、API调用方法以及与主流框架的深度集成方案。掌握这些高级功能后,开发者能够在各种项目中创建出既美观又安全的专业级图表,显著提升应用的数据可视化能力和用户体验。
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00- QQwen3-Coder-Next2026年2月4日,正式发布的Qwen3-Coder-Next,一款专为编码智能体和本地开发场景设计的开源语言模型。Python00
xw-cli实现国产算力大模型零门槛部署,一键跑通 Qwen、GLM-4.7、Minimax-2.1、DeepSeek-OCR 等模型Go06
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin08
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00