초기화면 로딩시간은 UX에 중요한 요소입니다. X2bee 솔루션은 더 나은 UX를 위해 lazy loading을 구현합니다.
Next.js page
아래는 app/page.tsx
의 코드이다.
- 용량이 꽤 큰
PopupListModal
을 import한 후, - useState의 초기값을
false
로 놓아, PopupListModal
component가 렌더링되지 않게 해놓았다.
간단한 예를 들었지만 이 component는 실제 application에서는,
웹사이트를 이용하는 모든 사람들이 꼭 보지 않아도 되는,
원하는 사람만 클릭해서 봐도 되는 component라고 보면 된다.
'use client'
import { useState } from 'react'
import { Button } from '@/components/ui/button'
import PopupListModal from '@/components/common/modal/popup-list-modal'
const Home = () => {
const [isShow, setIsShow] = useState<boolean>(false)
return (
<>
<Button onClick={() => setIsShow(true)}>Click to Show Component </Button>
{isShow && <PopupListModal popupTgtScrn={'main'} />}
</>
)
}
export default Home
빌드 후에 브라우저에서 살펴보면
1.4Mb의 용량을 가져오는 것을 볼 수 있다.
이는 렌더링이 되지 않음에도 불구하고 import
로 가져오는 것이다.
당장 main page에 필요하지 않는 component를 import해와서 초기 로딩 속도가 느려지는 결과를 낳는 것이다.
위와 완벽히 똑같은 기능의 page.tsx
이지만 다음 코드를 보자.
Dynamic Import
app/page.tsx
를 다음과 같이 수정한다.
직접 PopupListModal
component를 import하지 않고 dynamic import를 이용하였다.
'use client'
import { useState } from 'react'
import { Button } from '@/components/ui/button'
import dynamic from 'next/dynamic'
const DynamicComponent = dynamic(
() => import('@/components/common/modal/popup-list-modal'),
{
ssr: false,
loading: () => <p>loading...</p>
}
)
const Home = () => {
const [isShow, setIsShow] = useState<boolean>(false)
return (
<>
<Button onClick={() => setIsShow(true)}>Click to Show Component </Button>
{isShow && <DynamicComponent popupTgtScrn={'main'} />}
</>
)
}
export default Home
위 코드와의 유일한 차이점은 PopupListModal
을 바로 import하지 않고 dynamic import로 import 했다는 점이다.
빌드 후에 브라우저에서 보면
page.tsx의 크기는 133kB로 줄었다.
그리고 버튼을 클릭했하면 useState가 true로 바뀌고
component가 랜더링 되면서 아래와 같이 별도의 1.3Mb짜리 .js
을 가져온다.
이것이 Dynamic import를 이용한 lazy loading으로, 고객들의 UX를 개선시킬 수 있다.
공식문서 참조: https://nextjs.org/docs/app/building-your-application/optimizing/lazy-loading
'Frontend (Next.js Tailwind Typescript) > Next.js' 카테고리의 다른 글
[Javascript] 제너레이터와 이터레이터 필요성 (0) | 2025.01.06 |
---|---|
Next.js에 remark-breaks 플러그인 설치 (1) | 2024.09.29 |
create-next-app (0) | 2024.02.18 |
fetch의 기본 사용법 (0) | 2024.02.16 |
Nextjs Routing(Parallel Routes, Intercepting Routes) (0) | 2024.01.19 |