> 웹 프론트엔드 > JS 튜토리얼 > React 자동 최적화: Goodbye memo, useMemo, useCallback?

React 자동 최적화: Goodbye memo, useMemo, useCallback?

Mary-Kate Olsen
풀어 주다: 2025-01-07 20:31:41
원래의
520명이 탐색했습니다.

React Automatic Optimization: Goodbye memo, useMemo, and useCallback?

React 19는 성능 최적화, 특히 메모 처리 방식을 크게 개선했습니다. memo, useMemo, useCallback이 어떻게 발전했는지, 그리고 기본적으로 어떻게 최적화되었는지 살펴보겠습니다.

React에서 메모화의 진화

이전 React 18에서는 개발자가 불필요한 재렌더링을 방지하고 성능을 최적화하기 위해 메모화 기술을 언제 사용해야 하는지 신중하게 고려해야 했습니다. React 19는 이러한 도구를 더 효율적이고 많은 경우 불필요하게 만드는 자동 최적화를 도입하여 이러한 패러다임을 바꿉니다.

React 19의 메모: 더 스마트한 구성요소 메모화

React 19의 메모는 이제 구성 요소를 다시 렌더링할 시기에 대해 훨씬 더 지능적입니다. 프레임워크는 prop 변경 사항과 해당 변경 사항이 구성 요소 출력에 미치는 영향을 자동으로 추적합니다.

예시 1: 기본 소품 비교

// React 18
const UserCard = memo(({ user, onUpdate }) => {
  return (
    <div>
      <h2>{user.name}</h2>
      <button onClick={onUpdate}>Update</button>
    </div>
  );
});

// React 19
// memo is now automatically optimized
const UserCard = ({ user, onUpdate }) => {
  return (
    <div>
      <h2>{user.name}</h2>
      <button onClick={onUpdate}>Update</button>
    </div>
  );
});
로그인 후 복사

예 2: 중첩된 구성요소

// React 18
const CommentThread = memo(({ comments, onReply }) => {
  return (
    <div>
      {comments.map(comment => (
        <Comment 
          key={comment.id}
          {...comment}
          onReply={onReply}
        />
      ))}
    </div>
  );
});

// React 19
const CommentThread = ({ comments, onReply }) => {
  return (
    <div>
      {comments.map(comment => (
        <Comment 
          key={comment.id}
          {...comment}
          onReply={onReply}
        />
      ))}
    </div>
  );
});
로그인 후 복사

useMemo: 자동 값 메모

React 19의 useMemo는 이제 메모가 유용한 시기를 자동으로 감지하도록 최적화되어 수동 최적화의 필요성이 줄어듭니다.

예 1: 비용이 많이 드는 계산

// React 18
const ExpensiveChart = ({ data }) => {
  const processedData = useMemo(() => {
    return data.map(item => ({
      ...item,
      value: complexCalculation(item.value)
    }));
  }, [data]);

  return <ChartComponent data={processedData} />;
};

// React 19
const ExpensiveChart = ({ data }) => {
  // React 19 automatically detects expensive operations
  const processedData = data.map(item => ({
    ...item,
    value: complexCalculation(item.value)
  }));

  return <ChartComponent data={processedData} />;
};
로그인 후 복사

예 2: 객체 참조

