# loadable-components 와 Next.JS
## 공통점
- 코드 스플릿팅을 지원한다
- 현재 사용하지 않는 코드라면 따로 분리시켜, 나중에 필요할 때 불러와서 사용 할 수 있다. ( 페이지의 로딩 속도 개선 )
- 서버사이드 랜더링 지원
### loadable-components
#### 코드 스플리팅
- import 를 사용하여 코드 스플리팅
```
handleClick = () => {
import('./notify').then(({ default: notify }) => {
notify();
});
};
```
- loadable 메소드를 사용하여 코드 스플릿팅
- fallback option으로 로딩중 화면을 렌더링 할 수 있다.
```
const SplitMe = loadable(() => import("./notify"), {
fallback: <div>로딩중입니다</div>,
});
```
- 동적 import
```
const AsyncPage = loadable(props => import(`./${props.page}`))
<AsyncPage page="Home" />
```
### preload
- 이벤트가 발생하기전에 미리 불러오는것
- ex) 클릭 하기 전 hover 시점부터 로딩을 시작하면 빠르게 로딩되는것 처럼 생각
```
<button
onClick={() => {
setvisible(true);
}}
onMouseOver={() => {
SplitMe.preload();
}}
>
```
### SSR
```
npm install @loadable/server && npm install --save-dev @loadable/babel-plugin @loadable/webpack-plugin
```
- babel 설정 파일에 "plugins": ["@loadable/babel-plugin"] 추가
- webpack 설정 파일에 plugins: [new LoadablePlugin()], 추가
- loadableReady를 통해 모든 스크립트를 동기적으로 로딩
next.js 없이 서버사이드 렌더링용 코드스플리팅을 구현하는 최선의 방법
### Next.JS
- 코드 스플리팅 자동화
- zeroconfig : 설정없이 사용가능
- 라우팅
- 파일기반 라우팅
- 동적 라우팅을 위해서는 배열로 파일 명을 해주면 동적 라우팅을 사용할 수 있다 ex)[userId]
- 데이터 프리패치
- getStaticProps : 빌드시 고정되는 값, 빌드 이후에는 변경 불가
- getServersideProps : 빌드와 상관없이, 매 요청마다 데이터를 서버로부터 가져옵니다.
- 커스텀 설정 : 필요하다면 babel, webapck 를 설정할 수 있다.
### Next.JS 선정이유
- 프로젝트 진행 시 초기 설정에 대한 부담이 적은 next.js 선정
### 참고자료
- [Next.JS 공식문서](https://nextjs.org/docs/basic-features/pages)
- [loadable Components 공식문서](https://loadable-components.com/docs/getting-started/)
- [loadable-components 벨로퍼트님](https://velog.io/@velopert/react-code-splitting)
- [Next JS 핸드북](https://coffeeandcakeandnewjeong.tistory.com/5#ch-2)
###### tags: `tech sharing`