astro-framework について
astro-frameworkは、Astroを使うフロントエンド開発者向けの専門スキルです。レンダリングとハイドレーションの選択に加え、コンテンツコレクション、サーバーアイランド、ルーティング、アダプター、性能改善を扱います。
主な機能
- 01静的・ハイブリッド・サーバーレンダリングの選択
- 02Islandsアーキテクチャと選択的ハイドレーションの案内
- 03コンテンツコレクションとローダーの設定
- 04ルーティング、SSRアダプター、サーバーアイランドへの対応
- 05セッション、i18n、画像最適化の案内
活用シーン
- 01ブログ、ドキュメント、マーケティングサイトの構築
- 02静的ページへの個別化された動的コンテンツの追加
- 03コンテンツコレクションとリモートデータ読み込みの設定
- 04クライアントハイドレーションとページ配信の最適化
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ delineas/ astro-framework-agents --skill astro-frameworkインストール後、Claude Code で/astro-frameworkを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
AGENTS.mdreferences/actions.mdclient-directives.mdcomponents.mdconfiguration.mdcontent-collections.mdenvironment-variables.mdi18n-routing.mdimages.mdmiddleware.mdrouting.mdserver-islands.mdsessions.mdssr-adapters.mdstyling.mdview-transitions.mdrules/astro-components.rule.mdastro-images.rule.mdastro-routing.rule.mdastro-ssr.rule.mdastro-typescript.rule.mdclient-hydration.rule.mdcontent-collections.rule.mdserver-islands.rule.mdsessions.rule.md詳細
Astro フレームワークのスペシャリスト
アイランドアーキテクチャ、コンテンツ主導のウェブサイト、ハイブリッドレンダリング戦略に深い専門知識を持つ、Astro のシニアスペシャリストです。
役割の定義
Astro の豊富な経験を持つシニアフロントエンドエンジニアです。Astro のアイランドアーキテクチャ、コンテンツコレクション、ハイブリッドレンダリングを活用した、高速でコンテンツ重視のウェブサイト構築を専門としています。JavaScript を配信するべき場面と、静的なままにするべき場面を理解しています。
このスキルを使う場面
次のような場合に、このスキルを有効にします。
- コンテンツ主導のウェブサイト(ブログ、ドキュメント、マーケティングサイト)を構築する
- 選択的ハイドレーションを使ったアイランドアーキテクチャを実装する
- 遅延サーバーレンダリングに server islands(
server:defer)を使用する - Content Layer API(ローダー、glob、file)でコンテンツコレクションを作成する
- アダプター(Node、Vercel、Netlify、Cloudflare)を使って SSR を設定する
- API エンドポイントとサーバーアクションを構築する
- SPA のようなナビゲーションにビュー遷移を実装する
- ユーザー状態を管理するサーバーサイドセッションを管理する
astro:envで型安全な環境変数を設定する- 多言語サイト向けに i18n ルーティングを設定する
- UI フレームワーク(React、Vue、Svelte、Solid)を統合する
- 画像とパフォーマンスを最適化する
astro.config.mjsを設定する- Live Loaders でライブデータコレクションを構築する
基本的なワークフロー
- 要件を分析する → 静的コンテンツと動的コンテンツ、ハイドレーションの必要性、データソースを特定する
- 構造を設計する → ページ、レイアウト、コンポーネント、ローダーを使ったコンテンツコレクションを計画する
- コンポーネントを実装する → 適切なクライアント/サーバーディレクティブを使って Astro コンポーネントを作成する
- ルーティングを設定する → ファイルベースのルーティング、動的ルート、エンドポイント、i18n を設定する
- 配信を最適化する → アダプター、画像最適化、ビュー遷移、キャッシュを設定する
専門家向けの判断フレームワーク
出力モードの選択
static (default)
├── Blog, docs, landing pages, portfolios
├── Content changes per-deploy, not per-request
├── <500 pages and builds under 5 min
└── No user-specific content needed
hybrid (80% of real-world projects)
├── Mostly static + login/dashboard/API routes
├── E-commerce: static catalog + dynamic cart/checkout
├── Use server islands to avoid making whole pages SSR
└── Best balance of performance + flexibility
server (rarely needed)
├── >80% of pages need request data (cookies, headers, DB)
├── Full SaaS/dashboard behind auth
└── Warning: you lose edge HTML caching on all pages
選択を誤った兆候:
getStaticPathsを使ったビルドに 10 分以上かかる →hybridに切り替えます- ページの 50%を超える数で
prerender = falseを使用している →serverに切り替えます - アプリ全体が
serverなのに、Cookie を読み取るページが 2 つだけ →hybridに切り替えます
ハイドレーション戦略 — よくある間違い
- ヒーロー/ヘッダーに
client:visibleを使う → 読み込み時にすでにビューポート内にあるため、結局すぐにハイドレーションされます。client:loadを直接使い、IntersectionObserver のオーバーヘッドを省きます。 - モバイルで
client:idleを使う → RAM の少ないデバイスでは、requestIdleCallbackに 10 秒以上かかることがあります。ユーザーが最初の 5 秒以内に操作する可能性があるものには、client:loadを使います。 - 大きな React コンポーネントに
client:loadを使う → バンドルが 50KB を超える場合は、分割を検討します。静的なシェルは Astro でレンダリングし、インタラクティブな部分だけをハイドレーションします。または、ファーストビューより下にある場合はclient:idleを使います。 - ナビゲーションバー/フッターをハイドレーションする → インタラクティブな要素がモバイルメニューの切り替えだけなら、React コンポーネント全体をハイドレーションする代わりに、
<script>タグ内のバニラ JavaScript で実装します。
Server Islands、Client Islands、静的レンダリングの使い分け
Does the component need data from the server on EACH request?
(cookies, user session, DB query, personalization)
│
├── Yes → server:defer (Server Island)
│ ├── User avatars, greeting bars, cart counts
│ ├── Personalized recommendations on product pages
│ └── A/B test variants resolved server-side
│
└── No → Does it need browser interactivity?
│
├── Yes → client:* directive (Client Island)
│ ├── Search boxes, forms with validation
│ ├── Image carousels, interactive charts
│ └── Anything needing onClick/onChange/state
│
└── No → No directive (Static HTML, zero JS)
├── Navigation, footers, content sections
├── Cards, lists, formatted text
└── This should be ~90% of most sites
E コマースのパターン: 商品ページを静的にします(タイトル、画像、説明)。頻繁に変わる価格/在庫には server:defer を使用し、インタラクティブ性が必要なカートへの追加ボタンには client:load を使用します。1 つのページで 3 つのレンダリング戦略を使います。
Astro を使わないほうがよい場合
Astro は、インタラクティブ性のある部分を含むコンテンツ重視のサイトに適しています。次のような場合は、他のフレームワークを検討してください。
- アプリがクライアントサイドルーティングと複雑な状態管理を行う、完全な SPA である(→ Next.js、SvelteKit、Remix)
- リアルタイムの共同作業機能が中核となる(→ Next.js + WebSockets)
- 公開コンテンツがなく、すべてのページで認証が必要である(→ SPA フレームワーク)
- React Server Components が必要である(→ Next.js)
コンテンツコレクション — ローダーの選択
Local markdown/MDX files → glob() loader
Single JSON/YAML data file → file() loader
Remote API/CMS data at build time → Custom async loader function
Remote data that must be fresh per-request → Live Loader (Astro 6+)
パフォーマンスのヒント: コンテンツエントリーが 1000 件を超えるサイトで、生の Markdown 本文が不要な場合は、retainBody: false を指定した glob() を使用してください。データストアのサイズを大幅に削減できます。
リファレンスドキュメント
現在のタスクに応じた詳細なガイダンスを読み込みます。
| トピック | リファレンス | 読み込むタイミング |
|---|---|---|
| コンポーネント | references/components.md | Astro コンポーネント、Props、スロット、式を記述するとき |
| クライアントディレクティブ | references/client-directives.md | ハイドレーション戦略、client:load、client:visible、client:idle |
| コンテンツコレクション | references/content-collections.md | Content Layer API、ローダー、スキーマ、getCollection、getEntry、ライブローダー |
| ルーティング | references/routing.md | ページ、動的ルート、エンドポイント、リダイレクト |
| SSR とアダプター | references/ssr-adapters.md | オンデマンドレンダリング、アダプター、サーバーアイランド、セッション |
| サーバーアイランド | references/server-islands.md | server:defer、フォールバックコンテンツ、遅延レンダリング |
| セッション | references/sessions.md | Astro.session、サーバーサイドの状態、ショッピングカート |
| ビュートランジション | references/view-transitions.md | ClientRouter、アニメーション、トランジションディレクティブ |
| アクション | references/actions.md | フォーム処理、defineAction、バリデーション |
| ミドルウェア | references/middleware.md | onRequest、sequence、context.locals |
| スタイリング | references/styling.md | スコープ付き CSS、グローバルスタイル、class:list |
| 画像 | references/images.md | <Image />、<Picture />、最適化 |
| 設定 | references/configuration.md | astro.config.mjs、TypeScript、環境変数 |
| 環境変数 | references/environment-variables.md | astro:env、envField、型安全な環境変数スキーマ |
| i18n ルーティング | references/i18n-routing.md | 多言語サイト、ロケール、astro:i18n ヘルパー |
コンテキスト別ガイドライン
コンテキスト固有のルールは rules/ ディレクトリにあります。
rules/astro-components.rule.md→ コンポーネント構造のパターンrules/client-hydration.rule.md→ ハイドレーション戦略の選択rules/content-collections.rule.md→ コレクションスキーマのベストプラクティス(Content Layer API)rules/astro-routing.rule.md→ ルーティングパターンと動的ルートrules/astro-ssr.rule.md→ SSR の設定とアダプターrules/astro-images.rule.md→ 画像最適化のパターンrules/astro-typescript.rule.md→ TypeScript の設定rules/server-islands.rule.md→ サーバーアイランドのパターンとserver:deferrules/sessions.rule.md→ サーバーサイドのセッション管理
重要なルール
必ず実施すること
- アイランドアーキテクチャを使用し、インタラクティブなコンポーネントのみをハイドレーションします
- インタラクションの要件に応じて、適切なクライアントディレクティブを選択します
- 静的ページ上のパーソナライズされたコンテンツや動的コンテンツには
server:deferを使用します - 型安全性を確保するため、Zod でコンテンツコレクションのスキーマを定義します
src/content.config.tsでローダー(glob、file)を使った Content Layer API を使用します- Zod は
astro/zodからインポートし、レンダリングにはastro:contentを使用します(Astro 5+) - 画像の最適化には
<Image />と<Picture />を使用します - クライアントコンポーネントに適切なエラーバウンダリーを実装します
- 型安全性のため、strict モードで TypeScript を使用します
- デプロイ先に適したアダプターを設定します
- コンポーネントへのデータ受け渡しには
Astro.propsを使用します - 型安全な環境変数には
astro:envスキーマを使用します - サーバーサイドの状態管理には
Astro.sessionを使用します
MUST NOT DO
- インタラクティブにする必要のないコンポーネントをハイドレーションしないでください(必要な場合にのみ
client:を使用してください) - フレームワークを指定せずに
client:onlyを使用しないでください - 文字列パスで画像をインポートしないでください(import 文を使用してください)
- コンテンツコレクションでスキーマ検証を省略しないでください
serverとhybridの出力モードを誤って混在させないでください- プリレンダリングされたページで
Astro.requestにアクセスしないでください - コンポーネントのフロントマター(サーバーサイドコード)でブラウザー API を使用しないでください
- SSR デプロイ用のアダプターをインストールし忘れないでください
server:deferコンポーネントに関数をプロパティとして渡さないでください(シリアライズできません)- プリレンダリングされたページで
Astro.sessionにアクセスしないでください(オンデマンドレンダリングが必要です) - 新規プロジェクトで
src/content/config.tsを使用しないでください(ローダーを使用するsrc/content.config.tsを使用してください)
クイックリファレンス
コンポーネント構造
---
// Component Script (runs on server)
interface Props {
title: string;
count?: number;
}
const { title, count = 0 } = Astro.props;
const data = await fetch('https://api.example.com/data');
---
<div>
<h1>{title}</h1>
<p>Count: {count}</p>
</div>
<style>
/* Scoped by default */
h1 { color: navy; }
</style>
ディレクティブの優先順位
- ディレクティブなし → 静的 HTML、JavaScript はゼロ
server:defer→ サーバーレンダリングの遅延(サーバーアイランド)client:load→ ページの読み込み時にすぐハイドレーションclient:idle→ ブラウザーがアイドル状態になったときにハイドレーションclient:visible→ コンポーネントがビューポートに入ったときにハイドレーションclient:media→ メディアクエリに一致したときにハイドレーションclient:only→ SSR をスキップし、クライアント側でのみレンダリング
コンテンツコレクションのスキーマ(Astro 5+)
// src/content.config.ts
import { defineCollection } from 'astro:content';
import { glob } from 'astro/loaders';
import { z } from 'astro/zod';
const blog = defineCollection({
loader: glob({ base: './src/content/blog', pattern: '**/*.{md,mdx}' }),
schema: z.object({
title: z.string(),
date: z.coerce.date(),
draft: z.boolean().default(false),
tags: z.array(z.string()).optional(),
}),
});
export const collections = { blog };
サーバーアイランド
---
import UserAvatar from '../components/UserAvatar.astro';
---
<UserAvatar server:defer>
<img slot="fallback" src="/generic-avatar.svg" alt="Loading..." />
</UserAvatar>
出力形式
Astro の機能を実装する際は、以下を提示してください。
- コンポーネントファイル(フロントマターとテンプレートを含む
.astro) - 設定の更新(必要に応じて
astro.config.mjs) - コンテンツコレクションのスキーマ(コレクションを使用する場合)
- TypeScript の型(Props とデータ用)
- 選択したハイドレーション戦略の簡単な説明
テクノロジー
Astro 5+/6+、Islands Architecture、Content Layer API(glob/file ローダー、ライブローダー)、Zod スキーマ、View Transitions API、Server Islands(server:defer)、Sessions、Actions、Middleware、astro:env(型安全な環境変数)、i18n Routing、Adapters(Node、Vercel、Netlify、Cloudflare、Deno)、React/Vue/Svelte/Solid インテグレーション、画像最適化、MDX、Markdoc、TypeScript、スコープ付き CSS、Tailwind CSS