Astroプロジェクトにダイアグラムを簡単に追加できるMermaidを導入する方法を解説します。Mermaidを使えば、フローチャート、シーケンス図、ガントチャートなどの視覚的な表現を簡単に作成できます。プロジェクトをよりビジュアルで魅力的にするために、さっそく導入方法を確認していきましょう。
この記事で学べること
- Mermaidのインストールと基本設定
- Astro用Mermaidコンポーネントの作成方法
- 各種ダイアグラムの作成方法(フローチャート、シーケンス図、ガントチャートなど)
- テーマのカスタマイズとスタイリング
- ダークモード対応の実装
Mermaidとは
Mermaidは、テキストベースの記法でダイアグラムを作成できるJavaScriptライブラリです。コードを書くようにダイアグラムを定義でき、バージョン管理も容易です。
対応するダイアグラムの種類
| ダイアグラム | 用途 | 記法の開始 |
|---|---|---|
| フローチャート | プロセスの流れを表現 | graph TD / flowchart TD |
| シーケンス図 | オブジェクト間のやり取り | sequenceDiagram |
| クラス図 | クラス構造の表現 | classDiagram |
| 状態図 | 状態遷移の表現 | stateDiagram-v2 |
| ER図 | データベース設計 | erDiagram |
| ガントチャート | プロジェクト管理 | gantt |
| パイチャート | 割合の可視化 | pie |
| マインドマップ | アイデアの整理 | mindmap |
Mermaidのインストール
まず、Mermaidをプロジェクトにインストールします。以下のコマンドを使用して、npmを使ってインストールしましょう。
# npmの場合
npm install mermaid
# pnpmの場合
pnpm add mermaid
# yarnの場合
yarn add mermaid
MermaidChartコンポーネントの作成
次に、src/components/MermaidChart.astroというファイルを作成し、Mermaidチャートをレンダリングするコンポーネントを作成します。
基本的なコンポーネント
---
// src/components/MermaidChart.astro
interface Props {
chart: string;
theme?: 'default' | 'forest' | 'dark' | 'neutral' | 'base';
}
const { chart, theme = 'default' } = Astro.props;
const themedChart = `%%{init: {'theme':'${theme}'}}%%\n${chart}`;
---
<div class="mermaid">
{themedChart}
</div>
<script>
import mermaid from 'mermaid';
// Mermaidの初期化設定
mermaid.initialize({
startOnLoad: true,
securityLevel: 'loose',
theme: 'default',
});
</script>
<style>
.mermaid {
margin: 1.5rem auto;
text-align: center;
}
.mermaid svg {
max-width: 100%;
height: auto;
}
</style>
このコンポーネントは、渡されたchartを受け取り、Mermaidを使ってその内容をレンダリングします。themeプロパティでテーマを指定することもできます。
高度なコンポーネント(View Transitions対応)
Astroの View Transitions を使用している場合は、ページ遷移時にも正しく動作するように以下のように改良します。
---
// src/components/MermaidChart.astro
interface Props {
chart: string;
theme?: 'default' | 'forest' | 'dark' | 'neutral' | 'base';
id?: string;
}
const { chart, theme = 'default', id } = Astro.props;
const themedChart = `%%{init: {'theme':'${theme}'}}%%\n${chart}`;
const uniqueId = id || `mermaid-${Math.random().toString(36).substr(2, 9)}`;
---
<div class="mermaid-container" id={uniqueId}>
<div class="mermaid">
{themedChart}
</div>
</div>
<script>
import mermaid from 'mermaid';
// 初期化関数
const initMermaid = () => {
mermaid.initialize({
startOnLoad: false,
securityLevel: 'loose',
theme: 'default',
});
// 全てのMermaid要素をレンダリング
mermaid.run({
querySelector: '.mermaid',
});
};
// 初回ロード時
initMermaid();
// View Transitions対応
document.addEventListener('astro:after-swap', initMermaid);
</script>
<style>
.mermaid-container {
margin: 1.5rem 0;
overflow-x: auto;
}
.mermaid {
display: flex;
justify-content: center;
}
.mermaid svg {
max-width: 100%;
height: auto;
}
</style>
テーマの適用
Mermaidには複数のテーマが用意されています。デフォルトのテーマを適用することもできますが、プロジェクトのスタイルに合わせてテーマをカスタマイズすることが可能です。
利用可能なテーマ
-
default - デフォルトテーマ
%%{init: {'theme':'neutral'}}%% %%{init: {'theme':'default'}}%% graph TD A[開始] --> B{条件分岐} B -->|はい| C[処理1] B -->|いいえ| D[処理2] C --> E[終了] D --> E -
forest - 緑基調のテーマ
%%{init: {'theme':'neutral'}}%% %%{init: {'theme':'forest'}}%% graph TD A[開始] --> B{条件分岐} B -->|はい| C[処理1] B -->|いいえ| D[処理2] C --> E[終了] D --> E -
dark - ダークテーマ
%%{init: {'theme':'neutral'}}%% %%{init: {'theme':'dark'}}%% graph TD A[開始] --> B{条件分岐} B -->|はい| C[処理1] B -->|いいえ| D[処理2] C --> E[終了] D --> E -
neutral - ニュートラルテーマ
%%{init: {'theme':'neutral'}}%% %%{init: {'theme':'neutral'}}%% graph TD A[開始] --> B{条件分岐} B -->|はい| C[処理1] B -->|いいえ| D[処理2] C --> E[終了] D --> E -
base - ベーステーマ(カスタマイズ用)
%%{init: {'theme':'neutral'}}%% %%{init: {'theme':'base'}}%% graph TD A[開始] --> B{条件分岐} B -->|はい| C[処理1] B -->|いいえ| D[処理2] C --> E[終了] D --> E
コンポーネントの使用方法
作成したMermaidChartコンポーネントは、以下のように簡単に使用できます。
基本的な使い方
---
import MermaidChart from '../components/MermaidChart.astro';
---
<MermaidChart chart={`
graph TD
A[開始] --> B{条件分岐}
B -->|はい| C[処理1]
B -->|いいえ| D[処理2]
C --> E[終了]
D --> E
`} />
表示結果
様々なダイアグラムの作成例
フローチャート(詳細版)
フローチャートでは様々なノード形状やリンクスタイルが使えます。
graph TD
A[四角形] --> B(角丸四角形)
B --> C{ひし形}
C -->|条件1| D[[サブルーチン]]
C -->|条件2| E[(データベース)]
D --> F((円形))
E --> F
F --> G>旗形]
| ノード形状 | 記法 | 用途 |
|---|---|---|
| 四角形 | [テキスト] | 一般的な処理 |
| 角丸 | (テキスト) | 開始・終了 |
| ひし形 | {テキスト} | 条件分岐 |
| 円形 | ((テキスト)) | 接続点 |
| サブルーチン | [[テキスト]] | 関数呼び出し |
| データベース | [(テキスト)] | データストア |
シーケンス図
オブジェクト間のやり取りを時系列で表現します。
<MermaidChart chart={`
sequenceDiagram
participant U as ユーザー
participant F as フロントエンド
participant A as API
participant D as データベース
U->>F: ログインボタンクリック
F->>A: POST /api/login
A->>D: ユーザー検索
D-->>A: ユーザー情報
A-->>F: JWT トークン
F-->>U: ダッシュボードへ遷移
`} />
ガントチャート
プロジェクトのスケジュール管理に使用します。
<MermaidChart chart={`
gantt
title プロジェクトスケジュール
dateFormat YYYY-MM-DD
section 企画
要件定義 :a1, 2024-01-01, 7d
設計 :a2, after a1, 5d
section 開発
フロントエンド :b1, after a2, 14d
バックエンド :b2, after a2, 14d
section テスト
単体テスト :c1, after b1, 5d
結合テスト :c2, after c1, 5d
`} />
クラス図
オブジェクト指向設計の表現に使用します。
<MermaidChart chart={`
classDiagram
class User {
+String id
+String name
+String email
+login()
+logout()
}
class Post {
+String id
+String title
+String content
+Date createdAt
+publish()
}
class Comment {
+String id
+String body
+Date createdAt
}
User "1" --> "*" Post : creates
Post "1" --> "*" Comment : has
User "1" --> "*" Comment : writes
`} />
ER図
データベース設計に使用します。
<MermaidChart chart={`
erDiagram
USER ||--o{ POST : creates
USER ||--o{ COMMENT : writes
POST ||--o{ COMMENT : has
USER {
string id PK
string name
string email UK
datetime created_at
}
POST {
string id PK
string user_id FK
string title
text content
datetime published_at
}
COMMENT {
string id PK
string post_id FK
string user_id FK
text body
datetime created_at
}
`} />
状態図
状態遷移を表現します。
<MermaidChart chart={`
stateDiagram-v2
[*] --> 下書き
下書き --> レビュー中 : 提出
レビュー中 --> 修正中 : 差し戻し
レビュー中 --> 承認済み : 承認
修正中 --> レビュー中 : 再提出
承認済み --> 公開済み : 公開
公開済み --> [*]
`} />
カスタマイズとスタイリング
Mermaidのスタイリングは、CSSを使ってさらにカスタマイズすることが可能です。
基本的なスタイリング
.mermaid {
margin-top: 1rem;
margin-bottom: 1rem;
}
.mermaid svg {
margin-left: auto;
margin-right: auto;
display: block;
}
.mermaid .node rect {
fill: white;
stroke: #d1d5db;
}
.mermaid .edgePath .path {
stroke: #9ca3af;
}
.mermaid .label {
font-family: sans-serif;
font-size: 0.875rem;
color: #374151;
}
ダークモード対応
/* ダークモード対応 */
.dark .mermaid .node rect {
fill: #374151;
stroke: #6b7280;
}
.dark .mermaid .edgePath .path {
stroke: #d1d5db;
}
.dark .mermaid .label {
color: #e5e7eb;
}
/* ダークモードでのテーマ変数カスタマイズ */
.dark .mermaid {
--mermaid-font-family: 'sans-serif';
--mermaid-primary-color: #60a5fa;
--mermaid-primary-text-color: #f3f4f6;
--mermaid-line-color: #9ca3af;
}
カスタムテーマの定義
Mermaidのinitディレクティブを使って、細かくカスタマイズできます。
<MermaidChart chart={`
%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#3b82f6',
'primaryTextColor': '#ffffff',
'primaryBorderColor': '#2563eb',
'lineColor': '#6b7280',
'secondaryColor': '#f3f4f6',
'tertiaryColor': '#fef3c7'
}
}}%%
graph TD
A[開始] --> B{判定}
B -->|Yes| C[処理A]
B -->|No| D[処理B]
C --> E[終了]
D --> E
`} />
トラブルシューティング
よくある問題と解決方法
| 問題 | 原因 | 解決方法 |
|---|---|---|
| 図が表示されない | Mermaidの初期化前にDOMが描画された | mermaid.run()を明示的に呼び出す |
| テーマが適用されない | ディレクティブの記法ミス | %%{init: {'theme':'dark'}}%%の形式を確認 |
| ページ遷移後に表示されない | View Transitionsとの競合 | astro:after-swapイベントで再初期化 |
| 日本語が文字化けする | フォント設定の問題 | CSSでfont-familyを明示的に指定 |
デバッグ用設定
mermaid.initialize({
startOnLoad: true,
securityLevel: 'loose',
logLevel: 'debug', // デバッグログを有効化
});
まとめ
これで、AstroプロジェクトにMermaidを導入し、ダイアグラムを簡単に作成できるようになりました。
ポイントの振り返り
- インストール:
npm install mermaidで簡単に導入 - コンポーネント化: 再利用可能なAstroコンポーネントを作成
- 多様なダイアグラム: フローチャート、シーケンス図、ガントチャートなど対応
- テーマ: 5種類の組み込みテーマ + カスタムテーマ
- スタイリング: CSSでダークモード対応も可能
Mermaidを使うことで、複雑なフローチャートやシーケンス図、ガントチャートなどを視覚的に表現でき、プロジェクトのドキュメントやプレゼンテーション資料などにも活用できるでしょう。
参考文献
- Mermaid 公式ドキュメント
- Mermaid Live Editor - オンラインでMermaidを試せるエディタ
- Mermaid GitHub
- Astro 公式ドキュメント - Scripts