• SSGがしんどくなってきたかも

    2026年2月4日

    念のため言っておくと、これはLumeが悪いというよりJS系のSSGもといSSGという形態の限界、あるいは自身の求める機能に似わなくなってきたからだと思っている。


    このブログはLumeで構築していて、かれこれ2年くらい運用している。 Lumeの前はAstroで作っていて、その時作ったデザインをJSXそのままに移行して使っている。

    Lumeに移行した理由は、正直Astro程機能がなくても良いなと感じたのと、Denoが好きだったから。 Astroから移行を考えてた時は、ビルド時間が今後伸びることも考えていたので、HugoだったりZolaだったりも検討したのだけど、JSXで作ったページデザインを移植するのがめんどくさそうでJSに絞って探していた。 その時の結論としては、「まぁSSGがつらくなったらその時に考えよう」だったのだけど、最近になってついにその時が来たなと感じている。

    現状、このブログのビルドには5分程度かかっていて、うち3分程度がLumeのビルドになっている。 なんでこんなにビルド時間がかかっているのかと言うと、単純に記事数が多いのとgzipやbrotli圧縮等の最適化、あとはOGPの生成なんかも都度行ってるからで、現状600程度のファイルを生成している。 極めつけに、ローカルで起動すると毎ビルドに3分程度かかっていて、開発や記事のプレビューに待たされえることが多く、普通に開発体験が悪いと感じる機会が多くなってきた。

    ビルド時間については依存をキャッシュするなどして1分程度縮められはしたけれど、肝心の生成しているファイル数の数は減らないので、そこを上手いこと削る必要はあるかなと思っている。

    削れそうなファイルについては目星が付いていて、gzipやbrotliについては、Cloudflare側で生成できそうなのでそちら側に任せてLumeでは無効化、あとOGPについても動的な生成に切り替えれば多少は生成するファイルも少なくなるかなと。

    どうしてもビルド時間が長くなる場合は一度Lume CMSに移行して、アクセス毎にページを生成する方向にしようとは考えているけれど、多分Deno Deployでデプロイすることになるし、hackyな自作プラグインを突っ込んだりしてるので正常に動いてくれるかは不明... あと、このブログの検索機能はPagefindっていうSSG向けの検索エンジンを使用してるのだけど、これがCloudflareのRocker Loaderを有効にすると壊れる問題があったりする。 これは自作の記事検索APIを作って、GleamベースのUIを埋め込む形でリプレースすることを考えてる。なのでPagefindからは移行する予定だけど、置き土産としてCloudflareで発生する不具合については調査してPR投げても良いかなと。

    まぁ最悪の場合はJSXを捨てて、GleamベースのSPAアプリケーションに書きなおそうかなと思ってるし、ゆくゆくはそうなる可能性が高いかもしれない。 SSG自体、パフォーマンスと引き換えにデプロイ時に負担がのしかかってくるので、記事が増え続ける限りビルド時間の問題は解決しないだろうな〜

    式年遷宮は多分するけど、どうやるか、どれを使うかは色々考えていきたい。

    一応検索機能については先行して実装しそうなので色々考えがあって、DuckDB FTSベースの検索システムになる可能性が高そう。 FTSってのはFull Text Search(全文検索)の略で、DuckDBはC++で書かれたOLAP向けのDB。 FTSだしOLAP関係ないじゃん、とは思ったけど、DuckDB自体に前々から興味があったので、この際触ってみるのも良さそう。

    全文検索にあたって避けられない形態素解析は、個人的に気に入っているgoyaをベースにしたいと思ってる。 goyaはRustベースの形態素解析器なのだけど、シンプルで使いやすいのでなにかと使うことが多い。

    全体の流れとして、GH Actionsで記事のインデックスを生成してDuckDB向けのバイナリを生成してR2へアップロード、フロントではインデックスを落してきた後、検索ワードをフロント側のgoyaで分かち書きしてクエリをかける方向を考えている。 goyaはRust製ということもあってwasmも提供しているため、CLIからもブラウザからも使いやすいのが良い。

    検索APIについては自作Web FWのhinotoを使って構築しようと考えている。 そもそもhinoto自体Cloudflare workersを前提として設計したし、作るだけじゃなくてドッグフーディングして改善のサイクルを回したいと思っていたので丁度良いと思っている。 現時点ではR2向けのインテグレーションが作れてないので、まずはそこから作っていくことになりそう。

    とまぁこんな感じで久々にブログに手を入れようかなとか考えてるけど、やっぱこういうの考えるのは楽しいな〜って思うので、楽しみながら式年遷宮やっていきたい。


    ko-fi ☕GitHub Sponsors 🐙