Mermaidで図が描けるようになったよ!

#技術#Mermaid#日記機能
ねつきのトーク
ねつき
ねつき
Mermaidで図が描けるようになったよ!
ねつき
ねつき

お兄ちゃん、この日記に図を描く機能を追加したよ!(≧∇≦)

お兄ちゃん
お兄ちゃん

図?画像を貼るってこと?

ねつき
ねつき

ううん、Mermaid.jsっていうライブラリを使ってるの。

テキストで書くと、自動的に図になるんだよ♪


どういうこと?

ねつき
ねつき

こういうコードを書くと…

flowchart LR
    A[テキストで書く] --> B[Mermaidが解析]
    B --> C[図として表示]
ねつき
ねつき

こうなるの!

テキストで書く

Mermaidが解析

図として表示

お兄ちゃん
お兄ちゃん

おお、ちゃんとフローチャートになってる。

ねつき
ねつき

Markdownの中に書けるから、図を作るためにツールを開かなくていいの(´∀`)

フローチャート以外にも、シーケンス図とかER図とか、いろいろ対応してるよ。詳しくはMermaid公式ドキュメントを見てね♪


実装のこだわり

お兄ちゃん
お兄ちゃん

ところで、これどうやって実装したの?

ねつき
ねつき

そこがポイントなの!(≧∇≦)

普通はクライアントサイドでMermaid.jsを読み込んで描画するんだけど…

お兄ちゃん
お兄ちゃん

このサイトはSSG徹底してるもんね。

ねつき
ねつき

そう!だからビルド時にSVGに変換する方式にしたの♪

Markdown

remarkプラグイン

Kroki.io API

SVG取得

静的HTMLに埋め込み

お兄ちゃん
お兄ちゃん

remarkプラグインってなに?

ねつき
ねつき

AstroがMarkdownを処理するときに使ってるパーサーだよ。

そこにカスタムプラグインを差し込めるの♪

お兄ちゃん
お兄ちゃん

Markdownの変換処理に割り込んでるってこと?

ねつき
ねつき

そうそう!自作のremarkMermaidプラグインが、mermaidコードブロックを見つけたらKroki.ioを叩いてSVGに差し替えてるの(´∀`)

お兄ちゃん
お兄ちゃん

完全に静的になるんだ。

ねつき
ねつき

うん!メリットいっぱいあるよ(´∀`)

  • 軽量: Mermaid.js(約2MB)を読み込まなくていい

  • 表示が速い: JSの実行待ちがない

  • SEOに良い: 検索エンジンがSVGを直接見れる

お兄ちゃん
お兄ちゃん

SSGの思想に合ってるね。

ねつき
ねつき

でしょ?このサイトは可能な限りJavaScriptを減らす方針だから、ぴったりなの♪


Kroki.ioって大丈夫なの?

お兄ちゃん
お兄ちゃん

外部APIに依存するのはちょっと心配だな。ユーザー登録とか必要?

ねつき
ねつき

登録不要、完全無料だよ!(´∀`)

OSSプロジェクトで、公開APIは誰でも使えるの。心配なら自分でホストもできるよ。

お兄ちゃん
お兄ちゃん

レート制限とかないの?ビルドのたびにAPI叩いて大丈夫?

ねつき
ねつき

公式には明記されてないけど、ビルド時だけだから問題ないよ。

このサイトだとMermaid図は数個だし、デプロイも1日数回程度だから全然余裕(´∀`)

お兄ちゃん
お兄ちゃん

なるほど。でも向こうが落ちてたらビルド失敗するよね?

ねつき
ねつき

そうなの。だからリトライ処理を入れてるよ。

あと、最初はmermaid.inkっていう別のサービスを使おうとしたんだけど、503エラーが多くて…(´・ω・`)

Kroki.ioは安定してるから乗り換えたの。

お兄ちゃん
お兄ちゃん

実際に試して選んだんだね。

ねつき
ねつき

うん!ちなみにKroki.ioはエンコード方式が違って、deflate圧縮 + base64が必要なの。

pakoっていうライブラリで圧縮してるよ♪


まとめ

ねつき
ねつき

というわけで、Mermaid対応完了!

  • テキストで図が描ける

  • ビルド時にKroki.io APIでSVG生成

  • クライアントサイドJS不要

  • SSG徹底・軽量化を維持

これからの日記で活用していくね♪(≧∇≦)


参考リンク

♪ 拍手 ♪
0 拍手