近年、Webフロントエンド領域では,さまざまな種類のフレームワークが開発されており、それぞれ異なる特徴を持っています。例えば、代表的なフロントエンドフレームワークであるNext.jsは,クライアントサイドの処理だけではなく、サーバーサイドの処理も行うことができ、単体でフルスタックなWebアプリケーションを作成できます。しかし、その高機能性から扱うことが難しい場面も多く、マークダウンベースのブログサイトのようなシンプルな用途でも実装が難しい場合があります。
一方で、Astroはコンテンツ管理に特化したフレームワークであり、簡単にコンテンツ駆動なWebサイトを構築できることが特徴です。例えば,Astroは強力なコンテンツコレクションシステムを持っており,コンテンツの一覧などを簡単に作成することができます。
本記事では、Astroについての簡単な紹介を行った上で,実際にAstroを用いたブログサイトの実装を行ってみたいと思います。
Astroは、「ブログやマーケティング、eコマースなど、コンテンツ駆動のウェブサイトを作成するためのウェブフレームワーク」であると公式ドキュメントで紹介されています。その特徴は,公式ドキュメント中で詳しく紹介されていますが,特に注目したい点として以下が挙げられます。
このように,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
以下にファイルを追加することで新しいページを追加していくことができます。例えば,pages
にnew.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
以下に存在するマークダウンファイルを収集することができます。