※本記事には広告(A8・楽天アフィリエイト)リンクが含まれる場合があります。

「ブログを作りたいけどNext.jsは重い。WordPressはセキュリティが不安。もっとシンプルに、Lighthouseスコア100点のサイトを作りたい」——そんな要求にズバリ応えるのが Astro.js です。

Astroは2021年に登場した静的サイトジェネレーター(SSG)で、「ゼロJavaScriptをデフォルト」という思想のもと開発されました。2026年現在、GitHubスターは5万を超え、個人開発者・テックブロガー・フロントエンドエンジニアの間で急速に普及しています。本記事では、AstroでブログやポートフォリオサイトをCloudflare Pagesに無料デプロイするところまで、実践的に解説します。

Astro.jsとは? なぜ2026年に注目されるのか

Astroの最大の特徴はアイランドアーキテクチャ(Islands Architecture)です。従来のSPA(React/Vue/Angular)はページ全体のJavaScriptをブラウザに送信するため、初期ロードが重くなりがちでした。Astroはその逆で、HTMLとCSSだけ送信し、インタラクティブな部分(=島)にだけJavaScriptを読み込む設計です。

その結果、Astroで作ったサイトはほぼ例外なくLighthouseのパフォーマンススコアで90〜100点を記録します。Core Web Vitalsも良好なため、SEO効果も期待できます。

主な特徴まとめ

  • ゼロJS by default — JavaScriptはオプト・イン。静的なページはHTMLのみ出力される
  • マルチフレームワーク対応 — React・Vue・Svelte・SolidJSのコンポーネントを混在できる
  • Markdownネイティブ — .md / .mdx ファイルをそのままページにできる
  • Content Collections — ブログ記事の型安全な管理システムが標準搭載
  • TypeScriptサポート — 設定不要でTypeScriptが使える
  • SSR対応 — 必要なページだけサーバーサイドレンダリングも可能

Next.js・Gatsby・Hugoとの比較

項目 Astro Next.js Gatsby Hugo
デフォルトJS量 ほぼゼロ 多い 多い ゼロ
フレームワーク混在 ✅ React/Vue/Svelte ❌ Reactのみ ❌ Reactのみ ❌ なし
Markdown対応 ✅ ネイティブ △ プラグイン必要 ✅ GraphQL経由 ✅ ネイティブ
学習コスト 低〜中 中〜高 低(Go必要)
SSR/動的処理 △ アダプタ必要 ✅ 強力 △ 限定的 ❌ 静的のみ

ブログ・ポートフォリオ・ドキュメントサイトなどコンテンツ中心の静的サイトを作るなら、Astroはほぼベストの選択肢です。動的なWebアプリ(ログイン・リアルタイム更新など)はNext.jsの方が向いています。

セットアップ:Astroプロジェクトを5分で立ち上げる

Node.js 18以上がインストールされていれば、コマンド一発でプロジェクトが作れます。

ステップ1:プロジェクトの作成

npm create astro@latest my-blog
# 対話式で設定を選べる
# テンプレート: 「Blog」を選ぶとブログ向けの雛形が作られる
cd my-blog
npm install
npm run dev

http://localhost:4321 をブラウザで開くと、すぐにサイトのプレビューが確認できます。

ディレクトリ構成の基本

my-blog/
├── public/           # 静的ファイル(画像・フォント・favicon)
├── src/
│   ├── components/   # 再利用コンポーネント (.astro / .jsx など)
│   ├── layouts/      # ページ共通レイアウト
│   ├── pages/        # URLと1対1対応するページファイル
│   └── content/      # ブログ記事などのコンテンツ(Markdown)
├── astro.config.mjs  # Astro設定ファイル
├── package.json
└── tsconfig.json

src/pages/ に置いたファイルは自動でルーティングされます。src/pages/about.astro/about になる、という仕組みです。シンプルで直感的です。

広告・楽天アフィリエイト

開発者向けガジェット

PC周辺機器を楽天市場でチェック。

楽天ポイント還元

楽天市場を見る →

広告・楽天アフィリエイト

メカニカルキーボード

打鍵感で選ぶ開発者向けキーボード。

楽天ポイント還元

キーボードを楽天で見る →

