Astro + Cloudflare Pages で個人サイトを構築した
個人サイトを Astro + Cloudflare Pages で作った。この構成が個人サイトに合っていると感じたので、選定理由を書いておく。
なぜ Astro か
静的サイト生成に特化していて、ビルドが速い。出力もシンプル。Content Collections で Markdown のブログ記事を型安全に管理できるのが気に入っている。
React や Vue を使わなくてもいい。必要な箇所だけ Islands として差し込める。JavaScript をほぼ出力しないのでビルドサイズが小さく、個人ブログには十分すぎる。
なぜ Cloudflare Pages か
無料枠が手厚い。リクエスト数は無制限で、ビルドも月 500 回まで。push するだけで自動デプロイされ、PR ごとにプレビュー URL が発行される。
DNS、Web Analytics、Transform Rules と同じ Cloudflare 内で完結するのも楽。管理画面を行き来しなくて済む。
Content Collections (v6)
Astro v6 では Content Layer API に変わった。glob loader を使って Markdown を読み込む。
import { defineCollection, z } from 'astro:content';
import { glob } from 'astro/loaders';
const blog = defineCollection({
loader: glob({ pattern: '**/*.md', base: './src/content/blog' }),
schema: z.object({
title: z.string(),
description: z.string(),
date: z.coerce.date(),
draft: z.boolean().default(false),
}),
});
デプロイ
Cloudflare Pages の GitHub 連携を設定し、ビルドコマンドを cd site && npm install && npm run build にする。あとは main ブランチに push すれば自動でデプロイされる。
コスト
ドメイン維持費以外は全部無料。Cloudflare Pages、Terraform Cloud (Free)、GitHub Actions、いずれも無料枠で収まっている。