Skip to content

4.1 React 19 概観 ​

React 19 は 2024 年 12 月 5 日 に公式リリースされました(https://react.dev/blog/2024/12/05/react-19)。長い RC 期間を経て安定版になった背景には、Server Components を含む大きなアーキテクチャ変更があります。この章では、追加された主要 API を一覧で把握して、次章以降の「どこで深掘りするか」を案内します。最初は固有名詞の多さに圧倒されるかもしれませんが、ここでは地図を広げるだけのつもりで読んでください。

追加された主要機能の一覧 ​

公式ブログで発表された機能を、分類して並べてみます。API 名は公式表記のまま書き写しています。

コンポーネントの新しい書き口 ​

機能概要掘り下げ
Actions(関数を action に渡すフォーム)<form action={fn}> で async 関数を渡すと、pending / エラー / reset を React が面倒を見てくれる4.2
useActionState(action, initialState)Actions を楽に扱うためのフック。[state, dispatch, isPending] を返す4.2
useFormStatus()<form> の中に置いた子コンポーネントから、親フォームの送信状況(pending / data / method / action)を読む4.2
useOptimistic(value, reducer?)楽観的 UI のためのフック。送信中は暫定値を表示し、失敗したら自動で巻き戻る4.2
use(resource)Promise または Context から値を取り出す API。条件分岐やループの中でも呼べる(他のフックと違う点)4.2 / 4.3

サーバー統合 ​

機能概要掘り下げ
Server Componentsサーバー側(ビルド時 or リクエスト時)でレンダーされる、新しい種類のコンポーネントPart 5
Server Functions("use server")Client Component から、サーバーで実行される関数を呼び出す仕組みPart 5

DOM 関連の改善 ​

機能概要掘り下げ
ref as a prop関数コンポーネントで ref を普通の prop として受け取れる(forwardRef が不要)4.5
ref コールバックの cleanupref={(node) => { ...; return () => {...}; }} のように後始末関数を返せる4.5
Document Metadata<title> <meta> <link> をコンポーネントの中に書くと、React が自動で <head> に持ち上げる本章のみ
Stylesheet の precedence<link rel="stylesheet" href="..." precedence="high" /> で読み込み順を管理本章のみ
Async Script のサポート<script async> をどこに書いても React が重複を排除本章のみ
Resource Preloading APIreact-dom から prefetchDNS / preconnect / preload / preinit が提供される本章のみ

Context と小さな改善 ​

機能概要掘り下げ
<Context> を Provider として使える<MyContext.Provider> と書かず、<MyContext value={...}> で済む4.4
useDeferredValue(value, initialValue)第 2 引数で初回レンダー時の値を指定できる4.6

エラー報告の改善 ​

createRoot / hydrateRoot に onCaughtError / onUncaughtError / onRecoverableError のオプションが追加され、重複したコンソールエラーが解消されました(公式ブログ「Better Error Reporting」節)。

非推奨・削除された機能 ​

React 19 アップグレードガイド(https://react.dev/blog/2024/04/25/react-19-upgrade-guide)に整理されています。学習時にハマりやすいものを抜粋しておきます。

  • forwardRef: 将来的に非推奨。関数コンポーネントで ref を prop として直接受け取るスタイルへ移行します。
  • useFormState → useActionState にリネーム(react パッケージからインポート)。用途が form に限らないため名前が調整されました。
  • <Context.Provider>: 将来的に非推奨。<Context value={...}> を使います。
  • propTypes / defaultProps: 関数コンポーネントから削除されました。型チェックは TypeScript、既定値は分割代入のデフォルト値で代替します。
  • Legacy Context(contextTypes / getChildContext): 削除。createContext を使います。
  • String Ref(ref="input"): 削除。コールバック ref か useRef を使います。
  • ReactDOM.render / ReactDOM.hydrate: 削除。createRoot / hydrateRoot を使います(React 18 から推奨だったものが必須になりました)。
  • findDOMNode: 削除。ref を使います。

TypeScript 側の変更でハマりやすいのが、useRef(initialValue) の引数が必須 になった点です。useRef() のように呼ぶとコンパイルエラーになります。

ts
// 引数省略では通らなくなった
const ref = useRef();

// 引数必須の型定義
const ref = useRef<HTMLInputElement>(null);

公式ガイドでは npx codemod@latest react/19/migration-recipe と npx types-react-codemod@latest preset-19 ./path-to-app の 2 つを実行すると、大半が自動移行できると説明されています。

React Compiler ​

詳しくは 4.6 で扱うので、ここでは位置づけだけ紹介します。React Compiler は Babel プラグイン(babel-plugin-react-compiler)として提供され、コンポーネントを自動でメモ化 してくれます。useMemo / useCallback / memo を手書きで散らす運用から抜け出すのが狙いです。React 17 / 18 / 19 で動作しますが、React 19 との組み合わせが最も素直です。

なぜ React 19 で Actions / use が入ったか ​

表の中で一番理解に時間がかかるのは Actions と use です。一言でまとめると、「async な UI を書くための標準ツールが揃った」 のが React 19 だと捉えてもらえるとよさそうです。フォームを送信したら「pending を表示」「エラーを表示」「成功したらリセット」「楽観的に UI を更新」—— どのアプリでも書くことになる定型処理を、React 自体が引き受けてくれるようになりました。これによって、状態管理ライブラリやフォームライブラリに頼らず、最小限のコード量で async UI を組めます。

図 4.1.1 React 19 で async UI を組む道具の関係 ​

この図が、4.2 と 4.3 を読み終えたときに頭の中で自然に描けるようになっていれば十分です。急がなくて大丈夫です。

アップグレード観点の注意(概要) ​

受託案件では、既存の React 17 / 18 プロジェクトをアップグレードする場面が多いはずです。深入りは公式ガイドに任せますが、最低限押さえておきたい順番は次の通りです。

  1. まず React 18 の最新(18.3 系)に揃える。ここで非推奨 API の警告がコンソールに出始めます。
  2. 警告を全部つぶす(Legacy Context / String Ref / propTypes / defaultProps など)。
  3. codemod でコード自動修正をかける。
  4. TypeScript の型パッケージ(@types/react)を更新し、useRef の引数必須化など型エラーを修正する。
  5. react / react-dom を 19 にバンプする。

図 4.1.2 アップグレードの段階 ​

1. 18 最新18.3 系に揃える
<rect x="155" y="52" width="125" height="56" rx="8" fill="none" stroke="currentColor" opacity="0.7" /> <text x="217" y="74" font-weight="bold">2. 警告つぶし</text> <text x="217" y="94" font-size="11" opacity="0.75">コンソール警告 0</text> <rect x="300" y="52" width="125" height="56" rx="8" fill="none" stroke="currentColor" opacity="0.7" /> <text x="362" y="74" font-weight="bold">3. codemod</text> <text x="362" y="94" font-size="11" opacity="0.75">自動修正</text> <rect x="445" y="52" width="125" height="56" rx="8" fill="none" stroke="currentColor" opacity="0.7" /> <text x="507" y="74" font-weight="bold">4. 型更新</text> <text x="507" y="94" font-size="11" opacity="0.75">@types/react</text> <rect x="590" y="52" width="125" height="56" rx="8" fill="none" stroke="currentColor" opacity="0.7" /> <text x="652" y="74" font-weight="bold">5. 19 バンプ</text> <text x="652" y="94" font-size="11" opacity="0.75">react / react-dom</text> 
いきなり 19 に上げず、18 最新化 → 警告つぶしを挟むのが安全

参照ソース ​