mermaid.jsによるSSRを試す
はじめに
先日から本ブログで使っているライブラリ(KaTeXやPrism.jsなど)についてSSRを行う方法を調べていたが、最後にmermaid.jsを試す。本当はGW中はブログをいじるつもりはなかったが、消化しておかないと落ち着かなかったため、さっさと調べてまとめておくことにした。
当初はこれまでの記事のようにJSDOMでやろうとしたが、SVGの出力が完全にブラウザ依存(具体的にはSVGTextElement.getBBox
ができない)であることが判明したため、今回はmermaid-cliを利用する。これは内部でPuppeteerを利用しているため原理上は動作する。
今回利用したパッケージのバージョンは以下のとおりである。なお、このバージョンではPuppeteerが古いと警告が出るが無視する。
ブラウザでのmermaid.jsの方法
書き方を割と忘れてしまっていたため、貼っておく。ついでに、SSRを行う場合の比較としても機能するだろう。
SSRの方法
今回は初手でHTMLファイル中のmermaid記法をダイアグラムに変換する処理を示す。それを行うにあたって以下のパッケージを導入する。
今回利用したパッケージのバージョンは以下のとおりである。
また、変換対象のHTMLは以下のとおりとする。これは、上で示したブラウザ上でmermaid.jsを利用するサンプルからJavaScriptを除去したものである。
以上で準備が整ったため、以下にSSRを行うコードを示す。mermaid-cliについてはESModule形式のインポートでなければ正しく動作しないためこのようにしている。やはり、ヘッドレスブラウザ(Pouppeteer)を利用する都合上、速度が遅いのが気になるとことである(おそらくオプションでいくらか高速化は可能と思われる)。なので、利用する場面はSSGなどにした方が無難ではあろう。
おわりに
Pouppeteerを使ってしまうのならば、SSRも全部Pouppeteerのレンダリング結果を使えばいいのでは的なことも考えられるが、どのタイミングがレンダリングの完了とみなせるかといった問題があったり、その問題によりいわゆるハイドレーションが正しく実施できないなどの問題が連鎖的に生じることも考えられる。そのため、Pouppeteerの利用は限定的にしていきたいところである。まぁ前回までに示したMathJaxやprism.jsならば、非同期処理を適切に同期するようにするのならば、Pouppeteerを利用してSSRを行うことも可能だろう(利点が部分的にCSRで行う場合と同じコードが利用できることとJSDOMからの開放くらいしかないためそこまでの意味はないが)。