Frontend Architecture

Astro と Islands Architecture

コンテンツ重視の高速Webサイトを実現する、「ゼロJS by default」の新しいアーキテクチャとその効果を図解解説します。

1Astro とは何か

Astro は、ブログやマーケティングサイト、ECサイトなど「コンテンツ重視のWebサイト」を作るためのオールインワンフレームワークです。最大の特徴は、デフォルトでクライアントサイドJavaScriptを出力しないことです。

コンテンツファースト

React や Vue などの UI フレームワークを使いつつ、最終的なページは高速な静的HTMLとして出力されます。不要なJavaScriptを削ぎ落とす設計思想が根幹にあります。

フレームワークに依存しない

React、Preact、Vue、Svelte、Solid、Alpine.js など、複数のUIライブラリを1つのプロジェクトで混在させて使うことができます。

サーバーファーストのMPA

Multi-Page Application(MPA)として動作し、各ページはサーバーサイドでレンダリングされます。SPAとは異なり、ページ遷移ごとにHTMLを読み込みます。

Vite ベース

開発環境は Vite を基盤としており、HMR(ホットモジュールリプレース)が高速で、快適な開発体験が得られます。

2従来のフレームワークが抱える課題

従来の React ベースの SPA や SSR フレームワークでは、ページ上の「どこか1つでもインタラクティブな要素がある」と、ページ全体のJavaScriptを読み込み・実行(Hydration)する必要がありました。

従来のSPA / SSRフレームワークのイメージ
従来のフレームワークではページ全体がJavaScriptで覆われる 1 ページ全体 ヘッダー 本文 画像 スライダー サイド ページ全体が JavaScript で覆われる(Hydration 対象)

たとえページの大部分が「ただのテキストや画像」であっても、コメント欄や画像スライダーなど「一部だけ」インタラクティブな場合、フレームワークはページ全体を Hydration(イベントリスナー再付与などの初期化)の対象として扱います。これが初期表示の遅延や、大量のJavaScriptダウンロードを招く原因となります。

3Islands Architecture の考え方

Astro が提唱した「Islands Architecture(アイランド・アーキテクチャ)」は、ページの大部分を高速な静的HTMLとしレンダリングし、インタラクティブな部分だけを独立した「島(Island)」として分離するパターンです。

Astro Islands Architecture のイメージ
ページの大部分は静的HTMLで、インタラクティブな部分だけが島として浮かぶ 静的HTML(Zero JS by default) ヘッダー(静的) 本文・テキスト・画像(静的) フッター(静的) 🏝️ Island 画像スライダー 🏝️ Island 検索ボックス

ページの大部分はJavaScriptなしの静的HTML。インタラクティブなコンポーネントだけが「島」として独立して動作します。

Partial Hydration

ページ全体ではなく、必要なコンーネントだけに限定的に Hydration を行う「部分Hydration」が実現できます。これにより、送信されるJavaScriptの量を劇的に削減できます。

自動的な分離

開発者は通常通りコンポーネントを記述するだけで、Astroがビルド時に「どこまでが静的で、どこからがインタラクティブか」を自動的に分離します。

4どうやって「島」を作るのか

Astro では、コンポーネントファイルに client:* ディレクティブを付けることで、そのコンポーネントを「島」としてマークします。ディレクティブを付けない場合、そのコンポーネントはサーバーサイドみでレンダリングされ、クライアントにはJavaScriptが送られません

client ディレクティブと Hydration のタイミング
clientディレクティブごとのHydrationタイミングの違い ページ読み込みの時間軸 → client:load ページ読み込み時 client:idle ブラウザアイドル時 client:visible 要素が画面に入った時 client:media メディアクエリ一致時 client:only クライアントのみ
ディレクティブ Hydration タイミング 用途例
client:load ページ読み込み完了直後 即座に動作する必要があるUI(ナビゲーション、重要なボタン)
client:idle ブラウザがアイドル状態になった時 優先度が低いインタラクティブ要素
client:visible 要素が画面内(ビューポート)に入った時 画像カルーセル、下部のコメント欄など
client:media 指定したメディアクエリが一致した時 モバイルのみ表示されるサイドメニューなど
client:only サーバーレンダリングを行わずクライアントのみ ブラウザAPIに強く依存するコンポーネント

5Server Islands(新機能)

Astro 4.5 以降では「Server Islands」が導入されました。これは、ページの大部分を静的HTML・CDNキャッシュに任せつつ、パーソナライズされた領域だけをサーバーサイドで遅延レンダリングする仕組みです。

Server Islands の動作イメージ
静的HTMLが先に表示され、その後サーバーからパーソナライズ部分が差し込まれる ① 最初の表示(静的HTML) ヘダー・本文(即座に表示) パーソナライズ領域(プレースホルダー) フッター(即座に表示) 非同期リクエスト ② サーバーから差し込み完了 ヘッダー・本文 🏝️ Server Island 「こんにちは、〇〇さん」 フッター

Server Islands を使うと、たとえば「ログイン中のユーザー名を表示するヘッダー」など、ユーザーごとに変わる部分だけをサーバーでレンダリングし、ページの残りはエッジキャッシュ(CDN)で高速に配信できます。これにより、パーソナライズとパフォーマンスの両立が容易になります。

6Islands Architecture の効果・メリット

このアーキテクチャを採用することで、Webサイトのパフォーマンス、SEO、開発体験のすてが向上します。

🚀 初期表示の劇的な高速化

不要なJavaScriptを送信しないため、Time to Interactive(TTI)や Largest Contentful Paint(LCP)などのコアWebバイタルが大幅に改善します。コンテンツ重視のサイトでは90%以上のJavaScript削減も見込めます。

🔍 SEO に強い

デフォルトで完全な静的HTMLを出力するため、検索エンジンのクローラーがコンテンツを正確に把握できます。SPAのようなレンダリング待ちが発生しません。

🧩 既存資産の活用

React や Vue で作られた既存コンポーネントをそのまま「島」として移植できます。フレームワーク全体を置き換える必要はありません。

🐢 低い端末でも快適

JavaScriptの実行量が少ないため、スマートフォンや低スペック端末でもスムーズに動作します。アクセシビリティの観点からも有利です。

🛠️ シンプルな思考モデル

「静的か、インタラクティブか」という2値の選択だけで、パフォーマンス最適化の判断ができます。複雑なコード分割設定を自分で行う必要がありません。

⚡ エッジキャッシュとの親和性

Server Islands を組み合わせることで、パーソナライズ部分を除いたページ全体をCDNでキャッシュでき、グローバルな高速化が実現します。

従来アプローチと Astro Islands の比較
従来のフレームワークとAstro IslandsのJavaScript送信量と表示速度の比較 従来の SPA / SSR JavaScript 量大 Hydration 時間 長 TTI 遅め Astro Islands JavaScript 量 小 Hydration 時間 短 TTI 速い

7まとめ

Astro の Islands Architecture は、「Webページの大部分は静コンテンツである」という事実に立ち返り、必要な場所にだけインタラクティブ性を配置することで、圧倒的なパフォーマンスを実現します。

高速でSEOに強く、既存資産も活かせる Astro の Islands Architecture は、現代のWebフロントエンドにおける重要な選択肢の一つです。