1. lazy loading 사용 목적
React는 서버로 데이터를 요청 & JavaScript 파일로 로딩됨
- React에서 import문이 다 처리되어야 최종적으로 사용자에게 보여줄 화면을 그릴 수 있음
- 라우트와 컴포넌트가 많아질 수록 모든 파일을 불러오는데 시간이 소요됨 -> 사용자 경험과 연관 문제 발생
lazy loading은 특정 컴포넌트의 로딩을 지연시키는 것
= 로딩을 지연시켜서 특정 컴포넌트를 필요시에 불러오는 것
특정 컴포넌트에 사용자가 방문했을때만 해당 코드가 다운되도록 처리하면 자바스크립트 파일 로딩 시간을 단축시킬 수 있음
React로 만들어진 웹페이지에서 App 컴포넌트를 화면에 렌더하기 위해서 App 컴포넌트에
import된 변수, 함수, 클래스, 컴포넌트 등이 모두 처리되어야 함(상호 의존관계) => 첫 페이지의 로딩속도가 느려짐
2. lazy loading 사용 방법
1. React의 라우팅을 정의한 곳에서 불러오는 import문을 제거
2. import문을 제거하지 않을 경우 페이지 로딩시 마다 import문이 자동으로 처리된 후 최종적으로 화면에 렌더
3. React.lazy로 컴포넌트 재설정 : React.lazy(() => import('/path/yourComponent')
- React.lazy는 동적 import()를 호출하는 함수를 인자로 가짐
- import('경로')는 프로미스를 반환
- React.lazy는 프로미스를 받아 내부적으로 처리
- 프로미스가 해결되면(=모듈이 로드되면) React.lazy는 동적으로 import된 모듈의 export default를 가져와 컴포넌트로 사용
4. Suspense 컴포넌트로 래핑
- Suspense 컴포넌트는 일부 컴포넌트가 아직 렌더링할 준비가 되지 않은 경우 로딩중임을 나타낼 수 있게 해줌
- Suspense 컴포넌트의 fallback 속성을 사용해 로딩중일때 보여줄 컴포넌트를 설정
5. 확인
- 개발자도구 - 네트워크 탭 : 해당 페이지를 방문하면 자바스크립트 파일이 동적으로 다운로드 된것을 확인
- 메인 페이지 접속시에는 lazy loading 처리된 페이지가 네트워크에서 로드하지 않음
3. 코드 적용
기존코드(lazy loading 적용전)
import React from "react";
import { Routes, Route } from "react-router-dom";
import CartView from "../components/carts/CartView";
const Router = (): JSX.Element => {
return (
<Routes>
<Route path="/cart" element={<CartView />} />
</Routes>
);
};
export default memo(Router);
lazyloading 적용 후 코드
import React, { Suspense } from "react";
import { Routes, Route } from "react-router-dom";
const CartViewLazyLoading = React.lazy(() => import("../components/carts/CartView"));
const Router = (): JSX.Element => {
return (
<Routes>
<Route
path="/cart"
element={
<Suspense fallback={<div>Loading...</div>}>
<CartViewLazyLoading />
</Suspense>
}
</Routes>
);
};
export default memo(Router);
간단하게 Suspense 컴포넌트와 React.lazy()를 사용해 lazy loading을 적용
4. 결과
React.lazy()를 처리한 후 메인 페이지에서 CartView 컴포넌트를 로딩하지 않는 것을 확인할 수 있음
Reference
https://ko.legacy.reactjs.org/docs/code-splitting.html
https://velog.io/@ksa199653/React-%EC%A7%80%EC%97%B0%EB%A1%9C%EB%94%A9lazy-loading