言語を切り替える
テーマを切り替える

ゼロから Astro ブログを構築:1 時間でトップページからデプロイまで

ある技術ブログを開くと、0.8 秒で完全に読み込まれ、ページ遷移も滑らか。自分の WordPress ブログを見ると——3 秒の白画面、閉じたくなる。Hexo、Hugo、Gatsby も試しましたが、毎回どこかでつまずきました。公式ドキュメントが分かりにくい、チュートリアルが断片的、インストールからデプロイまで何かが足りない感じ。Astro は性能も開発体験も優れ、全体の流れは想像以上にシンプルです。

この記事では、ゼロからデプロイまでの全工程を 1 時間で完了します。トップページ、記事一覧、タグ分類、RSS を備えた完全なブログ。実践的な操作手順です。

第 1 章:なぜ Astro か?(宣伝ではなく、本当に使える)

性能は本当にそこまで違うのか?

最初は半信半疑でした。公式サイトの「従来の React フレームワークより 40% 速い」「デフォルトで JavaScript ゼロ出力」——マーケティング文句に聞こえますよね。でも WordPress ブログを Astro に移行したら、数字は嘘をつきません。

  • 初回表示時間:3.2 秒 → 0.8 秒
  • Lighthouse スコア:100 点満点(以前の WordPress は 65 点)
  • JavaScript サイズ:280KB → 20KB 未満
0.8 秒
初回表示時間
3.2 秒から 0.8 秒に短縮
100 点
Lighthouse スコア
以前の WordPress は 65 点
93%
JS サイズ削減
280KB から 20KB 未満に

ここまで性能が上がる理由は、Astro の核心理念——コンテンツ優先、JavaScript は必要なときだけ読み込み——にあります。デフォルトで純粋な HTML+CSS を出力し、インタラクティブが必要な箇所だけ JavaScript を配信します。React の「全部入り」とは真逆のアプローチです。

興味深い比較:同じ記事を Next.js と Astro でテストしました。Next.js は初回表示でフレームワークランタイム(約 100KB)を読み込み、Astro はクリーンな HTML ファイルだけ。読むことが主目的のブログでは、この差は歴然です。

開発体験はどう?

性能の次は開発体験。Astro で好きなのは Islands アーキテクチャ——聞こえは大げさですが、要するに「インタラクティブが必要な場所だけ JavaScript を使う」です。

記事詳細ページの例:

  • 記事本文 → 静的 HTML(速い)
  • コメント欄 → React コンポーネント(インタラクティブ)
  • ナビゲーション → Vue コンポーネント(はい、混在できます)

小さな機能のためにサイト全体を SPA にする必要がありません。初心者に優しいのは、Markdown で記事を書くだけで、データベースや CMS をいじらなくていいこと。今は VSCode で Markdown を書き、GitHub に push すれば自動デプロイ——快適です。

他フレームワークとの比較

この疑問、私も半日悩みました。表で比較しましょう。

フレームワーク用途学習コスト性能メンテナンス
Astroブログ/ドキュメント低(HTML が分かれば OK)⭐⭐⭐⭐⭐低(ほぼゼロ)
Next.js複雑なアプリ中(React 必須)⭐⭐⭐⭐中(API 維持)
Hexo純静的ブログ低(拡張性は弱い)⭐⭐⭐
WordPressCMS が必要中(プラグイン豊富)⭐⭐高(セキュリティ+更新)

おすすめ:

  • ブログや技術ドキュメント → Astro 一択。性能も開発体験も優秀
  • EC や複雑なインタラクティブアプリ → Next.js が適切
  • 最もシンプルな静的ブログでカスタム不要 → Hexo でも十分
  • 非エンジニアも記事を投稿する CMS → WordPress

2025 年のデータでは、Astro の npm ダウンロード数は 300 万回を突破し、シェアは 18% に成長。開発者が実際に選んでいる——もはやニッチではありません。

第 2 章:環境準備(5 分で完了)

Node.js のインストール(未インストールの場合)

Astro には Node.js v18 以上が必要です。まずバージョンを確認:

node -v
npm -v

バージョンが表示されればこのステップはスキップ。未インストールなら Node.js 公式サイト から LTS 版をダウンロード。

Windows ユーザーの注意点:インストール時に「Add to PATH」にチェックを入れること。後でコマンドが見つからなくなります。一部のウイルス対策ソフトが npm インストールをブロックする場合もあるので、インストール後はコマンドプロンプトを再起動してください。

Astro プロジェクトの作成

