React19が間もなく登場します。以下は新機能です

## React Compiler
React Compilerは新しいビルド時のツールで、Reactアプリケーションのパフォーマンスを向上させるために自動的に最適化します。特に再描画時にそのパフォーマンスを高めることができます。

自動的にコードをメモ化する機能があり、useMemo、useCallback、React.memoなどのAPIを通じてメモ化を知っているかもしれません。これらのAPIはReactに伝えて、アプリケーションの一部の入力が変更されていない場合、更新時に再計算する必要がないため、更新の労力を減らすことができます。

したがって、React Compilerは大量の状態更新が必要な複雑なアプリケーションにおいて、パフォーマンスを向上させるのに非常に適しています。

React Compilerはオープンソース化と本番利用に向けて発展しています
- React Compilerは研究プロジェクトではなく、現在はInstagramの本番環境で動作しています
- チームはcompilerを他のMetaプラットフォームに展開し、オープンソースとして公開する予定です
- compilerは状態の変化に基づいて自動的に再描画を最適化し、手動でのメモ化の必要性を排除することを目的としています
- compilerは厳格なReactルールに従い、コード変換の安全性と予測可能性を確保します

## Rect19 RC

この新しいバージョンでは、具体的にどのような変更がありますか?
### 1、アクション

Actionsは、Webページでのデータの処理や操作を簡素化します。たとえば、

ユーザーが名前を変更するためにフォームを送信すると、APIリクエストを開始し、応答を処理します。

React 19RC、待機状態、エラー、フォーム、最適化更新、シーケンシャル要求を自動的に処理するために、変換で非同期関数を使用するサポートを追加しました。したがって、Actionsは、データの変更や状態の更新を処理する必要がある対話型アプリケーションに最適です。

たとえば、待機状態とエラー状態useStateを処理できます。
```javascript
// Before Actions function
function UpdateName({ setName, setError, setIsPending, redirect }) {
  const [name, setNameLocal] = useState(""); 
  const [error, setErrorState] = useState(null);
  const isPending = useState(false); 
  const setIsPendingLocal = useState(false)[1]; 

  const handleSubmit = async () => {
    setIsPendingLocal(true); 
    try {
      const updateError = await updateName(name); 
      if (updateError) {
        setErrorState(updateError); 
        return;
      }
      redirect("/path");
    } finally {
      setIsPendingLocal(false); 
    }
  };

  return (
    <div>
      <input
        value={name}
        onChange={(event) => setNameLocal(event.target.value)} 
      />
      <button
        onClick={handleSubmit}
        disabled={isPending[0]}
      >
        Update
      </button>
      {error && <p>{error}</p>}
    </div>
  );
}
```




React 19では、変換中に非同期関数の使用をサポートしました。これにより、待機状態、エラー、フォーム、楽観的更新を自動的に処理できます。
useTransitionを使用して待機状態を処理することができます。

```javascript

function UpdateName() {
  const [name, setName] = useState("");
  const [error, setError] = useState(null);
  const [isPending, startTransition] = useTransition();
  const handleSubmit = () => {
    startTransition(async () => {
      try {
        const updateError = await updateName(name);
        if (updateError) {
          setError(updateError);
          return; 
        }
        redirect("/path");
      } catch (e) {
        console.error(e);
      }
    });
  };
```


非同期変換はすぐに isPending ステータスを true に設定し、非同期リクエストを発信します。そして、変換が完了した後に isPending は false に切り替わります。これにより、データが変化する際に現在の UI を応答性とインタラクティブ性を保ちます。

それ以外にも、Actions は以下の能力を提供します：
- Pending state：操作は待機状態を提供し、リクエストが開始された時点から開始され、最終状態の更新が提出された際に自動的にリセットされます
- Optimistic updates：操作は新しい useOptimistic フックをサポートしており、リクエストを提出する際にユーザーに即時のフィードバックを表示することができます
- Error handling：操作はエラーハンドリングを提供し、リクエストが失敗した際にエラー境界を表示し、楽観的更新を自動的に元の値に戻すことができます
- Forms：<form> 要素は今、関数を action と formAction プロップに渡すことをサポートしています。関数を action プロップに渡すと、デフォルトで Actions を使用し、送信後に自動的にフォームをリセットします
- 
### 2、Server Components

React 19 RCは、「サーバーコンポーネント」という概念を導入しました。これにより、サーバー上でコンポーネントをレンダリングすることができます。これにより、ページの読み込み速度が向上し、SEOも改善されます。そのため、Server Componentsは迅速な応答と効率的なSEOを必要とするWebアプリケーションに非常に適しています。

