2 ポイント 投稿者 GN⁺ 2025-05-10 | 3件のコメント | WhatsAppで共有
  • AstroReact Server Components(RSC) は、サーバーコードとクライアントコードの分離を似た形で実現している
  • Astroでは Astro ComponentClient Island がそれぞれ機能的な役割を分担する
  • RSCは同じ概念を Server ComponentClient Component に分け、'use client' ディレクティブで境界を設定する
  • RSCはAstroと比べて、インタラクティブなUI構成とコード共有の柔軟性が高い
  • どちらのモデルも、データがサーバーからクライアントへ一方向に流れる構造を持つ

紹介と基本概念

  • Astroは Astro ComponentClient Island という2つの主要なコンポーネントタイプを提供する
  • Astro Componentは .astro 拡張子を持ち、サーバーまたはビルド時にのみ実行され、ファイルシステムへのアクセス、DB参照、内部サービスの呼び出しなど、クライアントではできない処理が可能である
  • Client IslandはReactやVueなどのためのコンポーネントで、ブラウザ上で動作し、ユーザーインタラクションを担当する部分である
  • Astro Componentの内部でClient Islandをレンダリングできるが、Client IslandからAstro Componentを呼び出すことはできない
  • この構造は、データが常にサーバーからクライアントへだけ流れる 一方向性 を保証する

コード例と役割分担

  • 例のコードでは PostPreview.astro がサーバーで ファイルを読み込み、タイトルを取得した後、そのデータをClient Islandに渡す
  • LikeButtonはReactで書かれており、ブラウザの読み込み後に 状態変化 とユーザーのクリックイベントを担当する
  • Astro ComponentとClient Islandは 異なる世界 で動作し、データの受け渡しもAstro Componentから下方向にのみ行われる

React Server Components(RSC)との比較

  • RSCでもAstroと同様に サーバーコンポーネント(Server Component) と クライアントコンポーネント(Client Component) に分かれる
  • React Server ComponentではJavaScript関数としてサーバーコンポーネントを宣言し、'use client' ディレクティブによって、どこからクライアントコードが始まるのかを明確に指定する
  • RSCでは 同じコンポーネントファイルがサーバーとクライアントの両方の役割を担える。Astroのようにファイル拡張子や別個の分離なしに、必要に応じて 'use client' 宣言だけで境界を移動できる
  • コンポーネントがクライアント専用機能(例: useState)またはサーバー専用機能(DBアクセスなど)を使う場合、誤った環境で使用すると ビルドエラー が発生し、明確なフィードバックが得られる

AstroとRSCの視覚的・構造的な違い

  • Astroは .astro ファイルとJS/TSファイルの区別によって 明確な境界 を持つ
  • RSCは基本的にすべてがReactなので、コード共有性と柔軟性 がはるかに高い
  • たとえば、状態やサーバー機能を使わない 中立的なコンポーネント(Markdownパーサーなど)は、どちら側でも使える
  • RSCではimportパスに応じて、そのコンポーネントがどの世界で動作するかが自動的に決まる

RSCモデルの利点と限界

  • RSCの利点は コード再利用と役割移動の柔軟性 にある
    • どのコンポーネントでも、必要に応じて 'use client' 宣言だけで境界を簡単に移動できる
    • AstroではUIの静的/動的な性質が変わるとコード変換が煩雑になりがちだが、RSCはこれを簡単に解決できる
  • RSCの欠点は 学習難度 が高い点である
    • 開発者は今「どの世界にいるのか」を常に意識することになるが、ミスをするとビルドエラーによって素早いフィードバックが得られる
  • AstroではUIの動的な部分が増えるほど構造が複雑になるが、RSCでは Reactツリー全体が統合 されているため、状態やコンテキスト(Context)の受け渡し なども自然に行える

