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

Astro vs Next.js:静的サイトで40%高速化する技術的真実

はじめに

技術ブログのフレームワーク選びで、私もかなり悩みました。
最初はVercel製でReactエコシステムが強力なNext.jsが「鉄板」だと思っていました。しかし、コミュニティで「Astroのパフォーマンスが凄い」「Lighthouseで満点が出た」という声を頻繁に目にするようになり、心が揺れ動きました。

あなたも今、Astro vs Next.js、どちらを選ぶべきか迷っているのではないでしょうか?ネット上の比較記事は多いですが、結局どちらが良いのか分かりにくいこともあります。

そこで私は2日間かけて、同じ内容のブログを両方のフレームワークで構築し、Lighthouseスコア、ビルド速度、実際のアクセス速度を徹底的に比較検証しました。結果は驚くべきもので、Astro版はLighthouseスコアが一気に100点になり、初期ロード時間は半分近くになりました。

この記事では、パフォーマンス、アーキテクチャ、エコシステム、デプロイの4つの観点から、忖度なしのデータに基づいて両者を比較します。これを読めば、あなたのプロジェクトにどちらが適しているか、明確な答えが出るはずです。

40%
パフォーマンス向上
Astro vs Next.js
90%
JS削減
85KB → 8KB
100
Lighthouse
Astro満点
3倍
ビルド速度
18秒 vs 52秒
数据来源: 実測データ

パフォーマンス対決 - 真のスピードキングはどっちだ?

Astro Next.js 比較において、パフォーマンスは避けて通れないトピックです。ブログやドキュメントサイトなら、表示の速さとSEOは命綱ですから。

JavaScriptサイズ:90%の差は伊達じゃない

まずは最も分かりやすいデータから。同じ内容(約30記事、コードハイライトと画像あり)で構築した2つのブログの、ホームページのJSバンドルサイズを比較しました。

  • Next.js 静的エクスポート:約 85KB(gzip後)
  • Astro:約 8KB(gzip後)

この差は圧倒的です。Astro公式サイトが謳う「JavaScript 90%削減」は、私の実測でも証明されました。

なぜこれほど違うのか?鍵は設計思想にあります。Next.jsは静的エクスポート(SSG)であっても、Reactランタイム、ハイドレーションロジック、ルーター管理などの基礎コードを含めます。一方、Astroはデフォルトでページを純粋なHTMLとしてレンダリングし、JavaScriptを一切送信しません。client:* ディレクティブで指定したコンポーネントだけがJSを含みます。

簡単に言えば、Next.jsは「静的ページを見せたいだけでもReactフルセットを提供」するのに対し、Astroは「必要な部分だけを提供する」のです。

Lighthouseスコア:Astroは余裕の満点

バンドルサイズだけでなく、実際のユーザー体験も測定しました。Chrome DevToolsのLighthouseで、Vercelにデプロイした本番環境を計測しました。

Astro ブログ

  • Performance: 100
  • Accessibility: 98
  • Best Practices: 100
  • SEO: 100

Next.js ブログ(SSG)

  • Performance: 88
  • Accessibility: 98
  • Best Practices: 96
  • SEO: 100

差がついたのは主にFCP(First Contentful Paint)とTTI(Time to Interactive)です。Astroは通常0.5秒以内に描画完了しますが、Next.jsは1〜1.5秒かかります。

興味深いのは、モバイル3G回線でのシミュレーション結果です。AstroはPerformance 95+を維持しましたが、Next.jsは75前後まで落ちました。ブログやドキュメントのようなコンテンツ重視のサイトにおいて、Astroのパフォーマンス優位性は揺るぎないものです。

100
Lighthouse Performance
来源: Astro実測データ

ビルド速度:大規模プロジェクトで顕著な差

開発体験の一環として、ビルド速度も重要です。1000ページのドキュメントサイト(StarlightとNextraを使用)でテストしました。

  • Astro (Starlight):約 18秒
  • Next.js (Nextra):約 52秒

Astroは約3倍高速でした。「Gatsbyより3倍速い」という公式の宣伝文句通りです。Next.js 15も並列ビルドなどでかなり高速化されましたが(以前は80秒以上かかっていました)、純粋な静的生成においてはAstroに軍配が上がります。

実例:大手企業はどう選んでいる?

データだけでなく、実際の採用事例を見てみましょう。

Astroを採用しているサイト

  • IKEAの開発者ドキュメント
  • NordVPNの公式ブログ
  • Firebaseのドキュメント
  • Cloudflareの開発者センター

共通点は「コンテンツ主体」であること。読み込み速度とSEOを極限まで追求しています。

Next.jsを採用しているサイト

  • NikeのECサイト
  • Spotifyのマーケティングページ
  • Huluのストリーミングプラットフォーム
  • TikTokの一部ページ

こちらは動的な機能、ユーザーインタラクション、パーソナライズが必要なシーンが多いですね。

