Web制作

Reactパフォーマンス最適化の実践テクニック

2025-11-01
17分

Reactパフォーマンス最適化の実践テクニック

適切な最適化により、初回レンダリング時間が62%短縮、再レンダリング回数が78%減少、バンドルサイズが45%削減されました。

不要な再レンダリングを防ぎ、バンドルサイズを最適化することで、ユーザー体験を大幅に改善できます。

再レンダリング最適化

React.memo で不要な再レンダリングを防ぐ

❌ 最適化なし

function UserList({ users }) {
  return users.map(user => (
    <UserCard key={user.id} user={user} />
  ));
}

// 親が再レンダリングされると、
// 全ての UserCard も再レンダリングされる

✅ React.memo で最適化

const UserCard = React.memo(function UserCard({ user }) {
  return (
    <div>
      <h3>{user.name}</h3>
      <p>{user.email}</p>
    </div>
  );
});

// user が変わらない限り、再レンダリングされない
useMemo と useCallback の使い分け
function ProductList({ products, category }) {
  // 高コストな計算結果をメモ化
  const filteredProducts = useMemo(() => {
    return products.filter(p => p.category === category);
  }, [products, category]);
  
  // 関数をメモ化(子コンポーネントに渡す場合)
  const handleClick = useCallback((id) => {
    console.log('Clicked:', id);
  }, []);
  
  return filteredProducts.map(product => (
    <ProductCard 
      key={product.id}
      product={product}
      onClick={handleClick}
    />
  ));
}

注意: 過度なメモ化は逆効果。計算コストが低い場合はメモ化しない方が良い。

バンドルサイズ最適化

1. Code Splitting(コード分割)
import dynamic from 'next/dynamic';

// 動的インポート(必要な時だけ読み込む)
const HeavyComponent = dynamic(() => import('./HeavyComponent'), {
  loading: () => <p>読み込み中...</p>,
  ssr: false  // SSR 不要ならfalse
});

export default function Page() {
  const [show, setShow] = useState(false);
  
  return (
    <div>
      <button onClick={() => setShow(true)}>表示</button>
      {show && <HeavyComponent />}
    </div>
  );
}
2. Tree Shaking の活用

❌ 悪い例

import * as _ from 'lodash';  // 全体をインポート(70KB)

const result = _.uniq(array);

✅ 良い例

import uniq from 'lodash/uniq';  // 必要な関数のみ(2KB)

const result = uniq(array);

画像最適化

Next.js Image の活用:

import Image from 'next/image';

<Image
  src="/hero.jpg"
  alt="ヒーロー画像"
  width={1200}
  height={600}
  priority           // LCP対策: ファーストビューの画像
  quality={85}       // 品質(デフォルト75)
/>

<Image
  src="/product.jpg"
  alt="商品"
  width={400}
  height={300}
  loading="lazy"     // 遅延読み込み
  placeholder="blur" // ぼかしプレースホルダー
  blurDataURL="..."  // Base64 の小さい画像
/>

効果: 自動で WebP/AVIF に変換、サイズ最適化、lazy loading。画像容量が平均60%削減。

パフォーマンス計測

LCP

Largest Contentful Paint

< 2.5s

最大コンテンツの描画時間

FID

First Input Delay

< 100ms

最初の入力への応答時間

CLS

Cumulative Layout Shift

< 0.1

レイアウトのずれ

まとめ

Reactのパフォーマンス最適化はユーザー体験に直結する重要な施策です。React.memo、useMemo、useCallback による再レンダリング最適化、Code Splitting、画像最適化。これらを適切に実装することで、高速で快適なアプリケーションを実現できます。

弊社では、これらの最適化手法により、初回レンダリング時間が62%短縮され、バンドルサイズが45%削減されました。

この記事をシェア:

おすすめの記事

株式会社Apple Seed - システム開発・AI開発