GatsbyJS: KaTeXで肥大したHTMLを軽量化する
GatsbyJSで作ったサイトに対して、Bing WebマスターツールのSEOレポートが心当たりのない警告を出してきた。
HTML の評価サイズが 125 KB を超えるものと予想されるため、完全にキャッシュされない可能性があります。
全てのページでこの警告が出ている。しかしそんなことになるような膨大なコードを書いた覚えはない。
なんだなんだと調査したところ、数式を表示するために入れたgatsby-remark-katex
というプラグインが原因だった。
gatsby-remark-katexの現状
概ねチュートリアル通り↓の感じで構築している。
plugins: [
{
resolve: `gatsby-transformer-remark`,
options: {
plugins: [
`gatsby-remark-katex`,
],
},
},
],
import "katex/dist/katex.min.css"
HTML肥大化の原因
gatsby-browser.js
で行っているkatex/dist/katex.min.css
のインポートが原因だった。
GatsbyJSはインポートしたCSSを全部まとめてギュッとして各htmlのヘッダーに埋め込むので、CSSが大きいとすべてのHTMLが肥大化する結果になってしまう。なのでKatexがどうこうというより、GatsbyJSの仕様上起こりやすい問題なのだろう。
通常のCSSならまぁ許容範囲内のサイズになると思うが、katex/dist/katex.min.css
はフォントを含んでいて極端にでかい。おおよそだがビルド後は130KBほどになっていた。Katextだけでアウトのサイズである。
外部ファイルならまだしも、すべてのHTMLに記述されているってのはなんともエコじゃない。どげんかせんといかん。
HTML・CSSの軽量化案
gatsby-browser.jsでのkatex/dist/katex.min.css
のインポートをやめて、CSSだけCDNを使うことにした。つまりnode_modulesのCSSは使わない。
.jsもCDNにしてもいいのだけど、レンダリングが遅くなりそうなのでcssだけで試してみる。html.jsにKatexのチュートリアル通りlinkを追加する。
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.8/dist/katex.min.css" integrity="sha384-GvrOXuhMATgEsSwCs4smul74iXGOixntILdUW9XmUC6+HX0sLNAK3q71HotJqlAn" crossorigin="anonymous">
これでめでたく全htmlが130KBほど軽くなった。
もちろん同等のCSSをCDNで読み込んではいるわけだが、外部ファイルならキャッシュされるので全ページで取得はしないで済むはず。
デメリットとしてgatsby-remark-katex
に更新があった場合、npm install
してもcssのバージョンは更新されないので注意が必要。
公式の使い方ではない自己責任モードだが、まぁプログラミングなんてもともと自己責任なので気にしない。
今のところちゃんと表示できています。