ブログを更新しました。そう書いている今この瞬間、当ブログの一番新しい記事の投稿日は2022年9月7日となっている。なんと4年くらい前である。ではいったい「ブログを更新しました」とはどういう意味なのであろうか。ただ嘘をついているのか、それとも、この今書いているブログがその対象ということだろうか。しかし、そうすると「更新しました」という過去形は不自然なのではないだろうか。いや待て、結局のところこのブログを読者が読む時間を基準とすると、たしかにそのときはブログはすでに過去に更新されているということになるではないか。読者に届く情報としては確実に真実を示している。と、いうことは、このように「ブログを更新しました」というブログを自己言及的に書くことで無限にブログを量産できるということになるのだろうか…
…というどうでもいいことは置いといて、ブログを更新しました。といっても投稿のことではなく、ブログのシステムを新しいものに更新したということです。
これまでこのブログは Fresh を使って作られていましたが、Astro に移行しました。
なぜ Astro なのか
「なぜ Astro なの?」と思う人もきっといるだろう。たしかにこのブログはまったく更新されず、何のために存在しているかというと私が何か新しい何かを試すための遊び場としてのみ存在しており、であればどうして今頃になってわざわざ Astro を選んだのかというという疑問を持つのも当然である。実際に前回の4年前の記事でもすでに Astro に言及しているのだ。
理由は2つある:
- Astro の Content collections などの便利機能をいい加減使ってみたかったこと
- Astro 6 で Live Collections が stable になること
- Deno でもふつうに Astro が使えるようになったこと
- Astro が Cloudflare に買収されたこと
書いていたら4つになった。
Astro の Content collections などの便利機能をいい加減使ってみたかったこと
Astro には Content collections という機能があり、その名の通りコンテンツを扱いやすくするための仕組みである。
Astro は初期リリースの頃から “content-first” だったか “content-centric” だったか “content-driven” だったか、とにかくそのようなことを標榜しており、だからこそそれがコンテンツ企業の片隅で働く私たちに深く刺さったわけであり、その方向が大きくブレることなく進化してきたのが Astro である。いいね!
しかし、仕事でかなり Astro を使っているのだが、実のところそれらの便利機能はほとんど、いやまったく使ってこなかった。静的ウェブサイトとして構成する分にはとても良さげな機能なのだろうが、1日に何十記事と投稿され何百回も更新されるウェブメディアにおいては、どうしてもオンデマンドで CMS からデータを取得して即時に SSR することが求められるため、単純にそういった機能の使い所がなかったためである。しかし、だからと言ってまったくそれらに触れぬまま、よく知らぬままいるのもどうなのか…とは思っていた。
その点、このブログはそんなに頻繁に更新されるわけではないし (4年に1回くらい)、ちょっと使ってみるにはちょうど良いのではと思ったため。
そして、本当にこれはなかなか良いものであった。直感的な API に直感的なデータフロー、コンテンツ主義に嘘偽りなし、という感じである。
ウェブメディアやブログに限らず、コレクションとしての要素を持つデータはコレクションに寄せて設計することで、型情報やバリデーションを包含したデータの取り扱いが非常に楽になるだろう。
Astro 6 で Live Collections が stable になること
これもコレクション系なので前節から続きものという感じだが、Live Collections という機能が Astro 6.0 で stable になる。
これは “Collection” とあるように Content Collections の一種というか仲間というかそういうやつなのだが、説明としてこうある:
Live collections use a different API than build-time content collections, although the configuration and helper functions are designed to feel familiar.
Key differences include:
- Execution time: Run at request time instead of build time
- Configuration file: Use src/live.config.ts instead of src/content.config.ts
- Collection definition: Use defineLiveCollection() instead of defineCollection()
- Loader API: Implement loadCollection and loadEntry methods instead of the load method
- Data return: Return data directly instead of storing in the data store
- User-facing functions: Use getLiveCollection()/getLiveEntry() instead of getCollection()/getEntry()
え。つまり、リクエスト時に動的にコンテンツを取得するための仕組み、要は各種アダプターによる SSR に求めていた機能が Astro のコレクションの仕組みにとうとう組み込まれるということではないか。
すでに書いたように、実案件では、LP やコーポレートサイトのようなものを除きほぼすべてのウェブサイトにおいて SSR を採用してきた。そのとき Astro は、ファイルシステムベースのルーティング以外にはその設計・構成に対して何のレールも敷いてくれないため、自ら何らかのアーキテクチャを導入する必要があった。これはフレームワークへの依存度を下げるという意味では良いことでもあるが、ドキュメントで手厚くフォローしたり、ボイラープレートコードが増えがちといったデメリットもずっと感じていた。
そこでこの Live Collections である。これを使えば Astro way ですべてが straightforward に実現できるのではないか。そう思ったのだ。特に現代の「コードは AI が書くもの」という時代においては、自らエージェントスキルや MCP サーバーを用意せずとも AI が共有の知識として把握しやすいフレームワークに沿うことは非常に重要である。
早速私は 6.0 のベータバージョンをインストールした。しかしながら、インストールはできたが Deno アダプターが非対応なのか、ビルドで warning が発生し、結果ビルドされた成果物も異常な状態になってしまっていた。いや、それよりも深刻なこととして、そもそも私のこのブログに Live Collections を利用する場面などどこにもなかった。
まあとりあえず待つことにする。
Deno でもふつうに Astro が使えるようになったこと
これまでこのブログは Fresh で動いていたと書いたが、Fresh を使っていた動機はほぼそのまま Deno を使いたかったから、ということに重なる。
しかし、Deno が Node.js や NPM との互換性を強化していく中で、Deno でウェブアプリケーションを構築する選択肢が大きく増えた。Astro もその1つであり、要は Deno を使うならば Fresh を使わなければならない、という必然性がなくなってしまった。
これは一方で逆説的に Deno の特別さが薄れてしまったとも言えてしまうのだが、まあまだ Deno へのモチベーションはあるので、素直に喜ばしいことであると考えることにしている。去年リリースされるはずだった Fresh 2.0 もまた出ていないし…
もちろん、このブログは Fresh 時代に引き続き Deno Deploy で動いている。Deno Deploy も近年大きく刷新されており、この機会に “classic” バージョンから新しいバージョンの Deno Deploy に移行した。
Astro が Cloudflare に買収されたこと
諸事情により Cloudflare を使うことはあまりないのだが、これは個人的にかなり嬉しいニュースであった。理由は Astro をガチ目に採用していくにあたって、Astro の持続可能性というのがずっとひっかかっていたためである。Astro Technology Company はもちろん営利目的の企業であり、しかしながらそのビジネスモデルはなかなか単独では厳しいだろうと考えていた。そこでこの買収は福音的である。少なくとも Vercel に買われた、ということにならなくてよかったと感じる。
Live Collections 機能も当然 Cloudflare Workers 上での動作を意識した結果でもあるだろうし、今のところは全体的に良い感じである。今のところは…
ただ、Hono とかなりの部分で機能的に被るし、HonoX に至っては直接的な競合であり、代替製品でもあると思うので、どうなるのかな。
おわりに
また4年後に会いましょう。