.astroファイルの書き方:コンポーネントの基本

Astroの独自ファイル形式 .astro はHTML・JavaScript・CSSが一ファイルに収まった構造です。

---
// フロントマター:サーバー側で実行されるJavaScript
const title = "Astroへようこそ";
const items = ["りんご", "バナナ", "みかん"];
---

<!-- テンプレート部分:HTMLとJSXの混合 -->
<html lang="ja">
  <head>
    <title>{title}</title>
  </head>
  <body>
    <h1>{title}</h1>
    <ul>
      {items.map(item => <li>{item}</li>)}
    </ul>
  </body>
</html>

<style>
  /* スコープ付きCSS:このコンポーネント内だけに適用 */
  h1 {
    color: #7c3aed;
    font-size: 2rem;
  }
</style>

--- で囲まれた部分(フロントマター)はビルド時にサーバー側で実行され、クライアントには届きません。APIの呼び出しやファイル読み込みを安全に書ける場所です。

レイアウトコンポーネント

ヘッダー・フッターなどの共通部分は src/layouts/ に書いておき、各ページで使い回します。

---
// src/layouts/BaseLayout.astro
interface Props {
  title: string;
  description?: string;
}
const { title, description = "TechBlogの説明" } = Astro.props;
---

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width">
    <title>{title}</title>
    <meta name="description" content={description}>
  </head>
  <body>
    <header><a href="/">My Blog</a></header>
    <main>
      <slot />  <!-- ここに各ページのコンテンツが入る -->
    </main>
    <footer>© 2026 My Blog</footer>
  </body>
</html>
---
// src/pages/index.astro
import BaseLayout from '../layouts/BaseLayout.astro';
---

<BaseLayout title="ホーム" description="個人開発ブログです">
  <h1>最新記事</h1>
  <p>ここに記事一覧が入ります</p>
</BaseLayout>

Content Collections:型安全なブログ記事管理

Astroのもっとも強力な機能の一つが Content Collections です。Markdownファイルをフォルダで管理し、TypeScriptの型定義でスキーマを保証します。記事のタイトルや日付が未設定なままビルドするとエラーになるので、「フロントマターの書き忘れ」を防げます。

スキーマ定義

// src/content/config.ts
import { defineCollection, z } from 'astro:content';

const blog = defineCollection({
  type: 'content',
  schema: z.object({
    title: z.string(),
    date: z.date(),
    description: z.string(),
    tags: z.array(z.string()).optional(),
    draft: z.boolean().default(false),
  }),
});

export const collections = { blog };

Markdownで記事を書く

スキーマが定義できたら、src/content/blog/ フォルダに Markdown ファイルを置くだけで記事が作れます。

---
# src/content/blog/hello-astro.md
title: "Astro入門:初めての記事"
date: 2026-05-04
description: "Astroでブログを始めました。"
tags: ["Astro", "個人開発"]
---

## はじめに

Astroはとても使いやすいです。

## インストール方法

```bash
npm create astro@latest
```

記事一覧ページを作る

---
// src/pages/blog/index.astro
import { getCollection } from 'astro:content';
import BaseLayout from '../../layouts/BaseLayout.astro';

const posts = (await getCollection('blog'))
  .filter(post => !post.data.draft)
  .sort((a, b) => b.data.date.getTime() - a.data.date.getTime());
---

<BaseLayout title="ブログ記事一覧">
  <ul>
    {posts.map(post => (
      <li>
        <a href={`/blog/${post.slug}/`}>{post.data.title}</a>
        <time>{post.data.date.toLocaleDateString('ja-JP')}</time>
      </li>
    ))}
  </ul>
</BaseLayout>

アイランドアーキテクチャ:ReactコンポーネントをAstroに組み込む

静的サイトでも「いいねボタン」「検索フォーム」「カウンター」などのインタラクティブな要素が必要なケースはあります。Astroではそういった部分だけReact(またはVue/Svelte)のコンポーネントを使えます。

Reactインテグレーションを追加

npx astro add react
# または Vue の場合
npx astro add vue

Reactコンポーネントを書く

// src/components/LikeButton.jsx
import { useState } from 'react';