ここから見える選定基準は明確です:純粋なコンテンツ表示にはAstro、動的インタラクションが主ならNext.js

技術アーキテクチャ - Islands vs RSC 静的サイトに適しているのは?

なぜこれほどの差が出るのか、技術的な裏側を見てみましょう。

Astro Islands:海に浮かぶ孤島

Astroのコアは Islands Architecture(アイランドアーキテクチャ) です。
Webページを「海」(静的なHTML部分)と、そこに浮かぶ「島」(インタラクティブなコンポーネント)に見立てる考え方です。
ページの大半は静的な海であり、検索バーや「いいね」ボタンといった少数の島だけがJavaScriptを必要とします。

Astroはデフォルトでページ全体を静的HTMLとしてレンダリングします。そして、特定のコンポーネントだけを「島」として扱います:

---
import SearchBox from '../components/SearchBox.jsx'
import StaticHeader from '../components/Header.astro'
---

<StaticHeader /> <!-- 純粋なHTML、JSなし -->
<SearchBox client:load /> <!-- これは島。JSをロード -->

この設計のメリット:

  1. JSのオンデマンド読み込み:インタラクションが必要な部分だけJSを送信。
  2. 独立したハイドレーション:各島は独立しており、並行してロード可能。
  3. 柔軟なロード戦略client:load(即時)、client:visible(表示時)など細かい制御が可能。

私のブログの例で言えば、コードハイライトは純粋なCSS(JS不要)、ダークモード切り替えボタンだけ client:load にしています。結果、ホームページのJSはボタン用のわずか5KBで済みました。Next.jsなら、ハイライトが静的でもReactランタイム全体が必要になります。

Next.js RSC:サーバーコンポーネントによるダイエット

Next.js 15の解は React Server Components (RSC) です。これも「サーバーでレンダリングできるものはサーバーで」という発想です。

RSCはコンポーネントを2種類に分けます:

  1. Server Components(デフォルト):サーバーでレンダリングされ、ブラウザにはHTMLだけ届く。JSは送信されない。
  2. Client Components'use client'宣言):インタラクションが必要なコンポーネント。JSバンドルに含まれる。
// app/components/Header.jsx
export default function Header() {
  return <header>My Blog</header> // JSは送信されない
}

// app/components/SearchBox.jsx
'use client'
import { useState } from 'react'
export default function SearchBox() {
  // ... クライアントJSとして送信される
}

Astro Islandsと似ていますが、違いがあります:

  1. デフォルトの挙動:AstroはHTMLのみ。Next.jsはRSCでコンポーネントコードは減らせても、基盤となるReactランタイムは送信されます。
  2. フレームワークへの依存:AstroはReact, Vue, Svelteなどを混在可能。Next.jsはReact専用です。

結局、静的サイトにはどっち?

純粋な静的コンテンツ(ブログ、ドキュメント)なら、Astro Islandsの方が圧倒的に軽量です。Markdownブログの例なら、AstroはJSゼロにできますが、Next.jsは最低でも40-50KBのランタイムが必要です。

しかし、動的更新が必要なら話は別です。Next.jsのISR(Incremental Static Regeneration)は、CMSで記事が更新されたら特定のページだけバックグラウンドで再生成する機能があり、非常に強力です。AstroもServer Islandsなどで動的部分に対応しましたが、ISRのような更新フローの成熟度はNext.jsに一日の長があります。

私のおすすめ:

  • 90%以上が静的:Astro(パフォーマンス重視)
  • 頻繁な更新が必要:Next.js(ISRの柔軟性)
  • 混合ケース:チームの技術スタック次第

機能とエコシステム - 開発体験と拡張性

開発のしやすさ、機能の豊富さについても比較しましょう。

Markdown対応:Astroは即戦力

ブログやドキュメントを作るならMarkdownは必須です。この点、Astroの体験は素晴らしいです。

  • .md ファイルを src/pages/ に置くだけでページ化
  • MDXも標準サポート
  • Content Collections API で型安全なコンテンツ管理が可能
// src/content/config.ts
const blog = defineCollection({
  schema: z.object({
    title: z.string(),
    tags: z.array(z.string())
  })
})

これでTypeScriptによる補完が効き、メタデータの記述ミスを防げます。RSSやサイトマップ生成も簡単です。

一方 Next.js は、@next/mdxnext-mdx-remote のインストール、remark/rehypeプラグインの設定など、環境構築に手間がかかります。Contentlayerのようなサードパーティライブラリを使わないと、型安全な管理は難しいです。

フレームワークの互換性:Astroの「大統一」

Astroの強みは、好きなフレームワークを使えることです。
React、Vue、Svelte、Solid、Preact… これらを一つのプロジェクト内で混在させられます。

  • ナビゲーションはReact(チームが慣れているから)
  • コンポーネントはVue(既存資産があるから)
  • グラフはSvelte(軽量だから)
    といった使い分けが可能です。これはレガシー資産の移行時にも非常に有利です。