想像より簡単です。コマンドラインで:

npm create astro@latest

選択肢が並びますが、こう選べば OK:

  1. プロジェクト名my-blog など好きな名前
  2. テンプレートBlog を選択(方向キー + Enter)
  3. 依存関係のインストールYes
  4. TypeScript 設定Strict または Strictest(型チェックでバグを減らせます)
  5. Git リポジトリの初期化Yes

全体で 1〜2 分。テンプレートと依存関係が自動ダウンロードされます。

Blog テンプレートを推奨する理由:記事一覧、タグ分類、RSS の基礎コードが入っています。空白テンプレートから始めると、ページネーションだけで 2 時間かかりました。

開発サーバーの起動

プロジェクトディレクトリに入り、サーバーを起動:

cd my-blog
npm run dev

Local: http://localhost:4321 と表示されれば成功。ブラウザでアクセスすると、すでに骨組みのできたブログが見えます。

初心者向け注意

  • ポート 4321 が使用中なら、astro.config.mjsserver.port を変更
  • EACCES エラーなら権限問題。sudo npm run dev を試す(Mac/Linux)
  • 文字化けする場合は、コマンドラインのエンコーディングが UTF-8 か確認

ここまでで環境は整いました。動く Astro ブログが手元にあります。次は各ファイルの役割を見ていきましょう。

第 3 章:プロジェクト構成の解説(各フォルダの役割)

ディレクトリ構成

VSCode などで my-blog フォルダを開くと、こんな構成です:

my-blog/
├── src/
│   ├── pages/           # ルーティング。ファイル名が URL になる
│   ├── layouts/         # レイアウト(ヘッダー、フッターなど)
│   ├── components/      # 再利用コンポーネント(ボタン、カードなど)
│   └── content/         # Markdown 記事の保存場所
├── public/              # 静的アセット(画像、フォント、favicon)
├── astro.config.mjs     # Astro 設定ファイル
└── package.json         # プロジェクト依存関係

普通のフロントエンドプロジェクトに似ていますが、Astro にはいくつか特徴があります。これを理解すると、なぜ使いやすいかが分かります。

pages/ ディレクトリ:ファイル即ルート

Astro で好きな機能の一つ。ルーティング設定不要、ファイル名がそのまま URL になります:

  • pages/index.astro → トップページ /
  • pages/about.astro → About ページ /about
  • pages/blog/index.astro → ブログ一覧 /blog
  • pages/blog/[...slug].astro → 記事詳細 /blog/xxx

[...slug].astro は動的ルート。角括弧内が変数になり、/blog/ 以下のすべての記事 URL を処理します。

Next.js から移行したとき、この設計に一目惚れしました。

content/ ディレクトリ:記事の置き場

src/content/blog/ を開くと、サンプル記事がいくつかあります。各記事は .md または .mdx ファイルで、先頭に Frontmatter(3 本のハイフンで囲まれた部分)があります:


---

title: '私の最初の記事'
description: 'これはテスト記事です'
pubDate: 'Dec 02 2025'
heroImage: '/blog-placeholder.jpg'
tags: ['Astro', 'チュートリアル']

---

ここから本文...

Astro がこの情報を自動認識し、ページ内で post.data.title のように呼び出せます。型チェックもあり、フィールド名を間違えるとビルド時にエラー——潔癖な人には嬉しい機能です。

layouts/components/:コードの再利用

layouts/ にはページレイアウト。全記事共通のヘッダー、フッター、サイドバーなど。Blog テンプレートには BaseLayout.astroBlogPost.astro が付属しています。

components/ には再利用可能な小さなコンポーネント。ボタン、カード、タグクラウドなど。Astro 構文でも React/Vue でも書けます。非常に柔軟です。

public/ ディレクトリ:そのまま出力フォルダへ

ここに置いたファイルは、最終サイトのルートにそのままコピーされます。public/favicon.ico はデプロイ後 https://あなたのドメイン/favicon.ico になります。

ブログの画像、フォント、robots.txt などはここに置くのが一般的です。

astro.config.mjs:コア設定ファイル

Astro の動作を制御するファイル。よく使う設定:

export default defineConfig({
  site: 'https://あなたのドメイン.com',  // デプロイ先ドメイン
  integrations: [mdx()],          // プラグイン(Markdown 拡張、RSS など)
  server: {
    port: 4321                    // 開発サーバーポート
  }
})

今は大きく変更する必要はありません。機能追加時に戻って調整すれば OK。

