React.lazy()

dynamic 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 기능을 사용하기 위해서는 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>
  );
}

웹 페이지를 불러오고 진입하는 단계인 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>
);
  • 라우터가 분기되는 컴포넌트에서 각 컴포넌트에 React.lazy를 사용하여 import
  • 컴포넌트들을 Suspense로 감싼 후 로딩 화면으로 사용할 컴포넌트를 fallback 속성으로 설정

댓글남기기