React.lazy
함수를 사용하면 dynamic import
를 사용해 컴포넌트를 렌더링 할 수 있습니다.
React는 SPA(Single-Page-Applicaion)이므로 한 번에 사용하지 않는 컴포넌트까지 불러오는 단점이 있기 때문에 React.lazy
를 통해 컴포넌트를 동적으로 import
하게되면 초기 렌더링 지연시간을 어느정도 줄일 수 있다.
import Component from './Component';
/* React.lazy로 dynamic import를 감쌉니다. */
const Component = React.lazy(() => import('./Component'));
이 React.lazy
로 감싼 컴포넌트는 단독으로는 쓸 수 없고, 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>
);
}
앱에 코드 분할을 도입할 곳을 결정하는 것은 사실 까다롭기 때문에, 중간에 적용시키는 것보다는 웹 페이지를 불러오고 진입하는 단계인 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
속성으로 설정해주면 된다.
초기 렌더링 시간이 줄어드는 장점이 있으나 페이지를 이동하는 과정마다 로딩 화면이 보여지기 때문에 서비스에 따라 적용 여부를 결정해야 한다.