lazy import 코드분할과 Suspense
2022. 12. 11. 17:19ㆍStudy/React
리액트에서 빌드를 하게되면 html, js 파일이 1개만 생성된다.
그 안에 지금까지 만든 컴포넌트 내용들이 들어있어 파일 사이즈가 크다.
그래서 리액트 사이트들은 첫 페이지 로딩속도가 매우 느릴 수 있는데,
이 현상을 해결하려면 JS파일을 잘게 쪼개면 된다.
쪼개는 방법은 import 문법을 약간 수정하면 된다
(App.js)
import Detail from './routes/Detail.js'
import Cart from './routes/Cart.js'
위 코드를 으래 코드로 수정하면 된다.
(App.js)
import {lazy, Suspense, useEffect, useState} from 'react'
const Detail = lazy( () => import('./routes/Detail.js') )
const Cart = lazy( () => import('./routes/Cart.js') )
lazy 문법으로도 똑같이 import가 가능한데,
위 경우엔 "Detail 컴포넌트가 필요해지면 import 해주세요" 라는 뜻이 된다.
이렇게 import 하게 되면 빌드 시 Detail 컴포넌트를 다른 파일로 쪼개준다.
Suspense
lazy 문법을 사용하면 당연히 Detail 컴포넌트 로드까지 지연시간이 발생할 수 있게 된다. 그럴 땐
1. Suspense 를 import 한다.
2. Detail 컴포넌트를 감싸준다.
Detail 컴포넌트가 로딩중일 때 대신 보여줄 html 작성을 할 수 있따.
귀찮으면 <Suspense> 이걸로 <Routes> 전부 감싸도 됩니다.
// App.js
<Suspense fallback={<div>Loading...</div>}>
<Routes>
<Route path="/" element={<Index prd={prd} setPrd={setPrd} req={req} setReq={setReq} />} />
<Route path="/detail/:prdId" element={<Detail prd={prd} />}/>
<Route path="/about" element={<About />}>
<Route path="shopping" element={<AboutShopping />} />
<Route path="delivering" element={<AboutDelivering />} />
</Route>
<Route path="/cart" element={<Cart />} />
<Route path="*" element={<div style={{padding:"2rem"}}>There's nothing here!</div>} />
</Routes>
</Suspense>
'Study > React' 카테고리의 다른 글
느린 컴포넌트 성능 향상 useTransition, useDeferredValue (0) | 2022.12.11 |
---|---|
불필요한 재 렌더링을 막으려면 memo, useMemo (0) | 2022.12.11 |
실시간 데이터가 중요하다면 react-query (0) | 2022.12.11 |
React에서 자주 쓰는 if문 작성패턴 5가지 (0) | 2022.11.17 |
상태관리 라이브러리 Reducx (0) | 2022.11.12 |