こんにちは、asatoです。
このブログはAstro & Markdocを使っています。ブログ内でMermaidを利用したく、試行錯誤したので、最終的にどう実現したのかまとめておきます。
実際のコードはGitHubで公開しています。
Table of Contents
用語
Astro
Astroはコンテンツ駆動のウェブサイトを作成するためのウェブフレームワークです。ブログなどに適しています。詳しくは公式サイトをご覧ください。
Markdoc
MarkdocはMarkdownベースのオーサリングフレームワークです。Markdownを自分好みに拡張できるイメージです。Markdownの記法の挙動をカスタマイズしたり、新たなタグを作成したりできます。
AstroでのMarkdocの利用方法は公式で用意されており、簡単に使い始めることができます。このブログの内容はこの手順ですでにmarkdocが導入されている前提です。
Mermaid
MermaidはダイアグラムやチャートをMarkdownのような書き心地で描くためのツールです。
やりたいこと - ブログ内でMermaidを使いたい
ブログ内で次のようにMermaidのコードを書くことでダイアグラムが描写されるようにしたい。
課題 - Mermaidはクライアントで動作するのでAstroでは工夫が必要
Astroはサイトの高速化のため、SSG(Static Site Generation)が採用されています。一方、Mermaidはフロントで動作するツールなので、少し工夫が必要です。
解決方針 - Astroアイランド
Astroでは、一部のコンポーネントを動的に、またはクライアントサイドで動作させるための手段として、Astroアイランドを用意しています。
今回は、Astroアイランドを利用してReactコンポーネントでMermaidをレンダリングさせてみます。
実装
Markdocでcode fenceをカスタマイズ
今回はcode fence(```で囲まれたやつ)の言語指定でmermaid
を定義したときにMermaidの図が描写されるようにしたいです。そのため、まずはcode fenceをカスタマイズする準備をします。
ディレクトリ構造は以下です(関連部分を抽出)。
code fenceのハイライトにはExpressive Codeを使っています。インストール手順などは公式サイトを参照してください。
これでcode fenceをカスタマイズする準備が整いました。
language = mermaidの時はクライアントでMermaidを描写する
Astroアイランドを使います。UIフレームワークはReactを選択します。ReactをAstroに導入する手順は公式サイトを参照してください。
では、Mermaidをinstallします。
Mermaidを描写するReactコンポーネントを作成します。
Mermaidはデフォルトでclass
にmermaid
が与えられているpre
またはdiv
タグ内を解析し、図を描写してくれます。useEffect内でmermaid.contentLoaded()
を呼ぶことで描写をトリガーしています。
では、Fence.astroを編集してMermaidの描写を実現します。
client:only={React}
を指定しクライアントでのみ描写されるようにしています。
動作確認
ブログ内でmermaidのコードを書いて、正しく表示されるか確かめます。
表示が確認できました。
まとめ
このブログでは、クライアントでしか動作しないMermaidをAstro + Markdocの環境に導入する方法をまとめました。これでMermaidのいい感じなダイアグラムを手に入れました。
このブログが誰かの役に立ちますように。