14.1 概要
React Compilerは、コンポーネントとHooksを解析し、自動メモ化するビルド時コンパイラである。1.0は安定版である。
従来:
const filtered = useMemo(
() => expensiveFilter(items, query),
[items, query]
);
const handleSelect = useCallback(
(id: string) => onSelect(id),
[onSelect]
);
export default memo(ItemList);
Compiler適用後は、純粋性などの規則を満たすコードを自動的に最適化できる。
function ItemList({ items, query, onSelect }: Props) {
const filtered = expensiveFilter(items, query);
return filtered.map(item => (
<button key={item.id} onClick={() => onSelect(item.id)}>
{item.name}
</button>
));
}
14.2 Compilerが前提とする規則
- コンポーネントとHooksは純粋
- propsとstateを直接変更しない
- Hooksのルールを守る
- レンダリング中に副作用を起こさない
- 値のライフタイムを不自然に壊さない
- 参照の安定性に依存する外部仕様を理解する
14.3 導入
代表的なパッケージ:
npm install --save-dev --save-exact babel-plugin-react-compiler@latest
実際の設定方法は、Vite、Next.js、React Nativeなど環境により異なるため、各公式統合ガイドを確認する。
14.4 ESLint診断
Compilerの解析結果やReactの規則違反は、eslint-plugin-react-hooksを通じて検出される。
重要なのは「全ファイルがコンパイルされなければ導入失敗」ではない。問題のあるコンポーネントをCompilerがスキップし、他を最適化できる場合がある。
14.5 段階導入
- 特定ディレクトリだけに適用
"use memo"でopt-in- ランタイムゲーティング
- パフォーマンス監視を伴う展開
既存の手動メモ化は一度に削除せず、動作テストと計測を行う。
14.6 ディレクティブ
function Component() {
"use memo";
// Compilerへ明示的な最適化意図
}
function Component() {
"use no memo";
// 特定コードを最適化対象外にする
}
これらは常用するものではなく、移行・互換性上の制御として扱う。
14.7 手動メモ化が残る場面
- 外部ライブラリが参照同一性を契約にしている
- Effect依存関係の安定化に意味がある
- Compiler対象外コード
- ライブラリの公開API
- 計測で明確な改善が確認できる
- 意味的にキャッシュを保持したい
useMemoは意味上の保証ではなく、パフォーマンス最適化である。コードの正しさをuseMemoだけに依存させない。