正直、この構成を理解することは本当に重要です。いきなりコードを書き始めて、ファイルの置き場所が分からず、プロジェクトが散らかる人をよく見ます。5 分かけてここを押さえれば、後で 1 時間節約できます。

第 4 章:コア機能の実装(ここが本番)

4.1 トップページ:最新記事の表示

Blog テンプレートがトップページの骨組みを用意していますが、少し調整しましょう。src/pages/index.astro を開くと、こんなコードがあります:


---

import { getCollection } from 'astro:content';
import BaseLayout from '../layouts/BaseLayout.astro';

// 全ブログ記事を取得し、日付順にソートして最新 5 件
const allPosts = (await getCollection('blog'))
  .sort((a, b) => b.data.pubDate.valueOf() - a.data.pubDate.valueOf())
  .slice(0, 5);

---

<BaseLayout>
  <h1>私のブログへようこそ</h1>
  <ul>
    {allPosts.map((post) => (
      <li>
        <a href={`/blog/${post.slug}/`}>{post.data.title}</a>
        <time>{post.data.pubDate.toDateString()}</time>
      </li>
    ))}
  </ul>
</BaseLayout>

このコードの動き

  1. getCollection('blog') で全記事を取得
  2. 公開日の降順でソート(新しい順)
  3. slice(0, 5) で最新 5 件だけ取得
  4. ループでリストとしてレンダリング

初心者向け注意:日付ソートには .valueOf() を使うこと。文字列ソートになると順序が狂います。

4.2 記事一覧ページ:ページネーション付き

src/pages/blog/index.astro を作成(テンプレートにない場合)、完全な記事一覧を実装:


---

import { getCollection } from 'astro:content';
import BaseLayout from '../../layouts/BaseLayout.astro';

const allPosts = (await getCollection('blog'))
  .sort((a, b) => b.data.pubDate.valueOf() - a.data.pubDate.valueOf());

const pageSize = 10;
const currentPage = 1;
const totalPages = Math.ceil(allPosts.length / pageSize);
const posts = allPosts.slice(0, pageSize);

---

<BaseLayout title="記事一覧">
  <h1>すべての記事</h1>

  <div class="post-list">
    {posts.map((post) => (
      <article>
        <h2><a href={`/blog/${post.slug}/`}>{post.data.title}</a></h2>
        <p>{post.data.description}</p>
        <time>{post.data.pubDate.toLocaleDateString('ja-JP')}</time>
        <div class="tags">
          {post.data.tags?.map(tag => <span>#{tag}</span>)}
        </div>
      </article>
    ))}
  </div>

  {totalPages > 1 && (
    <div class="pagination">
      <span>{currentPage} / {totalPages} ページ</span>
    </div>
  )}
</BaseLayout>

ここではページネーションを簡略化しています。本番では Astro の paginate() 関数で自動生成できます。記事が 100 件未満なら、1 ページ表示でも十分です。

UX 改善の提案

  • 読了時間の推定(文字数 ÷ 400 字/分)
  • 記事要約の切り詰め(先頭 150 字 + 省略記号)
  • サムネイル追加(heroImage フィールドを使用)

4.3 記事詳細ページ:最も重要なページ

動的ルートで実装します。Blog テンプレートに src/pages/blog/[...slug].astro があれば編集、なければ新規作成:


---

import { getCollection } from 'astro:content';
import BlogPost from '../../layouts/BlogPost.astro';

// 全記事の静的パスを生成
export async function getStaticPaths() {
  const posts = await getCollection('blog');
  return posts.map(post => ({
    params: { slug: post.slug },
    props: { post },
  }));
}

const { post } = Astro.props;
const { Content } = await post.render();

---

<BlogPost {...post.data}>
  <Content />
</BlogPost>

このコードのポイント

  • getStaticPaths() はビルド時に実行され、各記事の静的 HTML を生成
  • post.render() が Markdown を HTML コンポーネントに変換
  • <Content /> が記事本文

初心者がつまずきやすい点

  1. コードハイライトが効かない:Shiki プラグインが必要(Blog テンプレートには付属)
  2. Markdown のスタイルが地味@tailwindcss/typography プラグイン推奨
  3. 画像パスが間違う:画像は public/ に置き、参照は /images/xxx.jpg

目次(TOC)を追加するなら、コミュニティプラグイン remark-tocastro.config.mjs で設定:

import { defineConfig } from 'astro/config';
import remarkToc from 'remark-toc';

export default defineConfig({
  markdown: {
    remarkPlugins: [remarkToc],
  },
});

4.4 タグ分類システム:コンテンツを整理

src/pages/tags/[tag].astro を作成し、タグフィルタ機能を実装:


---

import { getCollection } from 'astro:content';
import BaseLayout from '../../layouts/BaseLayout.astro';

export async function getStaticPaths() {
  const allPosts = await getCollection('blog');

  // 全ユニークタグを収集
  const allTags = [...new Set(allPosts.flatMap(post => post.data.tags || []))];

  // 各タグのページを生成
  return allTags.map(tag => ({
    params: { tag },
    props: {
      posts: allPosts.filter(post =>
        post.data.tags?.includes(tag)
      ).sort((a, b) =>
        b.data.pubDate.valueOf() - a.data.pubDate.valueOf()
      ),
    },
  }));
}

const { tag } = Astro.params;
const { posts } = Astro.props;

---

<BaseLayout title={`タグ: ${tag}`}>
  <h1>#{tag} 関連記事 ({posts.length})</h1>

  <ul>
    {posts.map((post) => (
      <li>
        <a href={`/blog/${post.slug}/`}>{post.data.title}</a>
      </li>
    ))}
  </ul>
</BaseLayout>

各タグごとに独立ページが生成されます。例:/tags/astro/tags/チュートリアル など。

応用:タグクラウドページ(src/pages/tags/index.astro)を作り、全タグと記事数を表示。記事数に応じてフォントサイズを変えると見た目が良いです。

4.5 RSS フィード:読者に更新を届ける

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: '私の技術ブログ',
    description: 'フロントエンド開発の経験と学びを共有',
    site: context.site,
    items: posts.map((post) => ({
      title: post.data.title,
      pubDate: post.data.pubDate,
      description: post.data.description,
      link: `/blog/${post.slug}/`,
    })),
  });
}

