React19の正式版が公開されたので、公式ブログの概要+気になって調べてみたことをまとめてみた

## この記事の方向性

2024-04-25にReact 19 Betaが公開されました。
※1 06/01追記 さらに2024-05-16にRCが公開されました
※2 12/09追記 さらに2024-12-05に正式版が公開されました

この記事ではReact公式ブログの概要をまとめ、さらに気になって情報収集した内容をまとめてみます。

この記事の前半はサクッと理解することを重視します。
後半は所感や補足情報を記載します。

記事内では一次情報や丁寧な解説記事へのリンクを多く張るようにしました。この記事は概要理解として利用し、詳しく知りたいと思った内容はリンク先を参照するようにしてもらえたらと思います。

### UPDATE 06/01 BetaからRCに表記を変更

記事を公開した当時は"Beta"でしたが、今は全て"RC"に切り替わりました。
最新の公式ブログの表記と一致するように一部修正しました。

### UPDATE 12/09 正式版リリースに伴い、文章や表記を一部変更

Betaから7か月半の時を経て、ついに12/05にReact 19 正式版がリリースされました！
参照している公式ブログのタイトルが「React 19 RC」から「React v19」に変更され、さらに追記もあり、本記事もそれに合わせて修正しています。

## 公式情報

今回メインで参照したのは以下です。

