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

Astroパフォーマンス最適化完全ガイド:Lighthouse 60点から満点へ導く8つの実践テクニック

はじめに

先月、Astroで構築したプロジェクトサイトをローカルで動かしていた時は爆速で、「これはLighthouse満点間違いなし!」と思っていました。しかし本番環境にデプロイして計測した結果は……70点。私の顔は「???」となりました。

正直、かなりショックでした。「Astroは生まれつき速いんじゃないの?」静的レンダリングを使っているのに、なぜこんなに低いのか?

数日かけて調査した結果、これは多くの人が陥る罠だとわかりました。理論上、Astroサイトは常にLighthouse 100点を狙えます。データによると、Astroサイトの60%がCore Web Vitalsで「良好」評価を得ているのに対し、WordPressやGatsbyは38%に留まります。では、なぜあなたは80点の壁を超えられないのでしょうか?

問題はフレームワークではなく、その性能を引き出しきれていないことにあります。例えば、すべてのコンポーネントに client:load をつけてしまっていたり(私もやらかしました)、画像がJPEGのままだったり、フォント最適化を忘れていたりしませんか?

この記事では、アイランドアーキテクチャ、ハイドレーション戦略、画像・フォント最適化、コード分割、プリロード、Core Web Vitals調整、パフォーマンステストという8つの核心的なポイントを通して、Astroサイトを体系的に最適化する方法を解説します。60点から95点以上、いや満点を目指しましょう。

第1章:Astroの性能優位性を理解する——なぜ速いのか

具体的な最適化手法に入る前に、Astroがなぜ速いのか、その底层ロジックを理解しておきましょう。

ゼロ JavaScript 戦略:デフォルトでJSを送らない

Astro最大の特徴は「デフォルトでゼロJS」です。現代のウェブサイトでJSなしなんてあり得るの?と思うかもしれませんが、Astroはビルド時に全てを静的HTMLとしてレンダリングし、あなたが明示的にインタラクションを求めた場所だけにJavaScriptをロードします。

従来のReact SPAはどうでしょう?使う使わないに関わらず、フレームワーク全体のJSがバンドルされます。私が以前計測したReactプロジェクトでは、平均500KBのJSのうち60%が全く使われていませんでした。これらはダウンロード時間を増やすだけでなく、ブラウザの解析・実行時間も奪います。

Astroは逆を行きます。まずは純粋なHTMLを返し、秒速で表示。インタラクションが必要なら、そのコンポーネントのJSだけをオンデマンドでロードします。データで見ると、AstroはReactフレームワークより40%高速で、ブラウザへの送信JS量は90%削減されます。

40%
性能向上
React系フレームワーク比
90%
JS削減
ブラウザへの送信量
60%
CWV良好率
WordPress等の38%を圧倒

アイランドアーキテクチャ:インタラクションを「孤立」させる

「アイランド(島)」という概念、最初はピンと来ないかもしれません。ページ全体を「海(静的HTML)」と見なし、その上に浮かぶ「小島(インタラクティブなコンポーネント)」があると想像してください。各島は独立しており、互いに干渉しません。

ブログ記事ページを例にすると:

  • 記事本文:静的HTML(JS不要)
  • ナビゲーション:静的HTML(JS不要)
  • コメント欄:要インタラクション(JSロード)
  • シェアボタン:要インタラクション(JSロード)

Astroはコメント欄とシェアボタンにだけJSをロードし、他は純粋なHTMLのままにします。コメント欄が壊れても、ページ全体が白くなることはありません。
GatsbyからAstroへ移行したある事例では、ビルド時間が2分から50秒以下になり、Core Web Vitalsが劇的に改善しました。

部分ハイドレーション:タイミングの精密制御

従来のSSR(サーバーサイドレンダリング)の問題点は、HTML表示後にブラウザがページ全体を「ハイドレーション(Hydration)」して動的にする処理が必要なことでした。これはメインスレッドをブロックし、ユーザーは「見えるけどボタンが押せない」状態になりがちです。

Astroの部分ハイドレーション(Partial Hydration)は、いつコンポーネントをハイドレーションするかを精密に制御できます:

  • ページロード時?
  • ブラウザが暇な時?
  • 画面に見えた時?

この制御により、TTI(Time to Interactive:操作可能になるまでの時間)を300%削減できます。次章で具体的な使い方を説明します。

要するに、Astroの性能の秘訣は**「本当に必要な時に、本当に必要なコードだけをロードする」**ことです。言葉にすればシンプルですが、従来のSPAの「全部まとめてロード」とは真逆のアプローチなのです。

第2章:アイランドアーキテクチャとハイドレーション戦略

ここからが本番です。Astroの武器を使いこなすための核心部分であり、私が一番ハマった所でもあります。

正しい client 指令を選ぶ:最適化の鍵

Astroはいくつかの client 指令でハイドレーションのタイミングを制御します。最初は面倒で全部 client:load にしてしまいがちですが、それではReact SPAと変わらず、Astroを使う意味がありません。

client:load - ロード後すぐにハイドレーション

適用シーン:ファーストビューにある重要なインタラクション機能。

---
import Navigation from '../components/Navigation.jsx';
---
<Navigation client:load />

ナビゲーションバーや検索ボックスなど、ユーザーがすぐに使いそうなものにはOKです。しかし乱用厳禁です。

client:idle - アイドル時にハイドレーション

適用シーン:重要度が低い機能、急がない機能。

---
import NewsletterSignup from '../components/NewsletterSignup.jsx';
---
<NewsletterSignup client:idle />

私はこれを多用しています。メルマガ登録フォームやSNSシェアボタンなど、ユーザーが記事を読んだ後に操作するようなものは、ブラウザの手が空いた時に読み込めば十分です。requestIdleCallback() を使い、重要なレンダリングをブロックしません。

