React/know

성능 최적화 : React Dev Tool, React.lazy

타코따코 2024. 11. 19. 14:55

react dev tools 설치 → components, profiler tab

  • 디버깅툴 : react dev tool : chrome, npm i redux-devtools-extension → composeWithdevTools → 크롬 개발자 도구 → redux (state action 디버깅을 쉽게 가능)
  • profiler : 랜더링, 리랜더링 분석 가능
    • setting → profiler → record → 클릭 → 녹화 멈춤
    • 회색요소 → 랜더링 되지 않은 요소
    • 노란색이 많을 수록 오래 걸린다.
    • why did this render로 볼 수 있다.

 

번들 사이즈 줄이기 → lazy → 필요한것만 다운로드

  • 서버에서 한번의 큰 js 사이즈를 브라우져에 전달 → 다운로드 시간이 오래 걸림
  • 작은 사이즈로 여러개 쪼개서 하나씩 전달 → 유저는 일단 하나를 보고있는 중 → 계속 전달
  • npm run build → .js의 파일 크기를 알 수 있음.
  • lazy를 쓰면 보이는 화면 이외의 Router에 대해서는 아직 로딩을 하지 않은 상태
  • mainPage에서 login을 누르면 loginPage를 다운로드받고, lazy로 되어있어서 그동안은 suspense의 로딩스피너가 돈다.
  • 이미 다운로드 된거는 빠르게 나타난다. network 3g로 확인해볼 수 있다.

 

최적화 예시1)

  • 느린 이유 → useState 변경 → SlowComponent도 재랜더링 → 10만개 컴포넌트 → 느림
  • 해결방법
    • SlowComponent를 {children}으로 외부에서 전달받기
    • Test에서 useState에서 독립적이므로 재랜더링하지 않는다.
    • (SlowComponent가 useState을 받는다면 재랜더링된다)

 

최적화 예시2)

번들 : 자바스크립트 총 파일 → 한번에 다운받으면 오래 걸림

lazy를 사용해서 해당 컴포넌트를 동적으로 가져옴 → 다 안가져오기 때문에 첫 데이터는 빠르다.

import React, { Suspense } from 'react';

// Lazy-loaded component
const LazyComponent = React.lazy(() => import('./LazyComponent'));

function App() {
  return (
    <div>
      <h1>My App</h1>
      
      {/* Suspense를 사용하여 로딩 시 보여줄 fallback을 설정 */}
      <Suspense fallback={<div>Loading...</div>}>
        <LazyComponent />
      </Suspense>
    </div>
  );
}

export default App;

 

 

'React > know' 카테고리의 다른 글

비구조할당으로 argument 처리하기  (0) 2024.11.21
Render Props 패턴  (0) 2024.11.20
useEffect 알아보기  (0) 2024.11.18
useRef 알아보기  (0) 2024.11.17
useState에 대해 정리해보기  (1) 2024.11.15