デプロイ後、RSS 購読 URL は https://あなたのドメイン.com/rss.xml。RSS ユーザーは減りましたが、技術ブログにはまだプロフェッショナルな印象を与えます。

ここまででコア機能は完成。トップページ、記事一覧、詳細ページ、タグ分類、RSS——機能的なブログシステムができました。次は検索エンジン向けの最適化です。

第 5 章:SEO 最適化(見つけてもらうために)

ブログを作るだけでは不十分。見つけてもらう必要があります——それが SEO(検索エンジン最適化)の意味。幸い Astro は SEO に強い。静的 HTML、高速読み込み、セマンティックタグ——検索エンジンが好む要素が揃っています。

Meta タグの設定:検索エンジンにコンテンツを伝える

src/layouts/BaseLayout.astro(またはベースレイアウト)の <head> に追加:


---

interface Props {
  title: string;
  description?: string;
  image?: string;
}

const { title, description = '私の技術ブログ', image = '/og-image.jpg' } = Astro.props;
const canonicalURL = new URL(Astro.url.pathname, Astro.site);

---

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width" />
  <link rel="icon" type="image/svg+xml" href="/favicon.svg" />

  <title>{title} | 私のブログ</title>
  <meta name="description" content={description} />
  <link rel="canonical" href={canonicalURL} />

  <!-- Open Graph(SNS シェア) -->
  <meta property="og:title" content={title} />
  <meta property="og:description" content={description} />
  <meta property="og:image" content={new URL(image, Astro.site)} />
  <meta property="og:url" content={canonicalURL} />

  <!-- Twitter Card -->
  <meta name="twitter:card" content="summary_large_image" />
  <meta name="twitter:title" content={title} />
  <meta name="twitter:description" content={description} />
  <meta name="twitter:image" content={new URL(image, Astro.site)} />
</head>

各ページに完全な Meta 情報が付き、Twitter などでシェアしたときもきれいなカードが表示されます。

Sitemap の生成:検索エンジンにページ一覧を伝える

とても簡単。一行コマンド:

npx astro add sitemap

astro.config.mjs でドメインを設定:

export default defineConfig({
  site: 'https://あなたのドメイン.com',
  integrations: [sitemap()],
});

デプロイ後、sitemap は https://あなたのドメイン.com/sitemap-index.xml に自動生成。Google Search Console にこの URL を登録すれば、数日後に記事がインデックスされ始めます。

性能最適化:速度も SEO の要素

Astro 自体は十分速いですが、さらに効くテクニックがあります。

1. 画像最適化

Astro の <Image> コンポーネントを通常の <img> の代わりに:


---

import { Image } from 'astro:assets';
import myImage from '../assets/photo.jpg';

---

<Image src={myImage} alt="説明文" />

