🌊Next.jsで一行目に書く'use client'とは何なのか2025/07/19に公開2025/07/233件Next.jsReactコンポーネントレンダリングtechDiscussionHoney324ヶ月前に更新失礼します。 Server Component から Client Component に渡せるのは、文字列形式に変換可能な値のみです。 とありますが、これは誤りです。 createdAt={new Date()} // エラー とありますが、この createAt の受け渡しは成功します。Date オブジェクトはシリアライズ可能なので。 プリミティブ 文字列 数値 bigint ブーリアン undefined null シンボル、ただし Symbol.for を通じてグローバルシンボルレジストリに登録されたシンボルのみ シリアライズ可能な値を含んだ Iterable 文字列 配列 Map Set TypedArray と ArrayBuffer Date プレーンなオブジェクト: オブジェクト初期化子で作成され、シリアライズ可能なプロパティを持つもの サーバアクション (server action) としての関数 クライアントまたはサーバコンポーネントの要素(JSX) プロミス 出典: 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 saku4ヶ月前に更新ありがとうございます! 2点とも齟齬無いように調査し直します🙇♂️ Honey324ヶ月前了解です! 返信を追加
Honey324ヶ月前に更新失礼します。 Server Component から Client Component に渡せるのは、文字列形式に変換可能な値のみです。 とありますが、これは誤りです。 createdAt={new Date()} // エラー とありますが、この createAt の受け渡しは成功します。Date オブジェクトはシリアライズ可能なので。 プリミティブ 文字列 数値 bigint ブーリアン undefined null シンボル、ただし Symbol.for を通じてグローバルシンボルレジストリに登録されたシンボルのみ シリアライズ可能な値を含んだ Iterable 文字列 配列 Map Set TypedArray と ArrayBuffer Date プレーンなオブジェクト: オブジェクト初期化子で作成され、シリアライズ可能なプロパティを持つもの サーバアクション (server action) としての関数 クライアントまたはサーバコンポーネントの要素(JSX) プロミス 出典: 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 saku4ヶ月前に更新ありがとうございます! 2点とも齟齬無いように調査し直します🙇♂️ Honey324ヶ月前了解です! 返信を追加
Discussion
失礼します。
とありますが、これは誤りです。
とありますが、この createAt の受け渡しは成功します。Date オブジェクトはシリアライズ可能なので。
もう一点、
useの解説について(
useは、公式ドキュメントではすでにフックではなく「useAPI」と呼ばれていますが、これは脇に置きます)とありますが、これは逆です。
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 段階だったと思います。
ありがとうございます!
2点とも齟齬無いように調査し直します🙇♂️
了解です!