helianthe.dev
2025-04-04

Astroを使って簡単にブログサイトを作成する

はじめに

近年、Webフロントエンド領域では,さまざまな種類のフレームワークが開発されており、それぞれ異なる特徴を持っています。例えば、代表的なフロントエンドフレームワークであるNext.jsは,クライアントサイドの処理だけではなく、サーバーサイドの処理も行うことができ、単体でフルスタックなWebアプリケーションを作成できます。しかし、その高機能性から扱うことが難しい場面も多く、マークダウンベースのブログサイトのようなシンプルな用途でも実装が難しい場合があります。

一方で、Astroはコンテンツ管理に特化したフレームワークであり、簡単にコンテンツ駆動なWebサイトを構築できることが特徴です。例えば,Astroは強力なコンテンツコレクションシステムを持っており,コンテンツの一覧などを簡単に作成することができます。

本記事では、Astroについての簡単な紹介を行った上で,実際にAstroを用いたブログサイトの実装を行ってみたいと思います。

1. Astro.jsとは?

Astroは、「ブログやマーケティング、eコマースなど、コンテンツ駆動のウェブサイトを作成するためのウェブフレームワーク」であると公式ドキュメントで紹介されています。その特徴は,公式ドキュメント中で詳しく紹介されていますが,特に注目したい点として以下が挙げられます。

  • 自由なUI: Astroで作成するページ上では,React、Preact、Svelte、Vue、Solid、Lit、HTMX、Web Componentといった主要なフロントエンド技術を利用することができ,既存の技術資産を複雑な設定をすることなく流用することができます。
  • コンテンツコレクション: Astroは,マークダウンで作成されたコンテンツを簡単に整理および検証する方法を提供します。また,少しの設定を行うことによって,コンテンツコレクションによって集められたデータを型安全に利用することができます。
  • サーバーファースト: Astroはデフォルトでサーバーサイド生成(SSG)を利用することができ,高速なコンテンツの表示を可能にします。一方で,サーバーサイドレンダリング(SSR)を利用することもでき,クエリパラメータを利用した動的なページの生成なども簡単に行うことができます。

このように,Astroは,高速なコンテンツの管理および表示を簡単に行うための方法を提供しています。次の節では,実際にAstroを用いた開発を行い,Astroを利用したWebページの作成がいかに簡単かということを体感していただこうと思います。なお,以下で説明する内容は,公式ドキュメントのGetting startedに準拠しています。

## 環境構築

以下では,開発を行うコンピュータにNode.jsがインストールされていることを前提としています。私はバージョンv22.13.0のNode.jsを利用していますが,実際にはバージョンv18.14.1以上のNode.jsであれば問題ありません。

他のフロントエンドフレームワークと同じように,Astroには,新しいAstroプロジェクトを簡単に作成できるようにセットアップウィザードが用意されています。お好みのパッケージマネージャ(以下ではpnpmを利用しています。)を利用してcreate astroを実行します。

pnpm create astro@latest

コマンドを実行すると,新規プロジェクトのセットアップウィザードが起動するので,好みに応じて設定を行ってください。以下では次のように設定したとします。

# Where should we create your new project?
> ./project

# How would you like to start your new project?
> A basic, minimal starter (recommended)

# Install dependencies?
> Yes

# Initialize a new git repository?
> Yes

新しく作成されたプロジェクトディレクトリ(./project)に移動して,pnpm devを実行すると開発サーバーが起動します。この状態でhttp://localhost:4321にアクセスすると,起動している開発サーバーをプレビューすることができます。./project/src/pages/index.astroを適当に編集してみましょう。ホットリロードによって編集結果がhttp://localhost:4321にすぐに反映されます。

Astroではファイルベースドルーティングが採用されているので,pages以下にファイルを追加することで新しいページを追加していくことができます。例えば,pagesnew.astroというファイルを新規作成して,index.astroの内容をnew.astroにコピペしてみましょう。この状態でhttp://localhost:4321/newにアクセスすると,新しいページが作成されていることがわかると思います。このようにしてAstroではWebページを作っていきます。

以上の動作が確認できれば,Astroの開発環境構築は終了です。

マークダウンの表示

Astroはマークダウンをデフォルトでサポートしているので,特別な設定をすることなくマークダウンの表示を行うことが可能です。

まずは,pages/markdown.mdというファイルを作成して,適当に内容を書いてみましょう。この状態でhttp://localhost:4321/markdownにアクセスすると,作成したファイルの内容に則したページが表示されると思います。このように,Astroではマークダウンのページを作成してルーティングに乗せることが簡単にできます。

少数のマークダウンであればこの方法で追加していくことが可能ですが,ページ数が膨大になるとその管理も難しくなり,ページごとの整合性を保つことも難しくなります。また,ブログサイトを考えたとき,記事の一覧を作成することが必要ですが,膨大な数のコンテンツに対してコンテンツの一覧を作成するのは大きな労力が必要です。この問題を解決してくれるのが次に紹介するコンテンツコレクションシステムです。

コンテンツコレクションシステム

Astroのコンテンツコレクションは,contentディレクトリ以下のコンテンツを簡単に収集することができます。コンテンツコレクションの詳細は公式ドキュメントのコンテンツコレクションのページを参照してください。以下では,コンテンツコレクションを利用するとコンテンツを簡単に収集することができることを紹介します。

まずは,src以下にcontent/postディレクトリを作成し,作成したpostディレクトリに1.mdおよび2.mdというファイルを新規作成します。それぞれの内容は適当で大丈夫です。次に,pages/index.astroの内容を以下のように編集します。

---
import Layout from "../layouts/Layout.astro";
import { getCollection, z } from "astro:content";

const posts = await getCollection("post");
---

<Layout>
  {
    posts.map((post) => {
      return <span>{post.id}</span>;
    })
  }
</Layout>

この状態でhttp://localhost:4321にアクセスすると,1.mdおよび2.mdという文字列がページ上に表示されていると思います。

このようにAstroでは,getCollectionを利用することで,content以下に存在するマークダウンファイルを収集することができます。

ブログの実装