🌊

Next.jsで一行目に書く'use client'とは何なのか

に公開
3

Discussion

Honey32Honey32

失礼します。

Server Component から Client Component に渡せるのは、文字列形式に変換可能な値のみです。

とありますが、これは誤りです。

  createdAt={new Date()} // エラー

とありますが、この createAt の受け渡しは成功します。Date オブジェクトはシリアライズ可能なので。

出典: https://ja.react.dev/reference/rsc/use-client#serializable-types


もう一点、use の解説について

use は、公式ドキュメントではすでにフックではなく「use API」と呼ばれていますが、これは脇に置きます)

注意: useフックは Client Components でも利用可能ですが、主な利点は Server Components でのデータ取得の簡素化にあると思われます

とありますが、これは逆です。use は Client Component で使うことを目的としています。

出典はド忘れしたので無いですが、Server Component 内で使うと「ここでレンダリングを中断して、コンポーネント全体のレンダリングを、またあとで再開する」と、レンダリングをかなり遅くする余計な処理が入るので推奨されていません。

下にも示した通り、「Server Component で作成した Promise を Server では await せず Client Component に渡して、Client 側では use で開封できる。」という使い方が想定されています。(上記で挙げたように、Promise は Server から Client にわたすことが可能なのを利用しています)

TanStack Query のようなライブラリがキャッシュを管理することによって、Client Component Promise を作成する使い方でも可能になるはずです。今は TanStack Query の該当機能は experimental 段階だったと思います。

サーバコンポーネントからクライアントコンポーネント に props としてプロミスを渡すことで、サーバからクライアントにデータをストリーミングすることができます。

https://ja.react.dev/reference/react/use#streaming-data-from-server-to-client

プロミスはサーバコンポーネントからクライアントコンポーネントに渡し、use API を使ってクライアントコンポーネントで解決することができます。また、await を使ってサーバコンポーネント側でプロミスを解決し、必要なデータを props としてクライアントコンポーネントに渡すことも可能でしょう。

export default async function App() {
  const messageContent = await fetchMessage();
  return <Message messageContent={messageContent} />
}

しかしサーバコンポーネントで await を使用すると、await 文が終了するまでそのレンダーがブロックされます。サーバコンポーネントからクライアントコンポーネントにプロミスを渡すことで、プロミスがサーバコンポーネントのレンダーをブロックすることを防ぐことができます。
https://ja.react.dev/reference/react/use#streaming-data-from-server-to-client

非同期コンポーネントはクライアントではサポートされていないため、プロミスの待機は use を使用して行います。

https://ja.react.dev/reference/rsc/server-components#async-components-with-server-components

sakusaku

ありがとうございます!
2点とも齟齬無いように調査し直します🙇‍♂️