- [React Blog](https://ja.react.dev/blog) (React公式ブログの日本語版)
    - [React v19](https://ja.react.dev/blog/2024/04/25/react-19)
    - [React 19 Upgrade Guide](https://ja.react.dev/blog/2024/04/25/react-19-upgrade-guide)
    - ※ ~~記事投稿時点では日本語翻訳が終わっておらず、英語版のみです。~~ 
        - (追記) 05/14頃に日本語翻訳版が公開されました

## まずReact 19の概要を3行で

- バージョン18から19にアップグレードする作業は多くのプロダクトであまり問題はなく進められそう
- Actionsの追加とサーバコンポーネントの正式版化が大きめな変更点
- 他にも便利な機能追加や改善が多数

## 新機能を一覧でチでェック

[React v19](https://ja.react.dev/blog/2024/04/25/react-19) (公式ブログ) を箇条書きで要約します。
リンク先は全てブログのページ内リンクです。

- 新しい概念"Actions"で使用するhooksが追加された
    - `useActionState` ([link](https://ja.react.dev/blog/2024/04/25/react-19#new-hook-useactionstate))
    - `useFormStatus` ([link](https://ja.react.dev/blog/2024/04/25/react-19#new-hook-useformstatus))
    - `useOptimistic` ([link](https://ja.react.dev/blog/2024/04/25/react-19#new-hook-optimistic-updates))
        - 上記に関連して`<form>`や`<input>`で使用する`action`という属性が追加された ([link](https://ja.react.dev/blog/2024/04/25/react-19#form-actions))
        - Actionsや`<Suspense>`とセットで使用したくなる`use`メソッドが追加された ([link](https://ja.react.dev/blog/2024/04/25/react-19#new-feature-use))
- ストリーミング環境で使用可能な`prerender`/`prerenderToNodeStream`メソッドが追加された ([link](https://react.dev/blog/2024/12/05/react-19#new-react-dom-static-apis) - 執筆時点で英語版のみ)
- Server Componentsに関する機能が追加された ([link](https://ja.react.dev/blog/2024/04/25/react-19#react-server-components))
- refがpropsで扱えるようになり、forwardRefが不要に変わった ([link](https://ja.react.dev/blog/2024/04/25/react-19#ref-as-a-prop))
- エラーのコンソール出力が読みやすくなり、エラー検知の機能も拡充された ([link](https://ja.react.dev/blog/2024/04/25/react-19#error-handling))
    - HydrationErrorのコンソール出力も読みやすくなった ([link](https://ja.react.dev/blog/2024/04/25/react-19#diffs-for-hydration-errors))
- これまでの`<Context.Provider>`が`<Context>`だけで書けるようになった ([link](https://ja.react.dev/blog/2024/04/25/react-19#context-as-a-provider))
- refにcleanupメソッドを渡すことが可能になった ([link](https://ja.react.dev/blog/2024/04/25/react-19#cleanup-functions-for-refs))
- useDeferredValueに初期値の設定が可能になった ([link](https://ja.react.dev/blog/2024/04/25/react-19#use-deferred-value-initial-value))
- headタグ内に記述するタグの制御が可能になった
    - `<title>`, `<link>`, `<meta>` ([link](https://ja.react.dev/blog/2024/04/25/react-19#support-for-metadata-tags))
    - `<link rel="stylesheet">` ([link](https://ja.react.dev/blog/2024/04/25/react-19#support-for-stylesheets))
    - `<script async>` ([link](https://ja.react.dev/blog/2024/04/25/react-19#support-for-async-scripts))
    - `<link rel="preload">`, etc ([link](https://ja.react.dev/blog/2024/04/25/react-19#support-for-preloading-resources))
- Suspenseの改良により、より高速に表示されるようになった ([link](https://react.dev/blog/2024/04/25/react-19-upgrade-guide#improvements-to-suspense) - 執筆時点で英語版のみ)
- React以外との連携
    - サードパーティーのライブラリと競合しにくくなった([link](https://ja.react.dev/blog/2024/04/25/react-19#compatibility-with-third-party-scripts-and-extensions))
    - カスタム要素が使用可能になった ([link](https://ja.react.dev/blog/2024/04/25/react-19#support-for-custom-elements))

※ 出典の流れに沿って列挙するようにしましたが、私の独自観点でグルーピングし、一部順番を入れ替えた部分があります。「サクッと知る」を重視しています。削った部分はないようにしたつもりです。

## 個人的な見解も交えてさらに深掘り

私が気になった部分を書いてみます。
ピックアップ観点は独断と偏見です。

### React 19 へのアップグレードによる影響

React 18.3 から React 19 へのアップグレードは各種取り組みによって問題が起きにくいと公式ブログでアナウンスされており、詳細を確認した私の所感も同じでした。私が普段使用しているライブラリも動かなくなるような影響は受けないと思います。

Reactコミュニティはアップグレードに対して本当に親切なアプローチを設計していると感じています。ドキュメントもコードモッド ([react-codemod](https://github.com/reactjs/react-codemod), [types-react-codemod](https://github.com/eps1lon/types-react-codemod/)) も充実しています。

とはいえ予想外の挙動は考えられますので、アップグレード時の動作確認は入念に実施する必要はもちろんあります。

### Actionsの追加

最初に `useActionState` を見た際は「あー、よくカスタムフックで定義しているのを公式で提供したのね」と思ったのですが、もう少し読み進めてみると`<Suspense>`や`use`メソッドと組み合わせることを念頭とした機能に見えてきました。
`use`メソッドは単体で使い所があるメソッドと感じます。そしてそれを今回追加されたhooksと組み合わせることで、頭を悩ませないといけない通信処理 (特に異常系) について考えることを減らすことができるようにも見えます。さらにはSSR時の恩恵もありそう。
[参考記事 《凄い！》Server ActionsでReact・Nextが目指す方向性についての考察、劇的に変わるform周り-VercelShip](https://zenn.dev/rgbkids/articles/c983df12cfa87d)

現在のコードからの移行は必須ではありませんが、移行していくと見通しがいいコードにできそうと見えています。
[公式ブログ Actions](https://ja.react.dev/blog/2024/04/25/react-19#actions)

### forwardRefの廃止

参考記事: [React の ref, useRef, forwardRefの基本的な知識](https://qiita.com/ryosuketter/items/1ebf2d68ba3317db53a9)
> refは特殊な属性らしく、propsとして渡したり、受け取ったりができません。
> そもそも関数コンポーネントにrefを渡すことはできません。

React 18では上記の問題を抱えていたのですが、今後は考える必要がなくなります。これは嬉しいですね。
[公式ブログ ref as a prop](https://ja.react.dev/blog/2024/04/25/react-19#ref-as-a-prop)

### headタグの制御

特にフォント読み込みを以下のように書けるようになるのが嬉しいです。

```ts
preload('https://.../path/to/font.woff', { as: 'font' })
```

これまでは[React Helmet](https://github.com/nfl/react-helmet)が広く使われてきましたが、これを公式でサポートしてもらえ、さらにSSRで確実に動作してくれる未来が見えるのは嬉しいポイントです。ブログには「React Helmetを置き換えるような機能ではない」と書かれていましたが、私の場合はリッチな機能までは不要な場合が多く、React Helmetを廃止と決めるのに十分強力な機能と見えています。
内容が重複しても自動制御してくれるようなので、気軽に頻繁に使えそうです。

[公式ブログ Support for preloading resources](https://ja.react.dev/blog/2024/04/25/react-19#support-for-preloading-resources)

### 廃止される機能

廃止される機能一覧を見てみましたが、多くはコンソールに警告が親切に表示されるようでした。
React 19 で突然削除される機能はなく、React 18.2時点で警告通りに対応していればいずれも問題ないものばかりに見えます。
[公式ブログ Breaking changes](https://ja.react.dev/blog/2024/04/25/react-19-upgrade-guide#breaking-changes)

### 非推奨となる機能

こちらも前述の廃止される機能と同様の所感です。ちなみに`<Context.Provider>`が`<Context>`に置き換わる件は現時点で"警告あり"となっていない模様です。
[公式ブログ New deprecations](https://ja.react.dev/blog/2024/04/25/react-19-upgrade-guide#new-deprecations)

## Q&A

### Q. つまりReact 19 にアップグレードするためにはどうしたらいいの？

忙しい人向けに要約すると

1. まずはReact `18.3.x` にアップグレードする
    - 記事投稿時点では `18.3.1` が最新
    - もしReact18より前 (16系, 17系など) を使用していたら、React 18系にアップグレード
        - [React 18 アップグレードガイド](https://ja.react.dev/blog/2022/03/08/react-18-upgrade-guide)
2. `18.3.x`で動作確認してコンソールに警告やエラーが出力されていないことを確認する
    - アップグレード前がこれまでの最新である`18.2.2`(2022-06-15リリース) なら何も問題ない可能性が高い
    - 警告があれば順番に記載通りの対応を進めればOK
    - React単体のバージョンアップなら問題ない可能性が高いが、関連ライブラリに影響が出ている可能性があるので油断は禁物
3. Reactを `19.0.0` (リリースされている最新の19系) にアップグレードする

詳細は[React 19 RC Upgrade Guide](https://ja.react.dev/blog/2024/04/25/react-19-upgrade-guide) (公式ブログ) を参照してください。

### Q. React 19 の正式リリースはいつ？

~~公式アナウンスはありません。~~
(12/09 追記) リリースされました！

参考までに過去のリリースはこんな感じでした。

|バージョン|リリース日|
|--|--|
|19.0.0|2024-12-05|
|19.0.0-rc|2024-05-16|
|19.0.0-beta|2024-04-25|
|18.3.0|2024-04-25|
|18.0.0|2022-03-29|
|18.0.0-beta|2021-11-16|
|17.0.0|2020-10-20|
|17.0.0-rc.0|2020-08-11|
|16.0.0|2017-09-26|
|16.0.0-rc.1|2017-09-07|
|16.0.0-beta.1|2017-07-27|

ここからリリース日が推測できるわけではないですし、以前とバージョン体系が違うので参考にならないところもありますが、恐らく正式版のリリースは数か月先となりそうな気はしてきます。

### Q. ブログの日本語訳がないけれど、いつ翻訳されるの？

- この記事の投稿時点でブログは未翻訳です。
- 翻訳プロジェクトのGitHubリポジトリはこちらです
    - https://github.com/reactjs/ja.react.dev
- 翻訳されてる方のZennが凄く興味深かったです
    - https://zenn.dev/smikitky
- 翻訳されてる方々には本当にリスペクトです。有志の作業ですので待ちましょう
    - (追記) 05/14頃に日本語翻訳版が公開されました。

## 終わりに

React 19以外にもReactの他の大きな話題として、近々React Compilerの公開があるようです。
※ React Compilerの参考記事 [React Forget は何を「忘れ」させてくれるのか
](https://zenn.dev/terass_dev/articles/6f49e44d9cfb0d)

React 19で追加される機能には楽しみな機能が多いと感じています。便利な機能が多くありますし、SSRがさらに発展するように見えますし、新バージョンというのは単純にワクワクもします。

React 19に限らず、今後のReactの発展には今後も注視していきたいです。