🚀

Astro 5.0のServer Islandsとは?特徴と実践的な活用方法

2025/02/14に公開

はじめに

こんにちは!フロントエンドエンジニアのかこなーるです!
フロントエンド開発の進化とともに、ウェブサイトやアプリケーションのパフォーマンスと効率性に関する課題も増えています。特に、クライアント側のJavaScriptの負荷が増えることで、ページの表示速度が低下し、ユーザーの体験への悪影響や離脱率の増加を及ぼすことが懸念されています。

Astroは、こうした課題に対応するために、静的サイト生成(SSG)をベースとした軽量なフレームワークとして人気を集めてきました。そして、最新のバージョン5.0では、新たにServer Islandsという機能が導入され、さらに高度なサーバーサイドレンダリング(SSR)機能が提供されるようになりました。

本記事では、Server Islandsの特徴とその実践的な活用方法について解説します。

1. Server Islandsとは?

Astro 5.0で導入されたServer Islandsは、サーバーサイドでのみ実行されるコンポーネントを提供する新機能です。従来のIsland Architectureと比べ、より一層クライアント側でのJavaScriptを最小限に抑え、サーバーサイドで動的な処理を実行し、HTMLをレンダリングすることができます。

従来のIsland Architectureとの違い

AstroのIsland Architectureは、静的HTMLの中にクライアント側で動作するインタラクティブなコンポーネント(React, Vue, Svelte など)を埋め込む仕組みでした。一方、Server Islandsは、クライアントにはJavaScriptを最小限に抑えつつサーバー上でレンダリングを行い、その結果を静的なHTMLとして提供します。そのため、クライアント側の負荷が大幅に削減されます。

2. Server Islandsのメリット

クライアント側のJavaScript負荷の軽減

Server Islandsを利用することで、クライアントに送信されるJavaScriptを削減し、ページの読み込み速度を向上させることができます。特に、SSRが必要なコンポーネントで有効です。

サーバーサイドでの動的処理の実現

従来のAstroでは、完全に静的なサイトを構築する場合、動的なデータ取得についてはクライアント側で行う必要がありました。Server Islandsを使えば、サーバー上でデータ取得や処理を行い、最適なHTMLを返すことが可能になります。

SEOやパフォーマンスへの影響

Server Islands によって、サーバーサイドで動的なデータを処理しつつ JavaScript なしで HTML を提供できるため、SSR のメリットを活かしつつクライアントの負荷を抑えたSEO に強いページを実現できます。また、クライアントでのレンダリング時間が短縮されるため、ユーザー体験の向上につながります。

3. Server Islandsの実装方法

基本的なコード例

以下のように、Server Islandsを利用したコンポーネントを作成できます。

---
import { getUserData } from "../lib/api.server"; // .server.js または .server.ts
const user = await getUserData();
---

<h1>Welcome, {user.name}!</h1>

このコードでは、getUserData() がサーバー側で実行され、クライアントには静的なHTMLとしてレンダリングされます。

Server Islandsを利用したコンポーネントの記述方法

Server Islands を利用する際には以下のように .server.ts を用いたサーバー専用のコンポーネントを作成できます。

UserInfo.server.ts

export async function getUserData() {
  return { name: "John Doe", age: 30 };
}

UserInfo.astro

---
import { getUserData } from "./UserInfo.server";
const user = await getUserData();
---

<ServerIsland server:defer>
  <h1>Welcome, {user.name}!</h1>
  <p>Age: {user.age}</p>
  <Fallback slot="fallback">Loading...</Fallback>
</ServerIsland>

server:defer を追加することで、非同期処理が完了するまでコンポーネントを遅延レンダリングし、slot="fallback" を指定したフォールバックコンポーネントを用意することでローディングの表示等への対応が可能です。

ユースケース

  • フォーム処理 - クライアントにJavaScriptを送ることなく、サーバー側でフォーム送信を処理可能
  • 認証情報の取得 - ユーザーのログイン状態をサーバーサイドでチェックし、適切なUIを表示
  • リアルタイムデータの取得 - 外部APIからデータを取得し、静的HTMLとして返す

4. 他のフレームワークとの比較

React Server Componentsとの比較

React の Server Components(RSC)と Server Islands の違いは以下の通りです。

  • 目的の違い: RSC はフルスタックアプリケーション向け、Server Islands は静的サイト向けの軽量なソリューション
  • データの処理: RSC は細かいコンポーネント単位でサーバー処理を実行、Server Islands はページレベルでの最適化に重点を置く(コンポーネント単位でのサーバーレンダリングも可能です)
  • JavaScriptの扱い: Server Islands は JS を最小限に抑えるのに対し、RSC はクライアント側のインタラクティブな処理も含めて設計されている

こう比較してみるとServer IslandsはAstroの当初からの思想通りの「More HTML, Less JavaScript」を実現するための機能といえます。

Remixとの使い分け

  • Remixはサーバーサイドでのデータ処理を重視しつつ、クライアント側でも動的なUIを提供
  • Astroは静的サイト向けに最適化されており、JavaScriptの削減が強み

5. まとめ

Server Islands は、サーバーサイドレンダリングの恩恵を受けながら、クライアント側の JavaScript を極限まで削減できる強力な機能です。動的なコンテンツを扱う際も、従来の SSR とは異なり、軽量で高速なレンダリングが可能になります。

今後、Astro がさらなる進化を遂げる中で、Server Islands は 静的サイトと動的サイトの境界をなくす技術 として注目されるでしょう。ぜひ、実際に試してみてください!

参考資料

chot Inc. tech blog

Discussion