Astro画像最適化の完全ガイド:読み込み速度を50%改善する5つの実践テクニック

はじめに
先月、意気揚々とAstroで技術ブログを立ち上げました。しかし、スマホで開いてみて愕然としました。
画像の表示に6秒もかかる…
高解像度のカバー画像やスクリーンショットをそのまま貼っていたため、1ページで数MBもの巨大な通信が発生していたのです。
そこから2日間、Astroの画像最適化にとことん向き合いました。Imageコンポーネントの深堀り、フォーマット比較、遅延読み込み、CDN設定…。
結果、初期ロード時間は1.8秒まで短縮され、Google Lighthouseのスコアは62点から95点へ爆上がりしました。95点の緑色のリングを見た時の達成感と言ったら!
この記事では、私が実践して効果があった最適化テクニックを全て公開します。「なんとなく <img /> タグを使っている」あなた、必見です。
なぜ画像の最適化が最重要なのか
多くの開発者がコードのバンドルサイズを気にして数KBを削ろうと努力しますが、実は画像1枚のサイズ削減の方が遥かに効果的です。
Webページのデータ量の60〜70%は画像が占めています。
Googleの厳しい基準
GoogleのCore Web Vitalsには LCP (Largest Contentful Paint) という指標があります。これは「メインコンテンツ(多くの場合、メイン画像)が表示されるまでの時間」です。
2.5秒以内が合格ラインですが、最適化していない画像を使うと、このラインを軽々と超えてしまいます。LCPが悪いと、検索順位(SEO)に直結します。
実測データ:驚異の改善効果
私のブログでの最適化前後の比較です。
Astro Imageコンポーネント完全ガイド
Astroには <Image /> と <Picture /> という2つの強力なコンポーネントが組み込まれています。これらを使うだけで、面倒な処理を自動化できます。
基本:Image vs Picture
最もよく使うのは <Image /> です。
---
import { Image } from 'astro:assets';
import coverImage from '../assets/blog-cover.jpg';
---
<Image
src={coverImage}
alt="ブログカバー画像"
width={1200}
height={630}
/>これだけでAstroは以下の処理を自動で行います:
- 画像の圧縮
- WebP形式への変換(デフォルト)
- サイズ情報の付与(CLS防止)
- 遅延読み込みの設定
一方、<Picture /> はより高度な制御が必要な場合に使います。
---
import { Picture } from 'astro:assets';
import heroImage from '../assets/hero.jpg';
---
<Picture
src={heroImage}
formats={['avif', 'webp', 'jpeg']}
alt="ヒーロー画像"
width={1920}
height={1080}
/>これは <picture> タグと複数の <source> タグを生成し、ブラウザが対応している中で「最も軽量なフォーマット(AVIFなど)」を自動選択させることができます。
知っておくべき重要プロパティ
widths & sizes - レスポンシブ対応
<Image
src={image}
widths={[400, 800, 1200]}
sizes="(max-width: 768px) 400px, (max-width: 1024px) 800px, 1200px"
alt="レスポンシブ画像"
/>スマホには400pxの画像を、PCには1200pxの画像を提供します。無駄な通信を劇的に減らせます。
quality - 画質設定low, mid, high もしくは 0-100 の数値で指定。
私は通常 quality={80} または mid を推奨します。人間の目には見分けがつかないレベルで、容量を30-40%削減できます。
inferSize - リモート画像の救世主
外部URLの画像を使う場合、サイズが不明だとレイアウトシフト(CLS)の原因になります。
<Image
src="https://example.com/image.jpg"
inferSize={true}
alt="リモート画像"
/>これを付けると、Astroがビルド時に画像を取得してサイズを計算してくれます。
ローカル画像 vs リモート画像
ローカル画像(推奨):src/assets/ に置き、import して使います。Astroのビルドプロセスで完全に最適化されます。
リモート画像:
CMSや外部ストレージから取得する場合、astro.config.mjs でドメインを許可する必要があります。
// astro.config.mjs
export default defineConfig({
image: {
domains: ['images.unsplash.com', 'cdn.my-site.com']
}
});public/ フォルダの画像:
最適化されません。そのままコピーされるだけです。ロゴやファビコン以外では使わないようにしましょう。
画像フォーマットの選び方
JPEG, PNG, WebP, AVIF… どれを使えばいいのでしょうか?
| フォーマット | 特徴 | 推奨シーン |
|---|---|---|
| JPEG | 互換性最強だが圧縮率は普通。透明度なし。 | 写真、互換性重視の場合 |
| PNG | 無損圧縮。透明度あり。サイズ大。 | アイコン、ロゴ、図解 |
| WebP | 高圧縮、透明度あり。Google推奨。 | Web画像の標準。90%はこれでOK |
| AVIF | WebPよりさらに20-30%小さい。 | さらなる軽量化を求める場合 |
私の結論:
迷ったら WebP です。互換性と性能のバランスが最高です。Astroの <Image /> はデフォルトでWebPを出力するので、特に設定はいりません。
遅延読み込み(Lazy Loading)戦略
ページの読み込み速度を上げる一番の近道は、「今見えていない画像を読み込まない」ことです。
loading=“lazy” vs “eager”
- lazy (デフォルト): 画面に近づくまで読み込まない。
- eager: ページを開いた瞬間に読み込む。
戦略:
- ファーストビュー(首屏)にある画像(ヒーロー画像、ロゴ)は
eagerにする。- これを
lazyにすると、LCPが悪化し、画像がパッと表示されずチラつく原因になります。
- これを
- それ以外の全ての画像は
lazyにする。
<!-- ヒーロー画像: 即時読み込み -->
<Image src={hero} loading="eager" alt="Hero" />
<!-- 記事内の画像: 遅延読み込み -->
<Image src={content} loading="lazy" alt="Content" />これだけで初期ロードの通信量を半分以下にできます。
CDN統合:Cloudflare Image Resizing
グローバルに展開するならCDNは必須です。CloudflareのImage Resizing機能を使えば、エッジサーバーで画像をリアルタイムにリサイズ・変換して配信できます。
設定手順:
- Cloudflare Dashboardで、ドメインの「Speed」→「Optimization」→「Image Resizing」をONにする(無料枠あり)。
astro.config.mjsを設定。
import { defineConfig } from 'astro/config';
import cloudflare from '@astrojs/cloudflare';
export default defineConfig({
output: 'server', // SSRまたはHybridモードが必要
adapter: cloudflare({
imageService: 'cloudflare' // Cloudflareの画像サービスを使用
}),
});これで、Astroは画像の加工処理を自前のサーバー(Node.js)ではなく、Cloudflareの強力なエッジネットワークにオフロードします。サーバー負荷が下がり、配信速度が上がります。
トラブルシューティング
- 画像が表示されない: パスを確認してください。
./ではなく../が必要な場合があります。リモート画像ならドメイン許可をチェック。 - ビルドエラー
Could not load "sharp": 画像処理ライブラリsharpが入っていないか、環境に合っていません。npm install sharpを試すか、CI環境のNodeバージョンを確認してください。 - 画像がぼやける:
qualityを上げてください。また、元の画像サイズが小さすぎないか確認を。
まとめ
画像最適化は、地味ですが効果絶大です。
<img>タグをやめて<Image />コンポーネントを使う。- フォーマットはWebPを標準にする。
- ファーストビュー以外は遅延読み込み(Lazy Loading)。
- 可能ならCDNを使う。
これらを実践するだけで、あなたのAstroサイトは「重くて遅いサイト」から「爆速サイト」へと生まれ変わります。ぜひ、Lighthouse 95点の世界を体験してください!
Astro画像最適化:爆速サイト構築ガイド
画像を最適化してWebサイトのパフォーマンスを劇的に向上させる5つのステップ
⏱️ Estimated time: 1 hr
- 1
Step1: Imageコンポーネントへの移行
既存の<img>タグをAstroの<Image />コンポーネントに置き換える。srcにはimportしたローカル画像を指定。 - 2
Step2: 読み込み戦略の設定
ファーストビューの画像には`loading='eager'`を、それ以外には`loading='lazy'`を設定して初期ロードを軽量化。 - 3
Step3: フォーマットと画質の調整
基本的にWebP形式を使用。画質(quality)は80程度に設定。必要に応じて`<Picture />`でAVIFとフォールを併用。 - 4
Step4: レスポンシブ対応
`widths`と`sizes`プロパティを使って、スマホ・タブレット・PCそれぞれに最適なサイズの画像を配信する。 - 5
Step5: CDNの活用(オプション)
CloudflareなどのCDNを利用し、エッジサーバーでの画像処理とキャッシングを有効化する。
FAQ
なぜ<img>タグではダメなのですか?
WebPとAVIF、どっちがいい?
publicフォルダの画像は最適化されない?
4 min read · 公開日: 2025年12月3日 · 更新日: 2026年1月22日
関連記事
Next.js ファイルアップロード完全ガイド:S3/Qiniu Cloud 署名付き URL 直接アップロード実践

Next.js ファイルアップロード完全ガイド:S3/Qiniu Cloud 署名付き URL 直接アップロード実践
Next.js Eコマース実践:カートと Stripe 決済の完全実装ガイド

Next.js Eコマース実践:カートと Stripe 決済の完全実装ガイド
Next.js ユニットテスト実践:Jest + React Testing Library 完全設定ガイド


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