Astro & Reactで自作ブログを作った

このブログは、Astro で構築されています。

Astroは、コンテンツ中心のサイトを作るためのウェブフレームワークです。ReactやVue、Svelteなどのコンポーネントをそのまま書きながら、ビルド時にHTMLとして出力されるため、デフォルトでJavaScriptがほとんどページに含まれません。「Islands Architecture」という設計思想を採用しており、インタラクティブにすべき部分だけを選んで有効化できます。

ブログに向いている理由

静的サイトのためのフレームワークはたくさんありますが、Astroがブログに特に向いていると思う理由は3点です。

JavaScriptを最小限にできる。ほとんどのブログ記事はJSが不要です。Astroはそのことを前提として設計されていて、何も設定しなければクライアントに送るJSはほぼゼロです。速さとシンプルさが最初からついてきます。

書きなれたReactをそのまま使える。べた書きのHTMLだけで全部実装するのは非現実的ですが、Astroなら.astroファイル内でReactコンポーネントを混在させられます。ヘッダーやカード一覧など、少し複雑な部品が必要なときに自然に使えます。

MDXで記事の自由度が高い。MDXはMarkdownの中にJSXを書けるフォーマットで、AstroはMDXを標準でサポートしています。記事の中にコンポーネントをそのまま埋め込めるため、表現の幅が広がります。例えばこういうことができます:

MDXでネイティブHTML要素も使える(クリックして展開)
details タグと summary タグはHTMLのネイティブ折りたたみ要素です。JavaScriptなしで動作するのに、MDXの中にそのまま書けます。コンポーネントを自作しなくてよい分、内容に集中できます。

実際のパフォーマンスを見てみる

Astroが「速い」というのは体感だけでなく、数値でも確認できます。このブログのLighthouse結果です。

99
Performance
100
Accessibility
100
Best Practices
100
SEO

JSを削ればこうなります。数値よりも「ページを開いた瞬間」に速さを感じる体験の差が大きいです。

デザインはPencilで

実装に入る前に、Pencil(ワイヤーフレームツール)でモックを組みました。いつもコードから入って途中で迷走するパターンが多かったので、今回は先にレイアウトを決めてから実装する順番にしました。

結果として、思ったよりずっと納得のいくものができました。ダークテーマ、星のアニメーション背景、記事ページのシンプルな一カラム構成。Pencilでアタリをつけてから手を動かすと、実装中に「これでいいのか」と悩む時間が減ります。次にサイトを作るときも同じ手順にします。