- Published on
리액트 코드 스플리팅
- Authors

- Name
- dwook
Table of Contents
자바스크립트 함수 비동기 로딩 dynamic import
- 아직 표준 자바스크립트는 아니지만 stage-3 단계. 웹팩에서 지원하고 있어서 별도의 설정 없이 프로젝트에 사용 가능
- import를 함수로 사용하면 Promise를 반환.
- 모듈에서 default로 내보낸 것은 result.default를 참조해야 사용가능
notify.js
export default function notify(){
alert('안녕하세요!')
}
src/App.js
function App(){
const onClick = () => {
import('./notify').then(result => result.default());
}
return(
<div>
<button onClick={onClick}>Notify</button>
</div>
)
}
React.lazy와 Suspense를 통한 컴퍼넌트 코드 스플리팅
- React.lazy: 컴퍼넌트를 렌더링하는 시점에서 비동기적으로 로딩할 수 있게 해주는 유틸함수
- Suspense: 리액트 내장 컴퍼넌트로 코드 스플리팅된 컴퍼넌트를 로딩하도록 발동시킬 수 있고, 로딩이 끝나지 않았을 때 보여줄 UI를 설정.
- SSR 계획이 없다면 React.lazy와 Suspense로 구현 (추후 SSR 지원예상)
- SSR 계획이 있다면, Loadable Component를 사용. 리액트 공식문서에도 SSR할 경우 Loadable Component 라이브러리 권장.
import React, { useState, Suspense } from 'react';
const SplitMe = React.lazy(() => import('./SplitMe'));
function App() {
const [visible, setVisible] = useState(false);
const onClick = () => {
setVisible(true);
};
return (
<div>
<button onClick={onClick}>Hello React!</button>
<Suspense fallback={<div>loading...</div>}>
{visible && <SplitMe/>}
</Suspense>
</div>
);
}
Loadable Compoent를 통한 코드 스플리팅
- Loadable Component는 코드 스플리팅을 편하게 도와주는 서드파티 라이브러리.
- SSR을 지원
- 렌더링하기 전에 필요한 스플리팅된 파일을 미리 불러오는 기능
- 타임아웃
- 로딩 UI 딜레이
yarn add @loadable/component
- React.lazy와 비슷한 사용방법. 단, Suspense를 사용하지 않음.
import React, { useState, Suspense } from 'react';
import loadable from '@loadable/component';
// const SplitMe = React.lazy(() => import('./SplitMe'));
const SplitMe = loadable(() => import('./SplitMe'), {
fallback: <div>loading...</div>
});
function App() {
const [visible, setVisible] = useState(false);
const onClick = () => {
setVisible(true);
};
const onMouseOver = () => {
SplitMe.preload(); // 미리 불러오기
};
return (
<div>
<button onClick={onClick} onMouseOver={onMouseOver}>Hello React!</button>
{visible && <SplitMe/>}
</div>
);
}