サーバーコンポーネントは、バンドル前にクライエントサイドアプリケーションまたはSSRサーバーとは別の環境で事前に提示される新しいタイプのコンポーネントです。

この個別の環境は、React Server Componentsの「サーバー」です。サーバーコンポーネントは、ビルド時にCIサーバー上で一度だけ実行することも、Webサーバーを使用してリクエストごとに実行することもできます。

### 3、アセットローディング

通常、ビューは最初にブラウザでレンダリングされ、次にスタイルシート、フォント、画像がレンダリングされます。これにより、スタイルのないビューからスタイルのあるビューへの点滅が発生する可能性があります。これは、スタイルのないコンテンツの点滅（FOUC）と呼ばれます。

React 19以前:FOUCの問題を緩和するために、開発者は通常、カスタムコードを追加してリソースの準備が整ったことを検出し、すべてのコンテンツが読み込まれた後にのみビューが表示されるようにします。ただし、この方法は複雑で面倒な場合があります。

これで、アセットローディングでリソースをバックグラウンドで読み込むことができるようになり、ページの遷移が改善されます。これにより、ユーザーが現在のページを閲覧しているときに、バックグラウンドでリソースを読み込むことができます。この最適化により、Reactアプリケーションのパフォーマンスが向上するだけでなく、ユーザーがより快適に閲覧できるようになります。

### 4、Document Metadata

Document Metadataは、開発者がより少ないコードでより多くの作業を実行できるようにする今後の改善です。

たとえば、HTMLでは、ドキュメントのメタデータラベル(<title>、<link>、および)<meta>は、<head>ドキュメントのセクションに配置するために予約されています。Reactでは、アプリケーションに適したメタデータを決定するコンポーネントが、レンダリングする場所から非常に離れているか、<head>またはReact<head>がまったくレンダリングしない場合があります。

これまでは、これらの要素をエフェクトに手動で挿入するか、react-helmetなどのライブラリを介して挿入する必要があり、サーバーがReactアプリケーションをレンダリングする際には注意が必要でした。

React 19では、コンポーネント内のドキュメントメタデータラベルのネイティブレンダリングのサポートが追加されました。

```javascript
function BlogPost({ post }) {
  return (
    <article>
      <h1>{post.title}</h1>
      <h2>{post.title}</h2>
      <meta name="author" content="x" />
      <link rel="author" href="https://twitter.com/x/" />
      <meta name="keywords" content={post.keywords} />
      <p>
        something...
      </p>
    </article>
  );
```


Reactがこのコンポーネントをレンダリングすると、<title> <link>と<meta>タグが表示され、自動的に<head>ドキュメントセクションに昇格します。これらのメタデータラベルをネイティブにサポートすることで、クライアント専用アプリケーション、ストリーミングSSR、サーバーコンポーネントで動作することを保証できます。

5.カスタム要素をサポートします

React 19は、カスタム要素の完全なサポートを追加し、Custom Elements Everywhereのすべてのテストに合格しました。

過去のバージョンでは、Reactが認識できないpropsをプロパティ（プロパティ）ではなくプロパティ（属性）として扱うため、Reactでカスタム要素を使用することは困難でした。React 19では、次のポリシーにより、クライエントサイドおよびSSR中に機能するプロパティのサポートを追加しました。

- サーバーサイドレンダリング:カスタム要素に渡されるpropsの型がプリミティブ値(例えばstring、numberまたは)の場合、それらはtrueプロパティとしてレンダリングされます。プリミティブ型以外のprops(例えばobject、symbol、functionまたは)の値falseは省略されます
- クライエントサイドレンダリング:カスタム要素インスタンスのプロパティに一致するpropsはプロパティとして割り当てられ、それ以外の場合はプロパティとして割り当てられます

### Reactの開発方向

実際、最近の2つの主要なバージョンの機能から、現在のReactの改善の方向性は、主にReactのパフォーマンスを向上させ、ユーザーエクスペリエンスを向上させ、開発者の作業を簡素化することであることがわかります。

React Compilerはアプリケーションのパフォーマンスを向上させ、Asset Loadingはユーザーエクスペリエンスを向上させ、Actionsは開発者の作業を簡素化します。さらに、Server ComponentsとCustom Elementsのサポートにより、Reactはさまざまな複雑なニーズに対応するための柔軟性と堅牢性を高めることができます。