// React 18
const UserProfile = ({ user }) => {
  const userStyles = useMemo(() => ({
    background: user.premium ? 'gold' : 'silver',
    border: `2px solid ${user.active ? 'green' : 'gray'}`
  }), [user.premium, user.active]);

  return <div>



<h3>
  
  
  Example 3: Derived State
</h3>



<pre class="brush:php;toolbar:false">// React 18
const FilteredList = ({ items, filter }) => {
  const filteredItems = useMemo(() => 
    items.filter(item => item.category === filter),
    [items, filter]
  );

  return <List items={filteredItems} />;
};

// React 19
const FilteredList = ({ items, filter }) => {
  // React 19 automatically optimizes derived state
  const filteredItems = items.filter(item => item.category === filter);
  return <List items={filteredItems} />;
};
로그인 후 복사

useCallback: 더욱 스마트해진 함수 메모

React 19의 useCallback은 이제 기능 안정성과 참조 평등에 대해 더욱 지능적입니다.

예제 1: 이벤트 핸들러

// React 18
const TodoList = ({ todos, onToggle }) => {
  const handleToggle = useCallback((id) => {
    onToggle(id);
  }, [onToggle]);

  return todos.map(todo => (
    <TodoItem 
      key={todo.id}
      {...todo}
      onToggle={handleToggle}
    />
  ));
};

// React 19
const TodoList = ({ todos, onToggle }) => {
  // React 19 automatically maintains function stability
  const handleToggle = (id) => {
    onToggle(id);
  };

  return todos.map(todo => (
    <TodoItem 
      key={todo.id}
      {...todo}
      onToggle={handleToggle}
    />
  ));
};
로그인 후 복사

예제 2: 종속성이 있는 콜백

// React 18
const SearchComponent = ({ onSearch, searchParams }) => {
  const debouncedSearch = useCallback(
    debounce((term) => {
      onSearch({ ...searchParams, term });
    }, 300),
    [searchParams, onSearch]
  );

  return <input onChange={e => debouncedSearch(e.target.value)} />;
};

// React 19
const SearchComponent = ({ onSearch, searchParams }) => {
  // React 19 handles function stability automatically
  const debouncedSearch = debounce((term) => {
    onSearch({ ...searchParams, term });
  }, 300);

  return <input onChange={e => debouncedSearch(e.target.value)} />;
};
로그인 후 복사

예제 3: 복잡한 이벤트 처리

// React 18
const DataGrid = ({ data, onSort, onFilter }) => {
  const handleHeaderClick = useCallback((column) => {
    onSort(column);
    onFilter(column);
  }, [onSort, onFilter]);

  return (
    <table>
      <thead>
        {columns.map(column => (
          <th key={column} onClick={() => handleHeaderClick(column)}>
            {column}
          </th>
        ))}
      </thead>
      {/* ... */}
    </table>
  );
};

// React 19
const DataGrid = ({ data, onSort, onFilter }) => {
  // React 19 optimizes function creation and stability
  const handleHeaderClick = (column) => {
    onSort(column);
    onFilter(column);
  };

  return (
    <table>
      <thead>
        {columns.map(column => (
          <th key={column} onClick={() => handleHeaderClick(column)}>
            {column}
          </th>
        ))}
      </thead>
      {/* ... */}
    </table>
  );
};
로그인 후 복사

React 19 최적화의 주요 이점

  1. 보일러플레이트 감소: 명시적인 메모 래퍼 코드의 필요성 감소
  2. 자동 성능: React가 구성 요소 업데이트를 지능적으로 처리합니다
  3. 더 나은 개발자 경험: 최적화에 대한 의사결정 감소
  4. 번들 크기 개선: 메모 코드가 적으면 번들 크기도 작아집니다
  5. 자동 안정성: 참조 동등성 처리 개선
  6. 스마트 리렌더링: 더욱 효율적인 업데이트 일정

명시적 메모를 계속 사용해야 하는 경우

React 19의 자동 최적화는 강력하지만 명시적 메모가 도움이 될 수 있는 경우도 있습니다.

  1. 비용이 많이 드는 계산을 반드시 메모하고 싶을 때
  2. 참조 안정성을 보장하려는 복잡한 데이터 구조를 다룰 때
  3. 세밀한 제어가 필요한 성능이 중요한 애플리케이션
  4. 안정적인 참조를 기대하는 외부 라이브러리와 통합하는 경우

결론

React 19의 메모 기능 개선을 통해 수동으로 최적화를 관리하지 않고도 고성능 애플리케이션을 더 쉽게 작성할 수 있습니다. 이제 프레임워크는 여러 가지 일반적인 최적화 시나리오를 자동으로 처리하여 코드를 더 깔끔하게 만들고 기본적으로 더 나은 성능을 제공합니다.

이러한 최적화는 강력하지만 작동 방식을 이해하면 특정 사용 사례에 대해 자동 최적화를 사용해야 할 때와 수동 최적화를 구현할 때를 더 잘 결정하는 데 도움이 됩니다.

즐거운 코딩하세요!

위 내용은 React 자동 최적화: Goodbye memo, useMemo, useCallback?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