Projektüberblick
Quelldateien
Diese Seite wurde aus den folgenden Quelldateien erstellt:
Mermaid ist ein JavaScript-basiertes Diagramm- und Charting-Tool, das Markdown-inspirierte Textdefinitionen verwendet, um komplexe Diagramme zu erstellen und zu modifizieren. Der Hauptzweck von Mermaid besteht darin, der Dokumentation zu helfen, mit der Entwicklung Schritt zu halten (README.md:69-79). Das Projekt zielt darauf ab, das sogenannte "Doc-Rot"-Problem zu lösen – ein Dilemma, bei dem die Erstellung von Diagrammen und Dokumentation wertvolle Entwicklerzeit kostet und schnell veraltet, während das Fehlen von Diagrammen oder Dokumentation die Produktivität beeinträchtigt und das organisationale Lernen behindert.
Die aktuelle Version 11.13.0 wird als ESM-Modul bereitgestellt und unterstützt eine breite Palette von Diagrammtypen, von Flowcharts über Sequenzdiagramme bis hin zu komplexen Architekturdiagrammen (packages/mermaid/package.json:1-5). Mermaid wurde 2019 mit dem JS Open Source Award in der Kategorie "The most exciting use of technology" ausgezeichnet und hat sich als Industriestandard für textbasierte Diagrammerstellung etabliert (README.md:43-47).
Technologie-Stack und Abhängigkeiten
Die folgende Tabelle zeigt die zentralen Technologien und deren Versionen, die im Mermaid-Kernpaket verwendet werden:
| Technologie | Version | Zweck |
|---|---|---|
| TypeScript | ~5.7.3 | Typsichere Implementierung |
| D3.js | ^7.9.0 | SVG-basiertes Rendering und Visualisierung |
| Cytoscape | ^3.33.1 | Graph-Layout-Algorithmen |
| DOMPurify | ^3.3.1 | XSS-Schutz und HTML-Sanitisierung |
| KaTeX | ^0.16.25 | Mathematische Formelrendering |
| dagre-d3-es | 7.0.14 | Hierarchische Graph-Layouts |
| Stylis | ^4.3.6 | CSS-Präprozessor für Styling |
Die Abhängigkeitsstruktur verdeutlicht die modulare Architektur mit Fokus auf Sicherheit und Performance (packages/mermaid/package.json:69-91). Besonders hervorzuheben ist die Integration von @braintree/sanitize-url für URL-Sicherheit und dompurify zum Schutz vor Cross-Site-Scripting-Angriffen.
Unterstützte Diagrammtypen
Mermaid unterstützt eine umfangreiche Palette von Diagrammtypen, die als Keywords im Paketmanifest definiert sind (packages/mermaid/package.json:16-33):
- Flowchart: Klassische Flussdiagramme mit Entscheidungs Knoten und Verzweigungen
- Sequence Diagram: Interaktionsdiagramme für zeitliche Abläufe zwischen Akteuren
- Class Diagram: Objektorientierte Modellierung mit Klassen und Beziehungen
- State Diagram: Zustandsautomaten und Zustandsübergänge
- Entity Relationship Diagram: Datenbankmodellierung mit Entitäten und Relationen
- Gantt Chart: Projektplanung und Zeitstrahlen
- Pie Chart: Kreisdiagramme für proportionale Daten
- Git Graph: Visualisierung von Git-Branches und Commits
- Mindmap: Hierarchische Gedankenlandkarten
- C4 Diagram: Architekturdiagramme nach dem C4-Modell
- Quadrant Chart: Zwei-dimensionale Klassifikationsdiagramme
- Requirement Diagram: Anforderungsdiagramme für Systemanalyse
- Packet Diagram: Netzwerkpaket-Visualisierungen
Systemarchitektur
Die Architektur von Mermaid folgt einem modularen Design mit klar getrennten Verantwortlichkeiten. Das folgende Diagramm zeigt die Kernkomponenten und deren Beziehungen:
正在加载图表渲染器...
Architektur-Erklärung:
- Eingabeschicht: Akzeptiert Textdefinitionen in Markdown-ähnlicher Syntax und optionale Konfigurationsobjekte zur Anpassung des Rendering-Verhaltens
- Kernverarbeitung: Der Parser analysiert die Texteingabe, der Validator prüft die Syntaxkorrektheit, und der Renderer generiert das finale SVG
- Unterstützungsmodule: Utils stellt Hilfsfunktionen bereit, Styles verwaltet das Theme-System, und Logger ermöglicht Debugging-Ausgaben
- Ausgabeschicht: Produziert entweder ein fertiges SVG-Diagramm oder ein strukturiertes Fehlerobjekt bei Validierungsproblemen
Die Kernfunktion run() durchläuft das Dokument, findet Diagramdefinitionen und rendert diese (packages/mermaid/src/mermaid.ts:89-110). Dabei werden bereits verarbeitete Elemente mit dem Attribut data-processed markiert, um mehrfaches Rendering zu vermeiden.
Kernmodule und deren Verantwortlichkeiten
Parser- und Validierungsmodule
Das Parsing-Modul implementiert die Funktion parse(), die Texteingaben validiert und bei Fehlern detaillierte Informationen zurückgibt (packages/mermaid/src/mermaid.ts:328-349):
typescript1// Beispiel für Parse-Aufrufe 2console.log(await mermaid.parse('flowchart \n a --> b')); 3// { diagramType: 'flowchart-v2' } 4 5console.log(await mermaid.parse('wrong \n a --> b', { suppressErrors: true })); 6// false 7 8console.log(await mermaid.parse('wrong \n a --> b', { suppressErrors: false })); 9// throws Error
Verantwortlichkeitsgrenzen:
- Tut: Syntaxvalidierung, Diagramtyperkennung, Fehlerunterdrückung
- Tut nicht: Rendering, SVG-Generierung, Layout-Berechnung
Eintrittspunkte:
parse(text, parseOptions): Asynchrone ValidierungsfunktionsuppressErrors: Option zur Fehlerunterdrückung
Fehlerbehandlung:
Die Funktion handleError() differenziert zwischen detaillierten Fehlern und einfachen Fehlerstrings (packages/mermaid/src/mermaid.ts:64-87). Bei DetailedError werden str, hash und message extrahiert, während bei regulären Error-Objekten nur message und name verwendet werden.
Typdefinitionen und Datenstrukturen
Das Typsystem definiert präzise Schnittstellen für alle Diagrammelemente (packages/mermaid/src/types.ts:1-46):
typescript1// Knotenmetadaten 2interface NodeMetaData { 3 shape?: string; 4 label?: string; 5 icon?: string; 6 form?: string; 7 pos?: 't' | 'b'; 8 img?: string; 9 w?: string; 10 h?: string; 11 constraint?: 'on' | 'off'; 12 priority: 'Very High' | 'High' | 'Medium' | 'Low' | 'Very Low'; 13 assigned?: string; 14 ticket?: string; 15 labelType?: string; 16} 17 18// Kantenmetadaten 19interface EdgeMetaData { 20 animation?: 'fast' | 'slow'; 21 animate?: boolean; 22 curve?: 'basis' | 'bumpX' | 'bumpY' | 'cardinal' | 23 'catmullRom' | 'linear' | 'monotoneX' | 24 'monotoneY' | 'natural' | 'step' | 25 'stepAfter' | 'stepBefore'; 26} 27 28// Punktkoordinaten 29interface Point { 30 x: number; 31 y: number; 32}
Schlüsseldatenstrukturen:
NodeMetaData: Definiert Knoteneigenschaften mit 13 optionalen Feldern für Form, Label, Icon, Positionierung und PrioritätEdgeMetaData: Steuert Kantenanimation und Kurventypen mit 16 verschiedenen KurvenoptionenPointundBounds: Geometrische Grundtypen für Positionierung und Bemaßung
Hilfsfunktionen und Sicherheitsmodule
Das Utils-Modul stellt kritische Sicherheitsfunktionen bereit (packages/mermaid/src/utils.ts:241-260):
typescript1export function formatUrl(linkStr: string, config: MermaidConfig): string | undefined { 2 const url = linkStr.trim(); 3 4 if (!url) { 5 return undefined; 6 } 7 8 if (config.securityLevel !== 'loose') { 9 return sanitizeUrl(url); 10 } 11 12 return url; 13}
Sicherheitsmechanismen:
- URL-Sanitisierung: Verwendet
@braintree/sanitize-urlzur Bereinigung von URLs - Security-Level-Konfiguration: Unterscheidet zwischen
'loose'(keine Sanitisierung) und anderen Stufen (aktive Sanitisierung) - Leerstring-Behandlung: Gibt
undefinedfür leere URLs zurück
Zusätzliche Hilfsfunktionen:
interpolateToCurve(): Wandelt Interpolationsnamen in D3-Curve-Factories umrunFunc(): Führt Funktionen über Dot-Notation-Pfade aus (z.B.'myApp.utils.helper')calcLabelPosition(): Berechnet die optimale Position für Kantenlabels
Style- und Theme-System
Das Styling-Modul generiert dynamische CSS-Styles basierend auf dem gewählten Theme (packages/mermaid/src/styles.ts:6-35):
typescript1const getStyles = ( 2 type: string, 3 userStyles: string, 4 options: { 5 fontFamily: string; 6 fontSize: string; 7 textColor: string; 8 errorBkgColor: string; 9 errorTextColor: string; 10 lineColor: string; 11 } & FlowChartStyleOptions 12) => { 13 let diagramStyles = ''; 14 if (type in themes && themes[type]) { 15 diagramStyles = themes[type](options); 16 } else { 17 log.warn(`No theme found for ${type}`); 18 } 19 return ` & { 20 font-family: ${options.fontFamily}; 21 font-size: ${options.fontSize}; 22 fill: ${options.textColor} 23 } 24 @keyframes edge-animation-frame { ... } 25 ... 26}
Style-Generierungsprozess:
- Theme-Lookup: Sucht nach dem passenden Theme basierend auf dem Diagramtyp
- Fallback: Warnt bei fehlendem Theme und fährt mit leeren Styles fort
- CSS-Generierung: Kombiniert Theme-Styles mit globalen Einstellungen für Schriftart, Schriftgröße und Farben
- Animation-Keyframes: Fügt Keyframe-Animationen für Kantenanimationen hinzu
Datenfluss und Rendering-Pipeline
Der folgende Ablauf zeigt den vollständigen Datenfluss von der Texteingabe bis zum fertigen SVG-Diagramm:
正在加载图表渲染器...
Datenfluss-Erklärung:
- Initialisierung:
mermaid.run()durchsucht das DOM nach Elementen ohnedata-processed-Attribut - Parsing-Phase: Der Parser führt eine lexikalische Analyse durch und erstellt einen Abstract Syntax Tree (AST)
- Validierung: Der Validator prüft die Syntax gegen die Grammatikregeln des jeweiligen Diagramtyps
- Rendering: Bei erfolgreicher Validierung fordert der Renderer Styles vom Theme-System an und generiert SVG
- Fehlerbehandlung: Bei Validierungsfehlern wird ein strukturiertes Fehlerobjekt mit
str,hashundmessageerstellt
Die asynchrone Ausführung wird durch eine Queue verwaltet, die parallele Rendering-Anfragen serialisiert (packages/mermaid/src/mermaid.ts:310-326).
Verzeichnisstruktur
Die Kernstruktur des Mermaid-Pakets folgt einer klaren Trennung zwischen Quellcode, Typdefinitionen und Build-Artefakten:
packages/mermaid/
├── src/
│ ├── mermaid.ts # Haupteinstiegspunkt und API
│ ├── config.ts # Konfigurationsmanagement
│ ├── types.ts # TypeScript-Typdefinitionen
│ ├── type.d.ts // Globale Typdeklarationen
│ ├── utils.ts # Hilfsfunktionen
│ ├── styles.ts # Style-Generierung
│ ├── logger.ts # Logging-Infrastruktur
│ └── errors.ts # Fehlerklassen
├── dist/ # Kompilierte Ausgabe
│ ├── mermaid.core.mjs # ESM-Bundle
│ └── mermaid.d.ts # Typdeklarationen
└── package.json # Paketmanifest
Quantifizierte Projektkennzahlen
Basierend auf der Analyse der Quellcodedateien und des Paketmanifests:
| Metrik | Wert | Quelle |
|---|---|---|
| Unterstützte Diagrammtypen | 13+ | package.json Keywords |
| Produktionsabhängigkeiten | 20 | package.json dependencies |
| Entwicklungsabhängigkeiten | 33 | package.json devDependencies |
| TypeScript-Version | ~5.7.3 | package.json devDependencies |
| Kernmoduldateien | 8+ | src/ Verzeichnis |
| Export-Schnittstellen | 2 (ESM + Types) | package.json exports |
| Sicherheitsbibliotheken | 2 (DOMPurify, sanitize-url) | package.json dependencies |
Anwendungsszenarien
Mermaid eignet sich für folgende primäre Einsatzbereiche:
Dokumentationssysteme:
- Integration in Markdown-basierte Dokumentationsplattformen
- Automatische Diagramgenerierung aus Code-Kommentaren
- Live-Updates bei Dokumentationsänderungen
Entwicklungsworkflows:
- Architekturdokumentation in README-Dateien
- CI/CD-Pipeline-Visualisierung
- Git-Workflow-Darstellung
Projektmanagement:
- Gantt-Diagramme für Projektzeitpläne
- Anforderungsanalyse mit Requirement Diagrams
- Stakeholder-Kommunikation durch C4-Modelle
Bildung und Training:
- Erstellung von Lehrmaterialien
- Visualisierung komplexer Konzepte
- Interaktive Diagramme im Live Editor
Leseempfehlung für den Technologiebericht
Die folgende Grafik zeigt die empfohlene Lesereihenfolge für die einzelnen Kapitel dieses Technologieberichts:
正在加载图表渲染器...
Lesepfad-Erklärung:
- Projektüberblick: Verständnis der Grundkonzepte und des Technologie-Stacks
- Architektur: Tiefere Einblicke in die modulare Struktur und Komponenteninteraktionen
- Features: Detaillierte Analyse der unterstützten Diagrammtypen und deren Implementierung
- API-Design: Schnittstellen und Integrationsmöglichkeiten für Entwickler
- Datenmodell: Typsystem und Datenstrukturen der Diagramdefinitionen
- Abhängigkeiten: Externe Bibliotheken und deren Rolle im System
- Zusammenfassung: Konsolidierte Erkenntnisse und Bewertung
Diese Struktur ermöglicht sowohl einen linearen Durchgang für neue Leser als auch gezieltes Nachschlagen spezifischer Aspekte für erfahrene Entwickler.