自動で:

  • モダン形式(WebP/AVIF)に変換
  • 複数サイズのレスポンシブ画像を生成
  • 遅延読み込み

2. CSS/JS 圧縮

本番ビルド時に Astro が自動圧縮。追加設定は不要。ただし使わない依存関係は削除してサイズを減らしましょう。

3. フォント最適化

Google Fonts やカスタムフォントを使う場合、font-display: swap を追加して、フォント読み込みがレンダリングをブロックしないように:

@font-face {
  font-family: 'MyFont';
  src: url('/fonts/myfont.woff2') format('woff2');
  font-display: swap;
}

これらの最適化を終えると、Lighthouse スコアは 95 点以上に安定します。私のブログは第三者スクリプトで Best Practices が少し減点される以外、他は満点です。

第 6 章:デプロイ(無料ホスティングを選ぶ)

コードができたら、いよいよ全世界に公開——最もワクワクする部分です。無料で使いやすいホスティングを 2 つ紹介します。どちらか 1 つを選んでください。

方法 1:Vercel デプロイ(初心者向け)

Vercel が最もおすすめ。Astro をネイティブサポートし、ゼロ設定で動きます。

ステップ 1:GitHub にコードを push

リポジトリがなければ、プロジェクトルートで:

git add .
git commit -m "Initial commit"
git branch -M main
git remote add origin https://github.com/あなたのユーザー名/my-blog.git
git push -u origin main

ステップ 2:Vercel でプロジェクトをインポート

  1. vercel.com でアカウント登録(GitHub ログインが便利)
  2. 「New Project」をクリック
  3. my-blog リポジトリを選択
  4. Vercel が Astro を自動認識。設定変更不要
  5. 「Deploy」をクリック。1〜2 分で完了

ステップ 3:ブログにアクセス

デプロイ成功後、xxx.vercel.app のドメインが付与されます。アクセスすればブログが見えます。

カスタムドメインの紐付け(任意)

独自ドメインがあれば、Vercel のプロジェクト設定でドメインを追加し、DNS プロバイダーで CNAME レコードを Vercel の指示どおり設定。Vercel が手順を案内してくれます。

初心者向け注意

  • astro.config.mjs に正しい site アドレスを設定
  • 環境変数は Vercel ダッシュボードで設定。コードに直接書かない
  • 初回デプロイは 5 分かかることも。焦らず待つ

方法 2:Netlify デプロイ(代替案)

Netlify も Vercel と似ていますが、国内からのアクセス速度はやや安定する場合があります。

ステップ 1:GitHub にコードを push

(Vercel と同じ)

ステップ 2:Netlify でプロジェクトをインポート

  1. netlify.com でアカウント登録
  2. 「Add new site」→「Import an existing project」
  3. GitHub を接続し、リポジトリを選択
  4. ビルド設定:
    • Build command: npm run build
    • Publish directory: dist
  5. 「Deploy」をクリック

ステップ 3:ブログにアクセス

同様に xxx.netlify.app のドメインが付与されます。

どちらを選ぶ?

プラットフォーム強み弱み向いている人
VercelAstro 自動設定
エッジネットワークが速い
CI/CD 体験が良い
国内アクセスがたまに遅い体験を重視する開発者
Netlify国内アクセスが安定
無料枠が大きい
プラグインが豊富
設定がやや複雑日本語読者向けブログ

おすすめ:まず Vercel を試し、国内が遅ければ Netlify に切り替え。どちらも GitHub に push すれば自動ビルド・更新。非常に便利です。

自動デプロイの魔法

今やることは 3 ステップだけ:

  1. ローカルで記事を書く(Markdown ファイル)
  2. git add .git commit -m "新記事"git push
  3. 2 分待てば、サイトに自動公開

サーバーにログインする必要も、手動ビルドも、ファイルアップロードも不要。モダンなデプロイの魔法——初めて体験したとき、本当に驚きました。

第 7 章:よくある問題と解決策(踏んだ坑を先に知る)

コミュニティで実際につまずいた問題集。事前に知っておけば時間を節約できます。

問題 1:Tailwind スタイルが効かない

症状:Tailwind クラス名を書いても、ページに反映されない。

原因tailwind.config.mjscontent パス設定が間違い、Tailwind がファイルをスキャンしていない。

解決策

tailwind.config.mjs を開き、content 配列にスキャン対象ファイルがすべて含まれているか確認:

export default {
  content: [
    './src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}',
  ],
  theme: {
    extend: {},
  },
  plugins: [],
}

