本文へスキップ / Skip to main content
KINTO Tech Blog

約10分で読めます

Frontend

React Compiler を検証してみた

React Compiler を検証してみた cover
再生速度
要約を読む

React Compiler を導入したことで、アプリのパフォーマンスが約 2.7 倍高速化されました。 そこで、有効と無効の状態でレンダリング時間を比較し、実際の改善を検証しました。 その結果、平均レンダリング時間が 32.5ms から 12.0ms まで減り、非常に大きな効果が確認されました。 React Compiler はビルド時に自動でメモ化を適用するツールです。 これにより、useMemo や useCallback を書く必要がなくなり、開発者がメモ化を意識しなくて済みます。 設定は Vite と React 19 を使った環境で、@vitejs/plugin-react の babel オプションに babel-plugin-react-compiler を追加するだけで完了します。 検証は、約 100 個のコンポーネントを持つ専用プロジェクトで行いました。 無効時だと、React Dev Tools で「Memo」ラベルがなく、再レンダリングが子孫まで波及していました。 一方、有効時だと「Memo」ラベルが多数表示され、再レンダリングが最小限に抑えられました。 パフォーマンスベンチマークでは、ボタンを 10 回連続クリックした結果、有効時の方が平均 12.0ms で済み、無効時は 32.5ms でした。 この差は 2.7 倍の高速化に相当し、ユーザー体験の改善が明確です。 ただし、TanStack Table などのライブラリと相性が悪く、意図しない再レンダリングが起きる可能性があります。 その問題に対処するには、"use no memo" を指定して部分的に無効化する必要があります。 また、ビルド時間が 64ms から 556ms に伸び、ファイルサイズも 232KB から 248KB に増えました。 初回読み込みが少し遅くなる可能性はありますが、これは対処可能な範囲です。 結論として、React Compiler を導入すれば、開発体験が向上し、パフォーマンスも大幅に改善されます。 ただし、特定のライブラリを使う場合は注意が必要です。 導入を検討している方は、まずは試してみることをおすすめします。

AI が生成した要約です。正確な内容は本文をご確認ください。

この記事は KINTO テクノロジーズ Advent Calendar 2025 の 25 日目の記事です 🎅🎄

はじめに

こんにちは!
KINTO 開発部 KINTO バックエンド開発 G マスターメンテナンスツール開発チーム、技術広報 G 兼務、Osaka Tech Lab 所属の high-g(@high_g_engineer)です。フロントエンドエンジニアをやっています。

現在開発中のプロジェクトでは、RC 版の頃から React Compiler を導入しており、約 8 ヶ月が経ちました。
導入によって useMemo や useCallback を書かなくても自動でメモ化されるため、メモ化を意識する必要がなくなり、開発体験は向上しました。
しかし、実際にどの程度メモ化が正しく行われているのか、パフォーマンスにどれくらいの影響があるのかは、詳しく検証できていませんでした。
そこで本記事では、React Compiler の有効時の挙動や、有効時と無効時のパフォーマンス比較を検証してみることにしました。

React Compiler とは

https://ja.react.dev/learn/react-compiler/introduction

React Compiler は、ビルド時に自動的にメモ化を行うことで React アプリを最適化するツールです。
そのため、React Compiler を導入すれば、useMemo や useCallback、React.memo などを手動で書く必要がなくなります。

最初の安定版(v1.0)は 2025 年 10 月 7 日にリリースされ、この記事が執筆された時点で約 2 か月半が経過しています。

安定版リリースまでの経緯は以下の通りです。

  • 2023 年 3 月 - 「React Forget」として開発、Meta 社内の限定的な領域で production 利用開始
  • 2023 年 10 月 - React Advanced Conference 2023 で「React Forget」として公開発表
  • 2024 年 2 月 - instagram 全体で production 展開完了、Meta 社内の他サービスへ展開、OSS 化準備と発表
  • 2024 年 5 月 - React Conf 2024 で experimental release を発表
  • 2024 年 10 月 21 日 - Beta release を公開
  • 2025 年 4 月 21 日 - Release Candidate (RC) を公開
  • 2025 年 10 月 7 日 - v1.0 安定版リリース

