NEXTjs Dynamic import
Dynamic import란?
ES2020
에서 제공하는dynamic import
은, 해당 모듈을 애플리케이션의 빌드 타임에 불러오는 것이 아니라 런타임때 불러오는 것이다. 즉 처음 받아오는 모듈 (혹은 소스코드)의 용량을 줄임으로써 페이지의 초기 로딩 속도를 줄일 수 있다.(초기 페이지 로딩시 불필요한 모듈 fetch을 줄임으로써 성능 최적화를 할 수 있다.)
NEXTjs에서의 적용
Basic usage
- 공식문서에서도 말하기를,
NEXTjs
또한dynamic import
를 지원하며 SSR에도 적용이 가능하다.
//
import dynamic from "next/dynamic";
const DynamicComponent = dynamic(() => import("../components/hello"));
function Home() {
return (
<div>
<Header />
<DynamicComponent />
</div>
);
}
export default Home;
- 위에서 보는 바와 같이,
next/dynamic
에서 제공하는dynamic()
으로import()
를 리턴하는 콜백함수를 감쌈으로써 구현할 수 있다. 일반적인React
컴포넌트로서 기능을 하며 props또한 사용이 가능하다. - 주의할 점으로는
import()
의 경로는 템플릿 리터럴이나 변수로 기입해서는 안된다. 또한React
렌더링 안에서는 사용할 수 없다. ( 클래스형 컴포넌트의 렌더링 함수를 뜻하는 것같다.) - 마지막으로
import()
가dynamic()
안에 있어야 한다는 것인데, 그 이유는NEXTjs
가 웹팩 번들 및 모듈 id를 특정dynamic()
호출과 일치시키고 렌더링 전에 프리로딩을 할 수 있기 위해서라고 한다.
실제 적용
import LoadingSpinner from "src/components/common/LoadingSpinner";
//
import styled from "styled-components";
//
const DynamicPlot = dynamic(() => import("./test"), {
loading: () => <LoadingSpinner />,
ssr: false,
});
//
const ResultChartPresenter = (): JSX.Element => (
<StyledResultChartPresenter>
<Layout>
<StyledContents>
<DynamicPlot />
</StyledContents>
</Layout>
</StyledResultChartPresenter>
);
//
export default ResultChartPresenter;
- 내 경우,
Plotly
차트 라이브러리를 사용하였는데 모듈 자체의 크기가 매우 크다보니 차트 컴포넌트 로딩까지의 시간 지연과 컴포넌트 렌더링 에러가 지속적으로 발생했었다. 때문에dynamic import
과 더불어NEXTjs
에서 제공하는custom loading
과no SSR
기능을 사용하여 이를 해결할 수 있었다.
Reference
'NEXT' 카테고리의 다른 글
TIL | Next.js 13 간단 정리 (0) | 2022.11.25 |
---|---|
TIL | Nextjs 환경변수 (0) | 2022.01.21 |
TIL | NEXTjs Build indicator 대신 Loading spinner로 변경하기 (0) | 2021.11.30 |
TIL | NEXTjs Routing, Dynamic Routes (0) | 2021.10.24 |
TIL | NEXTjs Pre-rendering (0) | 2021.10.24 |