変更後、開発サーバーを再起動(Ctrl+C で停止 → npm run dev)。

問題 2:ビルド時に “Invalid frontmatter” エラー

症状:ローカルでは正常、npm run build でエラー。

原因:Markdown 記事の frontmatter 形式が不正、または必須フィールド不足。

解決策

src/content/config.ts(あれば)で必須フィールドを確認。Blog テンプレートの一般的な要件:


---

title: '記事タイトル'           # 必須
description: '記事の説明'     # 必須
pubDate: 'Dec 02 2025'     # 必須。日付形式に注意
tags: ['タグ1', 'タグ2']   # 任意

---

Content Collections の利点は、ビルド時に検証してくれること——本番障害を防げます。

問題 3:デプロイ後 404、ローカルは正常

症状:ローカル開発は問題なし、Vercel/Netlify デプロイ後に記事ページが 404。

原因astro.config.mjsbase パス設定ミス、または site 未設定。

解決策

設定ファイルに以下があるか確認:

export default defineConfig({
  site: 'https://あなたのドメイン.com',  // 必須
  // base: '/blog',  // サブディレクトリデプロイ時のみ
});

ブログがサブディレクトリ(xxx.com/blog など)にないなら、base は設定しない。

問題 4:画像の読み込みが遅い

症状:記事内の画像読み込みが遅く、体験が悪い。

原因:Astro の Image コンポーネント未使用、または画像自体が大きすぎる。

解決策

  1. Image コンポーネントを使用(推奨):

---

import { Image } from 'astro:assets';

---

<Image src="/images/photo.jpg" alt="説明" width={800} height={600} />
  1. 画像を圧縮:TinyPNG や Squoosh.app で圧縮してからアップロード

  2. CDN を使用:Cloudinary、Imgur などの画像ホスティングに置き、CDN リンクで参照

問題 5:コードブロックにシンタックスハイライトがない

症状:Markdown のコードブロックがプレーンテキスト表示。

原因:テーマ未設定、または Shiki プラグインの問題。

解決策

astro.config.mjs でコードハイライトテーマを設定:

export default defineConfig({
  markdown: {
    shikiConfig: {
      theme: 'github-dark',  // または 'dracula', 'nord' など
    },
  },
});

Blog テンプレートには Shiki が付属。それでもダメなら依存関係を再インストール:rm -rf node_modules && npm install

問題 6:開発サーバーの起動が遅い

症状npm run dev の起動に時間がかかる。

原因:記事が多い、またはプラグインが多すぎる。

