技術ブログのための最適解

技術ブログを自作しようとした時、選択肢は無限にあります。Next.js, Nuxt, Gatsby, Hugo… その中で、私が自信を持って「これが現代のベストプラクティスだ」と推せるのが、AstroCloudflare Pages の組み合わせです。

なぜこのスタックが優れているのか、3つのポイントで解説します。

1. コンテンツ主体のサイトに特化した「Zero-JS」

技術ブログの本質は「テキストを読むこと」です。複雑なアプリケーションのような状態管理は必要ありません。

Astroは「デフォルトでJavaScriptを排除する」という設計思想で作られています。 ReactやVueで書かれたコンポーネントであっても、ビルド時に純粋なHTML/CSSに変換(レンダリング)され、ユーザーのブラウザにはJSが含まれない状態で届きます。

  • メリット: ブラウザでのJS実行待ち(ハイドレーション)が発生しないため、低スペックなデバイスでも一瞬で表示されます
  • 結果: GoogleのCore Web Vitalsにおいても、特別なチューニングなしで満点近いスコアを叩き出せます。

2. 記事データを「型」で守る (Type Safety)

ブログ運用で意外と困るのが、メタデータの管理ミスです。「日付フォーマットがバラバラ」「必須画像の指定忘れ」などが起きがちです。

Astroには Content Collections という強力な機能があり、MarkdownのFrontmatterに対してTypeScriptでスキーマ定義ができます。

// src/content/config.ts
const blog = defineCollection({
    schema: z.object({
        title: z.string(),
        pubDate: z.date(),
        tags: z.array(z.string()), // 配列であることを強制!
        isDraft: z.boolean().default(false),
    }),
});

この機能のおかげで、記述ミスがあればビルドが失敗するようになります。「壊れた記事が公開される」という事故を、システムレベルで防ぐことができるのです。

3. 必要な機能だけを「Component」で作る

Astroは、React, Vue, Svelteなど、好きなUIフレームワークのコンポーネントを混在させて使うことができます。 基本は静的なHTMLですが、もし「ここだけインタラクティブなグラフを表示したい」と思ったら、その部分だけ Reactとして動かすことができます(Islands Architecture)。

<!-- 通常の静的コンテンツ -->
<Header />

<!-- ここだけJSとして動く(Reactなど) -->
<InteractiveGraph client:visible />

<Footer />

「基本は軽く、必要な時だけリッチに」。このメリハリの効いた設計が、ブログというメディアに完全にフィットします。

まとめ

  1. Zero-JS: 不要なJSを削ぎ落とし、読む体験を阻害しない。
  2. Type Safe: 記事データの整合性をビルドプロセスで保証する。
  3. Islands: 必要な部分だけを動的にするという合理的な設計。

オーバーエンジニアリングにならず、かつモダンな開発体験を享受できる。それがAstroを選ぶ理由です。