client:visible - 画面に入ったらハイドレーション

適用シーン:画面下部のコンテンツ。

---
import CommentSection from '../components/CommentSection.jsx';
---
<CommentSection client:visible />

コメント欄、フッターの機能、画像カルーセルなど、スクロールしないと見えないものはこれ一択です。IntersectionObserver を使い、ユーザーが見るまでロードしません。帯域の節約にもなります。

client:media - メディアクエリ条件でハイドレーション

適用シーン:レスポンシブなコンポーネント。

---
import MobileSidebar from '../components/MobileSidebar.jsx';
---
<MobileSidebar client:media="(max-width: 768px)" />

スマホ専用サイドバーなど、PCでは不要なJSをロードしないようにできます。

過剰なハイドレーションの罠

「とりあえず client:load」は最悪手です。正しいアプローチは、「すべてのコンポーネントは静的である」と仮定し、「どうしてもインタラクションが必要な箇所」にだけ最小限の指令を与えることです。

  • ただ表示するだけのカードコンポーネント? → client指令不要。
  • カードの中の「いいね」ボタンだけ動かしたい? → ボタンだけ別コンポーネントにして client:visible

この「デフォルト静的」というマインドセットの切り替えが重要です。

不要なJavaScript依存の削除

ライブラリのチェックも忘れずに。
moment.js を使っていませんか?現代なら DateIntl.DateTimeFormat で十分ですし、その200KBを削減できます。
lodash を丸ごとインポートしていませんか? import _ from 'lodash' は悪手です。配列操作ならネイティブ関数を使いましょう。

実例:ナビゲーション+コメント欄の最適化

私のブログでの実例です。以前は両方に client:load を使っていたため、初期JSが150KB、LCP(最大視覚コンテンツの表示時間)が3.2秒でした。

最適化後:

  • ナビゲーション:client:load(即座に使うため維持)
  • コメント欄:client:visible(スクロールするまでロードしない)
  • シェアボタン:client:idle(優先度低)

結果:初期JSは45KBに激減、LCPは1.6秒に短縮、Lighthouseスコアは72から94に跳ね上がりました。

難しいコードを書いたわけではありません。**「すべてのコンポーネントに即時のインタラクションは不要」**と気づいただけです。

(第3章〜第8章は省略されていますが、全体の構成として画像最適化、フォント、コード分割、Web Vitalsなどが続きます)

結論

Astroのパフォーマンス最適化の極意は、一言で言えば**「必要な時に、必要なコードだけ」**です。

アイランドアーキテクチャ、ハイドレーション戦略、画像最適化…これら8つのポイントは、すべて「ユーザーがいかに早くコンテンツに到達し、操作できるか」のためにあります。

私は最初、静的レンダリングさえしていれば速いと思い込んでいました。しかし、体系的な最適化を行うことで、スコアは96点、LCPは1.6秒になり、ユーザー定着率も15%向上しました。パフォーマンスはただの数字ではなく、ビジネス価値そのものです。

今すぐやるべきこと:

  1. Lighthouseで計測し、弱点を知る。
  2. インパクトの大きい画像とフォント最適化から着手する。
  3. client: 指令を見直し、無駄な即時ロードを止める。

焦らず進める:
すべての最適化を一度にやる必要はありません。まずは大物を退治し、徐々に細部を詰めましょう。98点から100点にするために1ヶ月かける必要はありません。ユーザー体験が第一です。

継続的な監視:
新機能追加時は必ずパフォーマンスをチェックしましょう。速さは維持するものです。

この記事が、あなたのAstroサイトを爆速にする手助けになれば幸いです。

Astroパフォーマンス最適化完全ガイド

Lighthouseスコアを改善するための体系的な最適化ステップ

⏱️ Estimated time: 4 hr

  1. 1

    Step1: Astroの特性理解

    デフォルトでゼロJS、アイランドアーキテクチャによる分離、部分ハイドレーションによる制御という3大特徴を理解し、React SPAとの違いを把握する。
  2. 2

    Step2: ハイドレーション戦略の適用

    各コンポーネントの重要度と位置に応じて、client:load(即時)、client:idle(アイドル時)、client:visible(表示時)を適切に使い分ける。
  3. 3

    Step3: 画像とフォントの最適化

    Astroの<Image />コンポーネントでWebP/AVIF化と遅延読み込みを実装。フォントはfont-display: swapとプリロードを設定する。
  4. 4

    Step4: コード分割とプリロード

    不要なライブラリ(moment.js等)を削除し、動的インポートを活用。重要なリソースには<link rel='prefetch'>やdns-prefetchを設定する。
  5. 5

    Step5: Core Web Vitals対策

    LCP(ロード時間)、FID(応答性)、CLS(レイアウトシフト)の各指標を監視し、改善する。

FAQ

なぜAstroは速いのですか?
Astroはビルド時にページを静的HTMLとして生成し、デフォルトでJavaScriptをブラウザに送信しないためです(ゼロJS戦略)。必要な箇所だけ動的にする「アイランドアーキテクチャ」により、従来のReact SPAに比べてJS送信量を約90%削減できます。
client:load と client:visible の使い分けは?
ヘッダーやナビゲーションなど、ユーザーがページを開いてすぐ操作する可能性が高いものは `client:load`。コメント欄やフッターのカルーセルなど、スクロールしないと見えないものは `client:visible` を選び、初期ロードの負荷を下げます。
Core Web Vitalsとは何ですか?
Googleが重視するWeb体験の3つの指標です。LCP(最大コンテンツの描画速度)、FID(初回入力遅延)、CLS(累積レイアウトシフト)で構成され、検索順位(SEO)にも影響します。

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

コメント

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

関連記事