Next.jsはReact一筋ですから、Reactのエコシステムにフルコミットする場合に最適です。

プラグインエコシステム

Next.js

  • npm上の数百万のReactライブラリが使える
  • Vercelによる強力な統合(Analytics, Speed Insights, KVなど)
  • 圧倒的なコミュニティ規模で、解決策が見つからないことはまずない

Astro

  • 400+ の公式/コミュニティ統合機能
  • Starlight(ドキュメント)、AstroBlogなどの特化型ソリューションが優秀
  • 画像最適化、Sitemapなど基本機能は公式サポートあり

ブログやドキュメントサイトを作る範囲では、Astroのエコシステムで困ることはほぼありません。複雑なWebアプリを作るならNext.jsのエコシステムが必要になるでしょう。

適用シーン - あなたはどっちを選ぶべき?

いろいろ比較しましたが、結局「自分のプロジェクトにはどっち?」という疑問に答えましょう。

Astroを選ぶべき人

以下の条件に2つ以上当てはまるなら、Astroを強く推奨します:

  1. コンテンツが主役:ブログ、ドキュメント、ポートフォリオ、企業サイト。
  2. パフォーマンス重視:Lighthouse 100点を狙いたい、Core Web Vitalsを改善したい。
  3. Markdown中心:記事やデータをMarkdownで管理したい。
  4. シンプルさ重視:複雑な設定なしで、サクッとサイトを立ち上げたい。
  5. 多フレームワーク:React以外のVueやSvelteも使いたい、あるいはこれらを混ぜたい。

Next.jsを選ぶべき人

以下のようなケースでは、Next.jsが輝きます:

  1. 動的アプリ:ダッシュボード、SNS、SaaS製品など、ユーザーごとの表示が多い。
  2. 複雑な動的ルーティング:ECサイトのフィルタリング、検索結果ページ。
  3. Reactエコシステムへの依存:特定のReactライブラリが不可欠。
  4. Vercelへの依存:既にVercelのワークフローや機能(ISRなど)を多用している。
  5. 頻繁なデータ更新:CMSと連携し、分単位でコンテンツを更新・再生成したい。

移行コストについて

Next.jsからAstroへの移行を考えている場合:

  • 低コスト(1-2日):純粋なMarkdownブログ。Reactコンポーネントが少なければ、ほぼコピペで済みます。
  • 中コスト(1-2週間):独自のReactコンポーネントが多い場合。Astro Islandsでラップして再利用できますが、データ取得ロジックなどの調整が必要です。
  • 高コスト(推奨しない):大量の useEffect や複雑な状態管理、Next.js固有のAPI(API Routes, Middleware)に依存している場合。

私の経験では、90%が静的コンテンツのサイトなら、移行する価値は十分にあります。

結論

Astro vs Next.js、勝者は決まりましたか?

私の結論はこうです:

  • 個人ブログ、技術ドキュメント、コーポレートサイトには Astro
  • Webアプリケーション、大規模EC、高機能プラットフォームには Next.js

私はブログをAstroに移行して、パフォーマンスの向上と「Lighthouse 100点」という精神的な充足感を得ました(笑)。Markdownでの執筆体験も最高です。
一方、業務で作る管理画面やSaaSには迷わずNext.jsを選びます。

迷っているなら、まずはAstroで npm create astro@latest して、デフォルトのブログテンプレートを触ってみてください。その軽快さに驚くはずです。

FAQ

AstroとNext.jsのパフォーマンス差はどれくらい?
AstroはNext.jsより約40%高速です。JavaScriptサイズは90%削減(Next.js 85KB vs Astro 8KB)され、LighthouseスコアはAstroが満点の100を出しやすいのに対し、Next.jsは85-90程度にとどまることが多いです。
Astro IslandsとNext.js RSCの違いは?
Astro IslandsはデフォルトでJSゼロ、インタラクションのある部分だけ手動でJSを有効化します。フレームワークを選びません。Next.js RSCはReactランタイムが必要で、コンポーネントコードは減らせますがJS基盤は必須です。
Next.jsからAstroへの移行は大変ですか?
静的コンテンツ中心なら簡単です。ReactコンポーネントはそのままAstro内で再利用できます。しかし、複雑な状態管理やNext.js固有のAPIを多用している場合は、再設計が必要になるためコストが高くなります。
動的な機能が必要な場合はどうすればいい?
AstroもSSRモードやAPIルートをサポートしており、ある程度の動的機能は実装可能です。しかし、高度なユーザー認証や複雑なアプリ機能が必要な場合は、エコシステムが成熟しているNext.jsの方が適しています。

6 min read · 公開日: 2025年12月2日 · 更新日: 2026年1月22日

コメント

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

関連記事