export default function LikeButton() {
  const [count, setCount] = useState(0);
  return (
    <button onClick={() => setCount(c => c + 1)}>
      ❤️ {count}
    </button>
  );
}

Astroページで使う(クライアントディレクティブ)

---
import LikeButton from '../components/LikeButton.jsx';
---

<h1>記事タイトル</h1>
<p>記事の内容...</p>

<!-- client:load でクライアント側JSを読み込む -->
<LikeButton client:load />

クライアントディレクティブには種類があり、用途に応じて使い分けます:

  • client:load — ページロード時にすぐ読み込む(カウンター・ボタンなど)
  • client:idle — ブラウザのアイドル時に読み込む(優先度低い要素)
  • client:visible — スクロールで要素が表示されたら読み込む(遅延読み込み)
  • client:only — SSRをスキップしてクライアントのみで描画

適切に使い分けることで、不要なJavaScriptを削減しつつインタラクティブな体験を実現できます。

広告・楽天アフィリエイト

PCモニター

デュアルディスプレイや高解像度モデルをチェック。

楽天ポイント還元

モニターを楽天で見る →

広告・楽天アフィリエイト

プログラミング技術書

実践寄りの技術書・参考書を探す。

楽天ポイント還元

技術書を楽天で見る →

SEO最適化:Astroでサイトを検索上位に乗せる

AstroはデフォルトでSEOに有利な構造を持っています。静的HTMLとして出力されるため、GoogleのクローラーがJavaScriptを実行しなくてもコンテンツを読み取れます。さらに以下の施策を加えましょう。

サイトマップを自動生成

npx astro add sitemap
// astro.config.mjs
import { defineConfig } from 'astro/config';
import sitemap from '@astrojs/sitemap';

export default defineConfig({
  site: 'https://myblog.pages.dev',  // 本番URLを必ず設定
  integrations: [sitemap()],
});

ビルド時に sitemap-index.xml が自動生成されます。Google Search Console に登録しましょう。

OGP(Open Graph)メタタグの設定

---
// src/layouts/BlogLayout.astro
interface Props {
  title: string;
  description: string;
  date: Date;
}
const { title, description, date } = Astro.props;
const siteUrl = 'https://myblog.pages.dev';
---

<head>
  <title>{title} | My Blog</title>
  <meta name="description" content={description}>
  <meta property="og:title" content={title}>
  <meta property="og:description" content={description}>
  <meta property="og:type" content="article">
  <meta property="og:url" content={Astro.url.href}>
  <meta name="twitter:card" content="summary_large_image">
  <link rel="canonical" href={Astro.url.href}>
</head>

RSS フィードを追加

npx astro add rss
// src/pages/rss.xml.js
import rss from '@astrojs/rss';
import { getCollection } from 'astro:content';

export async function GET(context) {
  const posts = await getCollection('blog');
  return rss({
    title: 'My Tech Blog',
    description: '個人開発・Web技術のブログ',
    site: context.site,
    items: posts.map(post => ({
      title: post.data.title,
      pubDate: post.data.date,
      description: post.data.description,
      link: `/blog/${post.slug}/`,
    })),
  });
}

RSSフィードを設置すると、Google Search Consoleのインデックス速度が上がるケースがあります。また、QuickSummaryのようなAI要約拡張機能でも、RSSフィードがあるとコンテンツを効率よく処理できます。

Cloudflare Pagesへの無料デプロイ

Astroで作ったサイトはCloudflare Pagesで完全無料でホスティングできます。GitHubと連携すると、プッシュするたびに自動デプロイが走る快適な開発フローが手に入ります。

ステップ1:Cloudflareアダプタを設定

静的サイトのみのデプロイならアダプタは不要です。SSR機能を使う場合はCloudflareアダプタを追加します。

# SSR使わない場合(静的サイト)は不要
# SSR使う場合のみ
npx astro add cloudflare

ステップ2:wrangler.toml を追加(任意)

# wrangler.toml(SSRなしの静的サイトはなくてもOK)
name = "my-blog"
pages_build_output_dir = "./dist"

