만두의 부트캠프 🤔
  • 6-3 [React] React.lazy(), Suspense
    2023년 12월 12일 13시 07분 59초에 업로드 된 글입니다.
    작성자: 만두33

    # React.lazy()

     

    React.lazy 함수를 사용하면 dynamic import를 사용해 컴포넌트를 렌더링할 수 있습니다.

    React는 SPA(Single-Page-Application)이므로 한 번에 사용하지 않는 컴포넌트까지 불러오는 단점이 있다고 앞의 챕터에서 학습했습니다.

    React는 React.lazy를 통해 컴포넌트를 동적으로 import를 할 수 있기 때문에 이를 사용하면 초기 렌더링 지연시간을 어느 정도 줄일 수 있게 됩니다.

     

    import Component from './Component';
    
    /* React.lazy로 dynamic import를 감쌉니다. */
    const Component = React.lazy(() => import('./Component'));

    React.lazy로 감싼 컴포넌트는 단독으로 쓰일 수는 없고, React.suspense 컴포넌트의 하위에서 렌더링을 해야 합니다.


    # React.Suspense

     

    Router로 분기가 나누어진 컴포넌트들을 위 코드처럼 lazy를 통해 import하면 

    해당 path로 이동할 때 컴포넌트를 불러오게 되는데 이 과정에서 로딩하는 시간이 생기게 됩니다.

     Suspense는 아직 렌더링이 준비되지 않은 컴포넌트가 있을 때 로딩 화면을 보여주고, 

    로딩이 완료되면 렌더링이 준비된 컴포넌트를 보여주는 기능입니다.

    /* suspense 기능을 사용하기 위해서는 import 해와야 합니다. */
    import { Suspense } from 'react';
    
    const OtherComponent = React.lazy(() => import('./OtherComponent'));
    const AnotherComponent = React.lazy(() => import('./AnotherComponent'));
    
    function MyComponent() {
      return (
        <div>
    			{/* 이런 식으로 React.lazy로 감싼 컴포넌트를 Suspense 컴포넌트의 하위에 렌더링합니다. */}
          <Suspense fallback={<div>Loading...</div>}>
    				{/* Suspense 컴포넌트 하위에 여러 개의 lazy 컴포넌트를 렌더링시킬 수 있습니다. */}
            <OtherComponent />
    				<AnotherComponent />
          </Suspense>
        </div>
      );
    }

     

    Supense 컴포넌트의 fallback prop은 컴포넌트가 로드될 때까지 기다리는 동안 로딩 화면으로 보여줄 React 엘리먼트를 받아들입니다. Suspense 컴포넌트 하나로 여러 개의 lazy 컴포넌트를 보여줄 수도 있습니다.


    # React.lazy와 Suspense의 적용

    앱에 코드 분할을 도입할 곳을 결정하는 것은 사실 까다롭기 때문에,

    중간에 적용시키는 것보다는 웹 페이지를 불러오고 진입하는 단계인 Route에 이 두 기능을 적용시키는 것이 좋습니다.

    import { Suspense, lazy } from 'react';
    import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
    
    const Home = lazy(() => import('./routes/Home'));
    const About = lazy(() => import('./routes/About'));
    
    const App = () => (
      <Router>
        <Suspense fallback={<div>Loading...</div>}>
          <Routes>
            <Route path="/" element={<Home />} />
            <Route path="/about" element={<About />} />
          </Routes>
        </Suspense>
      </Router>
    );

    라우터에 Suspense를 적용하는 것은 간단한 편입니다.

    라우터가 분기되는 컴포넌트에서 각 컴포넌트에 React.lazy를 사용하여 import합니다.

    그리고 Route 컴포넌트들을 Suspense로 감싼 후 로딩 화면으로 사용할 컴포넌트를 fallback 속성으로 설정해 주면 됩니다.

    초기 렌더링 시간이 줄어드는 분명한 장점이 있으나

    페이지를 이동하는 과정마다 로딩 화면이 보이기 때문에 서비스에 따라서 적용 여부를 결정해야 합니다.

    댓글