解決策

  • node_modulespackage-lock.json を削除して再インストール
  • 不要なプラグインを減らす
  • 最新版 Astro にアップグレード(npm install astro@latest

Astro 5.x では起動速度が大幅改善。4.x を使っているならアップグレード推奨。

大半の問題には遭遇しないでしょう。万一つまずいたら、この章に戻って確認してください。私もこれらの坑でかなり時間を浪費しました——経験を共有します。

結論

このチュートリアルをここまで進めたなら、おめでとうございます。機能的で性能に優れた、すぐ使える Astro ブログが手元にあります。実現したことを振り返りましょう:

完全なブログシステム:トップページ、記事一覧、詳細ページ、タグ分類、RSS
SEO 最適化:Meta タグ、Sitemap、性能最適化でコンテンツを見つけやすく
モダンなデプロイ:自動 CI/CD。push すれば公開、サーバー保守不要
優れた性能:Lighthouse 95 点以上、初回表示 0.8 秒、UX も抜群

さらに重要なのは、Astro の核心理念——コンテンツ優先、性能至上——を理解したこと。この考え方はブログだけでなく、他の静的サイトにも応用できます。

次にできること

今すぐ行動(先延ばしにしない):

  • 1 時間かけて実践。記事を見ながら手を動かす
  • 最初の本当の記事を公開。テスト内容でも OK
  • 友人や SNS で共有し、フィードバックを集める

応用機能(少しずつ):

  • コメントシステム:Giscus(GitHub Discussions ベース)や Disqus
  • 検索機能:Algolia DocSearch や Pagefind
  • ダークモード:テーマ切替ボタン
  • 閲覧統計:Google Analytics や Plausible
  • 前後記事ナビゲーション:記事間の関連性を高める

学習リソース(Astro を深掘り):

  • Astro 公式ドキュメント — 最も信頼できる資料。日本語版あり
  • Astro 中文网 — コミュニティが維持する中国語ドキュメント
  • Astro Paper — SEO に優れたブログテンプレート
  • Astro GitHub ディスカッション — 質問と経験共有

コミュニティに参加(一人で戦わない):

  • Astro Discord — 公式 Discord。活発
  • GitHub で “awesome-astro” を検索。優れたリソース集が多数
  • ブログ URL を Astro コミュニティの Showcase チャンネルで共有し、フィードバックを得る

最後に

ブログ構築で、技術は第一歩にすぎません。継続的な執筆の方がはるかに重要です。1 週間かけてフレームワークをいじり、2 記事で更新停止——そんな人をたくさん見てきました。Astro は技術的ハードルを最小限にしてくれます。残るのは、出力を続ける意志です。

実践中に問題があれば:

  1. Astro 公式ドキュメントの「Troubleshooting」を確認
  2. GitHub リポジトリの Issues でキーワード検索
  3. Astro Discord で質問(英語中心だが、中国語チャンネルもあり)

失敗を恐れないで。私も最初の Astro ブログ公開まで 3 日かかりました。一度慣れれば、保守は本当に楽です。

さあ、コマンドラインを開いて、Astro ブログの旅を始めましょう。

ゼロから Astro ブログを構築する完全フロー

1 時間で環境準備からデプロイまで。トップページ、記事一覧、タグ分類、RSS、SEO 最適化を含む

⏱️ 目安時間: 1 時間

  1. 1

    ステップ1: 環境準備とプロジェクト作成

    環境準備:
    • Node.js 18 以上を確認(node -v でチェック)
    • 未インストールなら nodejs.org からダウンロード

    プロジェクト作成:
    • 実行:npm create astro@latest my-blog
    • テンプレートを選択(Blog テンプレート推奨)
    • TypeScript を使うか(Yes 推奨)
    • 依存関係をインストールするか(Yes)

    開発サーバー起動:
    • プロジェクトディレクトリへ:cd my-blog
    • 実行:npm run dev
    • http://localhost:4321 で確認
  2. 2

    ステップ2: プロジェクト構成とレイアウト作成

    プロジェクト構成:
    • src/pages:ページファイル
    • src/components:コンポーネント
    • src/layouts:レイアウト
    • src/content:Markdown 記事

    レイアウト作成:
    • src/layouts/BaseLayout.astro をベースレイアウトとして作成
    - HTML 構造、ナビゲーション、フッターを含む
    • src/layouts/BlogLayout.astro を記事レイアウトとして作成
    - BaseLayout を継承し、記事用スタイルを追加
  3. 3

    ステップ3: トップページと記事一覧の実装

    トップページ:
    • src/pages/index.astro でトップページを作成
    • 最新記事一覧とカテゴリを表示

    記事一覧:
    • Astro の Content Collections を使用
    • src/content/posts 配下の Markdown を読み込み
    • 日付順に表示

    ページネーション:
    • 記事が多い場合はページネーションを実装
    • 1 ページ 10 件表示

    タグ分類:
    • 記事 frontmatter から tags を抽出
    • タグクラウドとカテゴリページを生成
  4. 4

    ステップ4: 記事詳細ページと RSS の実装

    記事詳細ページ:
    • src/pages/posts/[...slug].astro で動的ルートを作成
    • slug に応じて Markdown をマッチさせてレンダリング

    Markdown レンダリング:
    • Astro 組み込みの Markdown サポートを使用
    • コードハイライト、リンク、画像などを自動レンダリング

    RSS 設定:
    • @astrojs/rss パッケージをインストール
    • src/pages/rss.xml.ts で RSS フィードを生成
    • 全記事のタイトル、説明、公開日時などを含める
  5. 5

    ステップ5: SEO 最適化とデプロイ

    SEO 最適化:
    • レイアウトに meta タグ(title、description、og:image など)を追加
    • sitemap.xml でサイトマップを自動生成
    • robots.txt を設定

    性能最適化:
    • Astro の Image コンポーネントで画像を最適化
    • コード分割を有効化
    • プリロードを設定

    デプロイ:
    • Vercel(GitHub 連携で自動デプロイ)
    • Netlify(dist フォルダのドラッグ&ドロップ、または Git 連携)
    • Cloudflare Pages(Git 連携で自動デプロイ)
    • デプロイ後すぐアクセス可能。HTTPS 自動、グローバル CDN、無料枠あり

FAQ

なぜ Astro を選ぶのか?性能上のメリットは?
Astro の性能メリット:
• 初回表示が 3.2 秒から 0.8 秒に短縮
• Lighthouse 100 点(以前の WordPress は 65 点)
• JavaScript サイズが 280KB から 20KB 未満に
• React フレームワークより 40% 速い

Islands アーキテクチャの要点:
• コンテンツ優先で JavaScript は必要なときだけ読み込み
• デフォルトは純粋な HTML+CSS
• インタラクティブが必要な箇所だけ JavaScript を配信
• React と Vue コンポーネントを混在可能

開発体験:Markdown で記事を書くだけ。データベースや CMS は不要。VSCode で Markdown を書き、GitHub に push すれば自動デプロイ。
Astro ブログをゼロから構築する手順は?
環境準備:
• Node.js 18 以上を確認
• npm create astro@latest my-blog を実行
• Blog テンプレート、TypeScript、依存関係インストールを選択
• cd my-blog でプロジェクトディレクトリへ移動
• npm run dev で開発サーバーを起動

プロジェクト構成:
• src/pages:ページファイル
• src/components:コンポーネント
• src/layouts:レイアウト
• src/content:Markdown 記事

レイアウト作成:
• BaseLayout.astro をベースレイアウトとして作成
• BlogLayout.astro を記事レイアウトとして作成

トップページと記事一覧:
• src/pages/index.astro でトップページを作成
• Content Collections で Markdown を読み込み
• 日付順に表示、ページネーションとタグ分類に対応

記事詳細ページ:
• src/pages/posts/[...slug].astro で動的ルートを作成
• slug に応じて Markdown をマッチさせてレンダリング

RSS 設定:
• @astrojs/rss パッケージをインストール
• rss.xml.ts で RSS フィードを生成
Astro ブログのコア機能はどう実装する?
トップページ:
• src/pages/index.astro でトップページを作成
• 最新記事一覧とカテゴリを表示
• Content Collections で src/content/posts 配下の Markdown を読み込み

記事一覧:
• 日付順に表示
• ページネーション(1 ページ 10 件)
• タグ分類(frontmatter から tags を抽出し、タグクラウドとカテゴリページを生成)

記事詳細ページ:
• src/pages/posts/[...slug].astro で動的ルートを作成
• slug に応じて Markdown をマッチさせてレンダリング
• Markdown レンダリング(コードハイライト、リンク、画像など自動)

タグ分類:
• frontmatter から tags を抽出
• タグクラウドとカテゴリページを生成

RSS:
• @astrojs/rss パッケージをインストール
• src/pages/rss.xml.ts で RSS フィードを生成
• 全記事のタイトル、説明、公開日時などを含める
Astro ブログの SEO と性能はどう最適化する?
SEO 最適化:
• レイアウトに meta タグ(title、description、og:image など)を追加
• sitemap.xml でサイトマップを自動生成
• robots.txt を設定

性能最適化:
• Astro の Image コンポーネントで画像を最適化
• コード分割を有効化
• プリロードを設定

Astro の Islands アーキテクチャは性能最適化に天然適合:
• デフォルトは純粋な HTML+CSS
• インタラクティブが必要な箇所だけ JavaScript を配信
• 従来の React フレームワークより 40% 速く、JavaScript サイズは 90% 削減
Astro ブログはどうデプロイする?選択肢は?
デプロイ選択肢:

Vercel:
• GitHub リポジトリと連携して自動デプロイ
• 無料、HTTPS 自動、グローバル CDN

Netlify:
• dist フォルダのドラッグ&ドロップ、または Git 連携
• 無料、HTTPS 自動

Cloudflare Pages:
• Git 連携で自動デプロイ
• 無料、グローバル CDN

デプロイ手順:
• npm run build で dist フォルダを生成
• 選択したプラットフォームに dist をデプロイ、または GitHub 連携で自動デプロイ
• デプロイ後すぐアクセス可能。HTTPS 自動、グローバル CDN、無料枠あり
Astro ブログに追加できる応用機能は?
コメントシステム:
• Giscus(GitHub Discussions ベース)や Disqus を統合
• 読者が記事下にコメント可能

検索機能:
• Algolia DocSearch や Pagefind でサイト内検索
• 読者が欲しいコンテンツを素早く発見

ダークモード:
• テーマ切替ボタンを追加

閲覧統計:
• Google Analytics や Plausible(プライバシー重視)を統合
• 記事の閲覧状況を把握

これらは対応する Astro インテグレーションをインストールするだけ。設定はシンプルで、性能への影響も小さい。

8分で読めます · 公開日: 2025年12月2日 · 更新日: 2026年6月8日

関連記事

コメント

GitHubアカウントでログインしてコメントできます