HTML中心のAstroとReactツリー中心のRSC

  • Astroの成果物は HTML であり、ページ移動のたびに全体が再読み込みされ、完全なSPA体験を提供するわけではない
  • RSCの成果物は Reactツリー(最初はHTML、ナビゲーション時にはJSONなどで送信)である
    • そのため SPAとMPAの長所を組み合わせる ことができる
  • サーバーからUIの一部だけを直接更新して反映する 部分的な再読み込み が可能で、動的データの受信やクライアント状態の維持もしやすい

高度なReact機能のサポート

  • サーバーとクライアントが混在する ツリー構造により、Reactの先進的な機能(例: <Suspense>、View Transitionsなど)も自然に統合してサポートされる
  • クライアント側で宣言的に扱うローディング状態、フォント/画像/JavaScript/スタイルの遅延なども管理できる
  • Reactのあらゆる機能が、サーバーとクライアントの境界を越えて エンドツーエンド で動作する

RSCとAstroの位置づけ

  • Astroは 完全なフレームワーク であり、RSCは フレームワークのビルディングブロック または 標準 に近い
  • 公式なRSC実装としては Next.js App RouterParcel RSC がある

結論とおすすめ

  • RSCの開発者体験(DX)はまだ粗削りだが、学ぶ価値はある
  • Astroをまだ体験していないならおすすめであり、AstroはRSCが難しい開発者にとって、よりなだらかな入口になるだろう
  • クライアントサイドReactだけを使ってきた開発者にとっても、Astroは予想外の問題解決体験をもたらす可能性がある

3件のコメント

 
hakoiko 2025-05-13

現在、古い React アプリを Astro にリファクタリングしています。
本文では「統合されたコンテキスト」を強調しています。「統合されたコンテキスト」は素早いサービス構築に役立ちますが、いつかは技術的負債になり得ることを理解しておく必要があります。
サービスの長期的な保守という観点では、「統合された強結合」よりも「独立したモジュール同士の疎結合」のほうが望ましいです。
そして Astro は、そのための最も柔軟なフレームワークです。

 
GN⁺ 2025-05-10
Hacker Newsのコメント
  • 自分がAstroではなくRSCを使う唯一の理由は、island同士でcontextを共有できることくらいで、それ以外に特別な利点はない。それと細かい点だけど、この記事ではAstroの「code fence」という概念にもっと明確に言及して説明してほしかった。このアイデアはReactのuse clientよりも、サーバーとクライアントの境界をはるかに明確にしてくれる
    • 自分はcode fenceが本当に境界を表しているとは思わない。fenceの下のコードも必ずサーバー上で実行されるし、そうでなければそこでAstroコンポーネントを参照できないはずだ。自分の理解では、fenceは「binding vs template」の区別を意味するだけで、「server vs client」を示しているわけではない
    • island同士でcontextを共有するのはAstroでは本当に簡単。このリンクを見ればよい https://docs.astro.build/en/recipes/sharing-state-islands/
  • Astroはコンテンツ中心のWebサイト向けWebフレームワーク https://github.com/withastro/astro
    • Gatsbyを使っていた人たちは、最終的にGraphQLでつながった不安定な画像処理パイプラインから解放された日を一生忘れないだろう。(そのとき彼らはコンピューターの前にいた。)証拠はないが、Astroのnet promoter scoreには9が5つ並ぶというのは科学的事実だ
    • Astroはものすごく良い。数年前からSSGの第一選択になっていて、今ではアプリ制作にもAstroを真剣に検討している。Astroをアプリで使ったことがある人はいる? 自分はAstroでislandベースのHTMLだけをレンダリングして、バックエンドはnon-JSにするつもりだ
    • 「コンテンツ中心のWebサイト向けWebフレームワーク」ってことは、コンテンツではなく乱数生成器で動くサイトもあるの?
  • Astroが本当に本当に大好き。最初のリリース時から使っている。個人サイトも最初の製品のランディングページもどちらもAstroで作った。ビルドが速く、JSなしでもデプロイできて、どんなフロントエンドライブラリでも使える。だから自分にとって最高のフレームワークだ