ステップ3:Cloudflare Dashboardで設定

  1. Cloudflare Dashboard → Workers & Pages → 「アプリケーションを作成」
  2. GitHubリポジトリを連携
  3. ビルド設定を入力:
    ビルドコマンド: npm run build
    ビルド出力ディレクトリ: dist
  4. 「保存してデプロイ」をクリック

数分でデプロイが完了し、https://プロジェクト名.pages.dev のURLが発行されます。カスタムドメインの設定も無料です。

CLIでデプロイする場合

npm run build
npx wrangler pages deploy dist --project-name=my-blog

実践Tips:Astroブログを本番レベルに仕上げる

Tailwind CSSを導入する

npx astro add tailwind

これだけでTailwindが使えるようになります。astro.config.mjs に自動で設定が追記されます。

画像最適化

Astroには <Image /> コンポーネントが標準で用意されており、WebP変換・遅延読み込み・適切なサイズ指定を自動でやってくれます。

---
import { Image } from 'astro:assets';
import heroImage from '../assets/hero.jpg';
---

<Image
  src={heroImage}
  alt="ヒーロー画像"
  width={1200}
  height={630}
  format="webp"
  loading="lazy"
/>

ダークモード対応

---
// src/components/ThemeToggle.astro
---

<button id="theme-toggle">🌙</button>

<script>
  const toggle = document.getElementById('theme-toggle');
  toggle.addEventListener('click', () => {
    document.documentElement.classList.toggle('dark');
    localStorage.setItem('theme',
      document.documentElement.classList.contains('dark') ? 'dark' : 'light'
    );
  });

  //
        初回ロード時の復元
  const saved = localStorage.getItem('theme');
  if (saved === 'dark') document.documentElement.classList.add('dark');
</script>

検索機能の追加(Pagefind)

静的サイトに全文検索を追加できる Pagefind が人気です。ビルド後のHTMLを解析してインデックスを作成するため、サーバーは不要です。

npm install --save-dev pagefind
// package.json の scripts に追加
"postbuild": "npx pagefind --site dist"

Astroでサービスを監視・運用する

公開後のサイトが正常に動いているか、継続的にチェックする仕組みも大切です。PagePulseのようなWebサイト変更・死活監視ツールを使えば、サイトがダウンしたりコンテンツが意図せず変わった場合にすぐ気づけます。個人開発サイトにこそ、こういった軽量な監視ツールを組み合わせるのがおすすめです。

また、サービスを公開したら StatusCraft でステータスページを用意しておくとプロっぽさが出ます。メンテナンス中や障害発生時に「今どういう状態か」をユーザーに伝えられるシンプルなステータスページが、無料で作れます。

広告・楽天アフィリエイト

ガジェット・オーディオ

イヤホン・便利ガジェットをポイント還元で。

楽天ポイント還元

ガジェットを楽天で見る →

まとめ:Astroが個人開発・ブログ制作に最適な理由

Astro.jsは「書いたMarkdownがそのままSEOに強い超高速ページになる」という、個人開発者にとって最高のDXを提供しています。

  • Lighthouseスコア90〜100点をデフォルトで達成 — SEOと表示速度が両立する
  • Markdownで記事を書くだけ — CMSいらず、GitベースでコンテンツをバージョニングできるA
  • React/Vue/Svelteコンポーネントを使える — 既存の知識・資産を活かせる
  • Cloudflare Pagesで完全無料公開 — ホスティングコストゼロ
  • TypeScriptが設定不要で使える — Content Collectionsで型安全な記事管理
  • シンプルな設計 — 余計な抽象化が少なく、デバッグしやすい

「まずブログを公開して、SEOで集客して、そこから個人開発のプロダクトを宣伝したい」——そんな戦略を持っているなら、Astro + Cloudflare Pagesの組み合わせは2026年の最適解です。ぜひ今日から試してみてください。

バックエンドAPIが必要になったときは、Hono.js + Cloudflare Workers との組み合わせが鉄板です。フロントはAstroで静的配信、APIはWorkers、データベースはD1——すべてCloudflareエコシステムで統一すれば、個人開発の運用コストをほぼゼロに抑えられます。

🚀 今すぐAstroを始めよう

npm create astro@latest を実行するだけで、数分後には超高速ブログが動きます。

Astro公式ドキュメントを見る →