React Compiler の設定方法

Vite と React 19 を使用した環境での React Compiler の設定方法を紹介します。

1. パッケージのインストール

pnpm add -D babel-plugin-react-compiler

2. vite.config.ts の設定

@vitejs/plugin-react の babel オプションに babel-plugin-react-compiler を追加します。

import react from "@vitejs/plugin-react";
import { defineConfig } from "vite";

// 設定オプション
const ReactCompilerConfig = {
  /* ... */
};

export default defineConfig({
  plugins: [
    react({
      babel: {
        plugins: [["babel-plugin-react-compiler", ReactCompilerConfig]],
      },
    }),
  ],
});

これだけで設定は完了です。後はビルド時に React Compiler が自動的にコードを解析し、必要な箇所にメモ化を適用してくれます。

React Compiler の設定オプションに関しては、本記事では説明を割愛します。
特に設定しなくても動作しますが、詳細を知りたい方は以下を参照してください。

https://ja.react.dev/reference/react-compiler/configuration

ベンチマーク対象の React アプリ

実際の開発プロジェクトで検証を試みましたが、使用しているライブラリに既にメモ化されたコンポーネントが多く含まれていて、純粋な比較が困難だったので、ベンチマーク専用のプロジェクトを作成しました。
ヘッダー、サイドメニュー、メインコンテンツのエリアで構成され、初期表示時の合計コンポーネント数は約 100 個です。

ベンチマーク対象のプロジェクト

最初に、React Compiler が無効の状態で、React Dev Tools でメモ化の状況を確認していきます。Components タブを見ると、メモ化されている場合に表示される「Memo」のラベルが一切ないことがわかります。

React Dev Tools による Components の表示

次に、React Dev Tools の設定で Highlight updates when components render にチェックを入れて、上位にあるボタンコンポーネントをクリックし再レンダリングの様子を確認すると、本来再レンダリングが不要な子孫コンポーネントにも再レンダリングが発生していることが分かります。

コンポーネントが再レンダリングされた際の Highlight 表示

React Compiler のメモ化の挙動

React Compiler を有効にして開発サーバーを立ち上げ、同じアプリがメモ化されているかを確認します。
React Dev Tools の Components タブを確認すると、「Memo」のラベルが数多く表示されていることが分かります。

React Compiler を適用したプロジェクトのメモ化の様子

同様に、上位にあるボタンコンポーネントをクリックし、React Dev Tools で再レンダリングの状態を確認すると、再レンダリングが必要最小限に抑えられていることが分かります。

React Compiler を適用したプロジェクトにあるコンポーネントが再レンダリングされた際の Highlight 表示

React Compiler のパフォーマンスベンチマーク

ここからは、React Compiler によるパフォーマンスの差を React Dev Tools の Profiler を用いて検証していきます。

検証では、下記の赤枠のボタンを約 1 秒間隔で 10 回連続クリックした際の、レンダリング時間の比較を行いました。

Global Count ボタンに赤枠がついたダッシュボード画面

このボタンはメインコンテンツの最上位に配置されているため、クリック時に多くの子孫コンポーネントへ再レンダリングの影響が波及します。

Global Count ボタンに関する説明

React Compiler 無効時(メモ化なし)

React Compiler 無効時の Profiler の結果

計測データ

  • 1回目: 29ms
  • 2回目: 34.5ms
  • 3回目: 36.1ms
  • 4回目: 33.9ms
  • 5回目: 36.3ms
  • 6回目: 17.6ms
  • 7回目: 35.1ms
  • 8回目: 32.1ms
  • 9回目: 33.3ms
  • 10回目: 36.8ms

平均レンダリング時間
32.5ms

Flamegraph を見ると、すべての子孫コンポーネントがレンダリングされていることが分かります。また、MainContents 以外にもレンダリング時間が長いコンポーネント(黄色やオレンジ色で表示)が存在し、本来不要な再レンダリングが発生していることが確認できます。

