このサイトをmrubyファミリーでSSR+SPAするようにしました

自分のドメインと、HTMLとRSSという開いた標準で発信する場所として、このサイトを作りました。

最初はRuby製の自作ミニSSGでした。いまはuzumibiとFunicularに載せ替えて、CloudflareのエッジでSSRするSPAになっています。外から見た形は変えていません。HTMLが返り、RSSが出て、URLもそのままです。変えたのは中身のほうだけです。

なぜ載せ替えたか

SSGは極めてシンプルなものの共通部分に手を加えると記事を再度焼く必要があるので、実験的なことを仕込むにはちょっと手間があるなと悩んでいました。

そんな中 uzumebifunicular でSSR + SPAにすると自由度とシンプルさが両立できるのではないか、そして❤️を飛ばすところもPicoRuby:wasmだし、全部mrubyファミリーで統一できていいのではと思ったのです。

FunicularはPicoRubyのフレームワークでブラウザで動きます。uzumibiはmruby/edgeの上のWebフレームワークで、Cloudflare Workersで動きます。この2つを同じコンポーネントで繋ぎました。

app/funicular/    両方が読む
workers/uzumibi/  エッジだけ

app/funicular/の下のコンポーネントを、エッジのmruby/edgeとブラウザのPicoRubyが同じものとして読みます。workers/uzumibi/にはエッジだけの担当、SSRのレイアウトと❤️のAPIを置いています。

いつ、何がコンパイルされるのか

Rubyのコードは、ブラウザにもエッジにも、どちらもバイトコードを焼いて展開します

コンパイラはPicoRubyに付いてくるmrbcで、これが同じソースから2つの成果物を作ります。

         Rubyのソース
              |
             mrbc
              |
       +------+------+
       |             |
public/app.mrb  hearts.wasm
       |             |
   PicoRuby     mruby/edge

なお、どちらのファイルも、先頭8バイトがRITE0400です。mruby 4.0の形式なのですが、mruby/edgeは現時点ではまだそれを読めませんでした。

そこで手元でmruby/edgeに勢いでパッチを当ててRITE0400対応をしました。品質や機能カバレッジほどはさておき、このホームページに必要な分は動いています。ここから精査してPRなどできればと思います。

またuzumibiにもCloudflareで使いたい機能があったので、勢いで手元でパッチを当てています。こちらもPRなど整理したあとできればと思います。