Skip to content

パフォーマンス最適化

公開日:December 8, 2024更新日:December 8, 2024
ReactTypeScriptCoding📄

Reactアプリケーションのパフォーマンスを最適化することで、よりスムーズで快適なユーザー体験を提供できます。本章では、Reactの再レンダリング抑制、コード分割、パフォーマンス測定について解説します。

1. Reactの再レンダリング抑制

React.memo

  • 概要:
    • 関数コンポーネントをメモ化して、不要な再レンダリングを防止。
  • 使用例:
    tsx
    import React from "react";
    
    const ChildComponent = React.memo(({ value }: { value: string }) => {
      console.log("ChildComponent rendered");
      return <div>{value}</div>;
    });
    
    const ParentComponent = () => {
      const [count, setCount] = React.useState(0);
      return (
        <div>
          <button onClick={() => setCount(count + 1)}>Increment</button>
          <ChildComponent value="Static Value" />
        </div>
      );
    };

useMemo

  • 概要:
    • 計算コストが高い処理の結果をメモ化。
  • 使用例:
    tsx
    const ExpensiveComponent = ({ items }: { items: number[] }) => {
      const total = React.useMemo(() => {
        console.log("Calculating total");
        return items.reduce((acc, item) => acc + item, 0);
      }, [items]);
    
      return <div>Total: {total}</div>;
    };

useCallback

  • 概要:
    • 関数の再生成を防ぎ、子コンポーネントに渡すコールバックをメモ化。
  • 使用例:
    tsx
    const ParentComponent = () => {
      const [count, setCount] = React.useState(0);
      const handleClick = React.useCallback(() => {
        console.log("Button clicked");
      }, []);
    
      return (
        <div>
          <button onClick={() => setCount(count + 1)}>Increment</button>
          <ChildComponent onClick={handleClick} />
        </div>
      );
    };
    
    const ChildComponent = React.memo(({ onClick }: { onClick: () => void }) => {
      console.log("ChildComponent rendered");
      return <button onClick={onClick}>Click Me</button>;
    });

2. Code-SplittingとDynamic Import

Code-Splitting

  • 概要:
    • アプリケーションを小さなチャンクに分割し、必要に応じて読み込む。

React.lazyとSuspense

  • 使用例:
    tsx
    import React, { Suspense } from "react";
    
    const LazyComponent = React.lazy(() => import("./LazyComponent"));
    
    const App = () => {
      return (
        <Suspense fallback={<div>Loading...</div>}>
          <LazyComponent />
        </Suspense>
      );
    };

Dynamic Import

  • 概要:
    • 必要なタイミングでモジュールを読み込む。
  • 使用例:
    tsx
    const handleClick = async () => {
      const { default: module } = await import("./module");
      module.doSomething();
    };

3. パフォーマンス測定

React Profiler

  • 概要:
    • コンポーネントのレンダリング時間を測定。
  • 使用方法:
    tsx
    import { Profiler } from "react";
    
    const onRenderCallback = (
      id, // コンポーネントのID
      phase, // "mount"または"update"
      actualDuration // レンダリングにかかった時間
    ) => {
      console.log({ id, phase, actualDuration });
    };
    
    const App = () => {
      return (
        <Profiler id="App" onRender={onRenderCallback}>
          <ChildComponent />
        </Profiler>
      );
    };

Web Vitals

  • 概要:
    • ユーザーエクスペリエンスを測定する重要な指標。
  • 導入:
    bash
    npm install web-vitals
  • 使用例:
    tsx
    import { getCLS, getFID, getLCP } from "web-vitals";
    
    getCLS(console.log);
    getFID(console.log);
    getLCP(console.log);

パフォーマンス最適化はReactアプリケーションの品質を向上させる重要な要素です。本章で紹介した手法を活用し、効率的で快適なアプリケーションを構築しましょう。