React Compiler 有効時(メモ化あり)

React Compiler 有効時の Profiler の結果

計測データ

  • 1回目: 11.1ms
  • 2回目: 12.1ms
  • 3回目: 12.2ms
  • 4回目: 12.1ms
  • 5回目: 12.1ms
  • 6回目: 12.1ms
  • 7回目: 12.1ms
  • 8回目: 12.0ms
  • 9回目: 12.0ms
  • 10回目: 12.6ms

平均レンダリング時間
12.0ms

Flamegraph を見ると、グレーの斜線で表示されているコンポーネントが多数確認でき、再レンダリングが必要最小限に抑えられていることが分かります。

パフォーマンス改善の結果

React Compiler 無効時 React Compiler 有効時 改善結果
平均レンダリング時間 32.5ms 12.0ms 約 2.7 倍高速化

React Compiler を有効にしただけで、非常に大きなパフォーマンス改善ができていることが確認できました。
今回はメモ化を全く行っていないプロジェクトとの比較のため、すべてのケースで同様の改善が見込めるわけではありませんが、導入効果は十分に期待できます。

懸念点

ライブラリとの相性

現在開発中のプロジェクトでは TanStack Table を利用しています。TanStack Table は新しい参照を意図的に生成することで再レンダリングをトリガーする設計のため、React Compiler によるメモ化が適用されると、再レンダリングが発生せず意図しない挙動を引き起こす可能性があります。

この問題に対しては、"use no memo" ディレクティブを追加して部分的に React Compiler を無効化することで対応が可能です。

function TableComponent() {
  "use no memo";

  const table = useReactTable({
    data,
    columns,
    getCoreRowModel: getCoreRowModel(),
  });

  return (
    <table>
      {/* TanStack Table の参照変化に依存する処理 */}
    </table>
  );
}

react-hook-form など、同様に参照の変化に依存するライブラリを利用する場合は、要所で "use no memo" の記述が必要になるため、導入時にはご注意ください。

ビルド速度低下、ビルドファイルサイズ上昇

React Compiler を導入すると、再レンダリング時のパフォーマンスは向上しますが、メモ化のためのコードが追加されるため、ビルド速度やファイルサイズに多少影響が出ます。その結果、初回読み込みが少し遅くなる可能性があります。

React Compiler 無効時のビルド結果
  • ビルド時間: 64ms
  • ファイルサイズ: 232KB

React Compiler 無効時のビルド結果

React Compiler 有効時のビルド結果
  • ビルド時間: 556ms
  • ファイルサイズ: 248KB

React Compiler 有効時のビルド結果

まとめ

今回は React Compiler を有効にしたときのメモ化に関する挙動の確認と、パフォーマンスにどれくらい影響があるのかを検証してみました。
結果として、メモ化が正しく動作し、そのおかげでパフォーマンス改善も十分に期待できることが分かりました。

ただし、いくつか注意点もあります。
参照の変化に依存するライブラリを使用する場合は、"use no memo" で部分的に無効化が必要になることがあります。また、メモ化のコードが追加される分、ビルド速度やファイルサイズには多少影響が出ます。

とはいえ、これらは対処可能な範囲ですし、パフォーマンス改善だけでなくメモ化を意識しなくて済むというメリットは非常に大きいです。React Compiler の導入を迷われている方は、ぜひ試してみてください。

最後まで読んでいただきありがとうございました。

参考記事

https://ja.react.dev/learn/react-compiler/introduction
https://ja.react.dev/reference/react-compiler/configuration
https://reactadvanced.com/2023/
https://conf2024.react.dev/
https://react.dev/blog/2023/03/22/react-labs-what-we-have-been-working-on-march-2023
https://react.dev/blog/2024/02/15/react-labs-what-we-have-been-working-on-february-2024
https://react.dev/blog/2025/10/07/react-compiler-1
https://github.com/TanStack/table/issues/5567

Facebook

Follow Us

XConnpassWantedly

KINTOテクノロジーズの最新情報をSNSで発信中!イベント・テックブログ更新情報もお届けします。