Islands Architectureパターン
ほぼ静的なHTMLを配信し、インタラクティブなwidgetsだけをhydrateしてTime-To-Interactiveを最適化します。
「Islands Architectureパターン」はCoddyKit上の無料React Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。
Islands Architectureとは
Islands Architectureでは、ほとんどが静的なHTMLに、小さく独立してハイドレーションされるインタラクティブなセクション(アイランド)を組み合わせます。ページの大部分はJavaScriptを必要とせず、インタラクティブ性が必要なウィジェットだけがReactアイランドになります。
解決する問題
従来のSSRでは、ページの90%が静的コンテンツ(ヘッダー、テキスト、画像)であっても、ページ全体をハイドレーションします。Islandsではインタラクティブな部分だけをハイドレーションするため、ブラウザーに送るJavaScriptを大幅に削減できます。
基本概念
ページを、静的なHTMLの海にインタラクティブ性の島々が浮かんでいるものとして考えてください。各アイランドは独立してハイドレーションされ、必要に応じて異なるフレームワークを使用できます。
IslandsフレームワークとしてのAstro
AstroはIslands Architectureを広めたフレームワークです。コンポーネントはデフォルトでJavaScriptを必要としません。ハイドレーションを有効にするには、client:*ディレクティブを追加します。
---
import Header from './Header.astro'; // static — 0 JS
import SearchBar from './SearchBar.jsx'; // island — hydrated
import Footer from './Footer.astro'; // static — 0 JS
---
<Header />
<SearchBar client:load /> <!-- hydrate immediately -->
<SearchBar client:idle /> <!-- hydrate when browser is idle -->
<SearchBar client:visible /> <!-- hydrate when scrolled into view -->
<Footer />ハイドレーションディレクティブ
Islandsフレームワークでは、ハイドレーションのタイミングを細かく指定できます。client:load(即時)、client:idle(requestIdleCallback)、client:visible(IntersectionObserver)、client:media(CSSメディアクエリ)があります。
Next.jsでIslandsを実装する
Next.jsのApp Routerでは、Server ComponentsとClient Componentsを分けることでIslandsを近似できます。Server Componentsは静的な部分、Client Componentsはアイランドに相当します。
// Most of the page is a Server Component (no JS sent)
export default async function ProductPage() {
const product = await getProduct();
return (
<article>
<h1>{product.name}</h1>
<p>{product.description}</p>
{/* Only the interactive button is a Client Component island */}
<AddToCartButton product={product} />
</article>
);
}React lazyを使った手動のIslands
専用のフレームワークを使わない場合は、ページのロード後にインタラクティブなコンポーネントだけを遅延ロードすることで、Islandsを実現できます。
const HeavyWidget = lazy(() => import('./HeavyWidget'));
function Page() {
const [show, setShow] = useState(false);
const containerRef = useRef(null);
useEffect(() => {
const obs = new IntersectionObserver(([entry]) => {
if (entry.isIntersecting) setShow(true);
});
obs.observe(containerRef.current);
return () => obs.disconnect();
}, []);
return (
<div ref={containerRef}>
{show && <Suspense fallback={null}><HeavyWidget /></Suspense>}
</div>
);
}トレードオフ
メリットは、JavaScriptが最小限で済み、TTIが速く、静的コンテンツを積極的にキャッシュできることです。デメリットは、アイランド間で状態を簡単に共有できないこと(JavaScriptの実行コンテキストが分かれているため)と、標準的なSPAよりアーキテクチャが複雑になることです。
アイランド間で状態を共有する
独立したアイランド間で通信するには、ブラウザー標準の仕組み(カスタムイベント、URL、localStorage)か、小さな共有ストアのシングルトンを使用します。
// Shared nano-store (nanostores library works well with Astro):
import { atom } from 'nanostores';
export const cartCount = atom(0);
// Island A:
cartCount.set(cartCount.get() + 1);
// Island B subscribes:
cartCount.subscribe(count => setDisplay(count));Islands Architectureを使う場面
コンテンツが中心のサイト(ブログ、EC、マーケティングサイト)に最適です。大部分のコンテンツが静的で、インタラクティブ性が必要なコンポーネント(検索、カート、フォーム)が少数の場合に適しています。
IslandsとSSRとSPAの比較
SPA:すべてのJavaScriptを使い、すべてをハイドレーションします。SSR:サーバーでレンダリングし、すべてをハイドレーションします。Islands:サーバーですべてをレンダリングし、インタラクティブなウィジェットだけをハイドレーションします。コンテンツサイトのパフォーマンスではIslandsが優れています。
確認問題
Islands Architectureパターンの主なパフォーマンス上のメリットは何ですか?
まとめ
Islands Architectureでは、HTMLの大部分を静的な状態(JavaScriptなし)に保ち、インタラクティブなウィジェットだけをハイドレーションします。Islands専用のフレームワークにはAstroを使用するか、Next.jsのServer ComponentsとClient Componentsで近似できます。重要度の低いアイランドには、client:visibleとIntersectionObserverを使って遅延ハイドレーションを適用します。
よくある質問
「Islands Architectureパターン」レッスンは無料ですか?
はい。「Islands Architectureパターン」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。
「Islands Architectureパターン」で何を学びますか?
ほぼ静的なHTMLを配信し、インタラクティブなwidgetsだけをhydrateしてTime-To-Interactiveを最適化します。 ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
React Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「Islands Architectureパターン」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このReact Academyレッスンでコードを書いて実行できますか?
はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- React SSRの内部動作
- Hydrationエラー:原因と修正
- 選択的HydrationとHTMLストリーミング
- Islands Architectureパターン