BLOGS
- TamaTの開発事情 -
React 19のReact Compilerを触ってみた
2024.11.21
こんにちは!TamaT(タマト)代表の田中です。
Next.jsでの開発をしていて、よく「この最適化、本当に必要なのかな...」と悩むことがあります。私自身、2014年からReactを使ってきましたが、パフォーマンス最適化の判断には常に頭を悩ませてきました。
今回は、React 19で導入される「React Compiler」について、実際の開発現場での経験を踏まえながら解説していきたいと思います。
現場エンジニアの「あるある」悩み
実際の開発で、こんな場面に遭遇したことはありませんか?
私の場合、特にECサイトの開発で商品一覧を実装する際に、以下のような判断で何度も立ち止まりました:
- 「このuseCallbackって本当に必要?でも外すと再レンダリングが...」
- 「商品データのソートをuseMemoで包むべき?でもデータ量少ないしなぁ...」
- 「memo化しすぎて逆にパフォーマンス落ちてない?」
特に悩ましかったのが、チームメンバーとのコードレビューです。人によって最適化への考え方が違うため、「これはmemo化すべき」「いやいや、ここは不要では」といった議論が度々発生していました。
React Compilerが解決してくれること
実際のプロジェクトでよく書くコードで比較してみましょう。
Before:従来の実装パターン
import { useMemo, useCallback } from 'react'
function ProductList({ products }) {
// 高いものが上に来るようにソートしよう...でもuseMemo必要かな?
const sortedProducts = useMemo(() => {
return products.sort((a, b) => b.price - a.price)
}, [products])
// 子コンポーネントに渡す関数だからuseCallback必要?
const handleClick = useCallback((id) => {
console.log(id)
}, [])
return (
<div>
{sortedProducts.map(product => (
<ProductItem
key={product.id}
product={product}
onClick={handleClick}
/>
))}
</div>
)
}
React Compilerを使うと、このように書けます:
After:React Compiler導入後
function ProductList({ products }) {
// シンプルに書けて、最適化は任せられる!
const sortedProducts = products.sort((a, b) => b.price - a.price)
const handleClick = (id) => {
console.log(id)
}
return (
<div>
{sortedProducts.map(product => (
<ProductItem
key={product.id}
product={product}
onClick={handleClick}
/>
))}
</div>
)
}
最近自作のデモで試してみましたが、一応パフォーマンスも維持できています。個人的には、だいぶコードの見通しが良くなったかなと感じています。
Next.jsでの実装方法
基本的な設定はシンプルです:
// next.config.js
module.exports = {
experimental: {
reactCompiler: true
}
}
この設定だけで最適化の恩恵を受けられます。いい感じ。
実践での注意点
ただし、すべてをCompilerに任せきりにするのは危険です。以下のようなケースでは、まだ手動での最適化が必要かもしれません:
- 非常に重い計算を含むコンポーネント
- データの更新頻度が極端に高いケース
- アニメーションを多用する画面
今回は絞り込み機能などで、フィルター条件が複雑に組み合わさるケースがありました。この部分は慎重に手動最適化を残しています。
さいごに
React Compilerは確実に開発者体験を改善してくれます。特に、チーム開発でのコードの一貫性が保ちやすくなると期待しています。
ただし、やはり基本的なReactの理解は必要です。最適化がコンパイラに任せられるからこそ、その仕組みを理解しておくことが重要だと感じています。
React/Next.jsでお困りの方は、ぜひご相談ください。豊富なReact開発経験を活かして、最適なソリューションを一緒に考えていけたらと思います。