Astroを選ぶ理由
Astroは「コンテンツ重視のWebサイト」に最適化されたフレームワークだ。ブログ、ドキュメント、マーケティングサイト、メディアサイト——こうしたサイトでは、ほとんどのページが静的に生成でき、JavaScriptは限定的にしか必要ない。
Astro 5.xでは、Content Collections の型安全性、Server Islands、パフォーマンスの改善など、多くの強化が行われた。本記事では、Astroを実プロジェクトで使い倒すための10のテクニックを紹介する。
Tip 1: Content Collectionsで型安全なコンテンツ管理
Astro 5.xのContent Collectionsは、Markdownのfrontmatterにスキーマ検証を適用する。
// src/content/config.ts
import { defineCollection, z } from 'astro:content';
const articles = defineCollection({
type: 'content',
schema: z.object({
title: z.string(),
publishDate: z.date(),
section: z.enum(['gaming', 'design', 'tech', 'life', 'books']),
tags: z.array(z.string()),
}),
});
メリット: frontmatterの型が保証されるため、テンプレートで article.data.title にアクセスする際に型推論が効く。スキーマ違反はビルド時にエラーとして検出される。
Tip 2: Islands Architectureで必要な箇所だけインタラクティブに
Astroの最大の特徴は「デフォルトでJavaScript 0KB」。ページ全体は静的HTMLとして配信され、インタラクティブな部分だけをReactやSvelteの「島」として読み込む。
---
import SearchBox from '../components/SearchBox.tsx';
import StaticHeader from '../components/Header.astro';
---
<StaticHeader /> <!-- JS不要 -->
<SearchBox client:visible /> <!-- 画面に入ったときだけJS読み込み -->
client:visible は要素がビューポートに入ったときにJavaScriptを読み込むディレクティブ。ファーストビューの外にあるコンポーネントの読み込みを遅延できる。
| ディレクティブ | タイミング | 用途 |
|---|---|---|
client:load | 即座に | ファーストビューの対話要素 |
client:visible | 表示時に | スクロール先の対話要素 |
client:idle | ブラウザのアイドル時 | 優先度の低い対話要素 |
client:media | メディアクエリ一致時 | モバイルのみの要素 |
Tip 3: View Transitionsでページ遷移をスムーズに
Astro 5.xのView Transitions APIは、MPAでありながらSPAのようなスムーズなページ遷移を実現する。
---
import { ViewTransitions } from 'astro:transitions';
---
<head>
<ViewTransitions />
</head>
これだけで、ページ間のクロスフェードアニメーションが有効になる。特定の要素にトランジション名を付けると、ページ間で同じ要素が連続的にアニメーションする。
Tip 4: 画像の自動最適化
Astroの <Image> コンポーネントは、ビルド時に画像を自動最適化する。
---
import { Image } from 'astro:assets';
import thumbnail from '../images/article-thumb.png';
---
<Image src={thumbnail} alt="記事のサムネイル" width={800} />
WebP/AVIF変換、リサイズ、lazy loading属性の自動付与が行われる。外部URLの画像には inferSize オプションでサイズを自動検出できる。
Tip 5: 動的OGP画像の生成
@astrojs/og またはSatoriを使って、記事ごとに動的にOGP画像を生成できる。
タイトルとカテゴリをテンプレートに差し込み、ビルド時にPNG/WebPとして出力する。デザインの統一性が保たれ、手動での画像作成が不要になる。
Tip 6: RSS/Sitemapの自動生成
npx astro add sitemap
npx astro add rss
公式インテグレーションを追加するだけで、ビルド時にsitemap.xmlとRSSフィードが自動生成される。Content Collectionsと連動し、新しい記事が自動的にフィードに含まれる。
Tip 7: MDXでコンポーネントを記事内に埋め込む
MDXを使えば、Markdown記事内にReact/Astroコンポーネントを埋め込める。
import ColorPicker from '../../components/ColorPicker.tsx';
## 配色を試してみよう
以下のツールで色を選択してください:
<ColorPicker client:visible />
記事コンテンツの中にインタラクティブなツールやデモを自然に配置できる。
Tip 8: prefetchでナビゲーションを高速化
Astroのprefetch機能は、リンクにホバーした時点で遷移先のHTMLを先読みする。
// astro.config.mjs
export default defineConfig({
prefetch: {
defaultStrategy: 'hover',
prefetchAll: false,
},
});
ユーザーがリンクをクリックする頃には、ページのHTMLがすでにキャッシュされているため、体感速度が大幅に向上する。
Tip 9: 環境変数の型安全な管理
Astro 5.xでは astro:env モジュールで環境変数の型定義が可能。
// env.d.ts
interface ImportMetaEnv {
readonly PUBLIC_GA_ID: string;
readonly SECRET_API_KEY: string;
}
PUBLIC_ プレフィックスの変数はクライアントに露出し、それ以外はサーバーサイドのみ。ビルド時に未定義の環境変数を検出できる。
Tip 10: ビルドパフォーマンスの計測と改善
Astroのビルドログにはページごとの生成時間が表示される。ボトルネックとなるページを特定し、以下を確認する:
- Content Collectionsのフィルタリングが効率的か
- 画像処理が重複していないか
- 不要なコンポーネントのインポートがないか
# 詳細なビルドログを出力
ASTRO_LOG_LEVEL=debug astro build
まとめ
Astroの思想は明快だ。必要なときだけJavaScriptを送り、それ以外は静的HTMLで高速に配信する。Content Collections、Islands Architecture、View Transitions——これらの機能は、コンテンツサイトにおける「速さ」と「リッチさ」の両立を可能にする。
10のTipsすべてを一度に適用する必要はない。まずContent CollectionsとIslands Architectureで基盤を固め、View TransitionsやprefetchでUXを磨いていくのが実践的なアプローチだ。