React.js Next.js
25 Feb 2021 | ReactReact.js Next.js
- Next.js
- Next.js는 리액트에서 SSR을 쉽게 구현할 수 있게 도와주는 프레임워크이다
- SSR(Server Side Rendering)은 서버에서 클라이언트의 브라우저에 보여줄 HTML을 미리 준비해서 응답해주는 방식으로 클라이언트의 브라우저가 자바스크립트 번들을 다운로드받아 해석하기 전에 미리 화면을 보여준다
- CSR(Client Side Rendering)은 클라이언트의 브라우저가 자바스크립트 번들을 해석해 화면을 렌더링 하는 방식이다
- 리액트로 만든 일반적인 SPA의 렌더링은 render() 가 실행되고 ComponentDidMount() 등의 lifeCycle 메소드를 통해 데이터를 가져와 바뀐 부분을 다시 렌더링하는 방식이다. Next.js를 사용하면 getInitialProps() 메소드로 데이터를 먼저 가져와서 한번에 렌더링을 할 수 있다. 초기 로딩속도를 향상시킬 수 있다는 뜻이다
- 초기 콘텐츠가 비동기 처리가 많게 되면 검색엔진의 크롤러는 이를 이해할 수 없기 때문에 상위 노출은 어렵다. SSR은 초기에 pre-rendered된 화면을 보여주기 때문에 검색 엔진의 크롤러가 이해를 할 수 있다.
- Next.js 특징으로는 다음을 뽑을 수 있다
- 간단한 라우팅
- 검색 엔진 최적화
- 코드 스플라이팅
- HMR(Hot Module Replacement)을 지원하는 웹팩 기반 환경
- babel, Webpack 커스터마이징
-
코드 스플리팅
- 일반적인 SPA 는 초기 로딩시에 모든 컴포넌트를 일괄적으로 다운로드하기에 규모가 커지면 로딩 속도는 느려지기 마련이다
- Next.js는 pages 폴더를 지정하고 index 페이지만 우선적으로 불러와 렌더링하고 다른 페이지로 넘어가면 그 페이지만 불러오는 식이다
- 이 과정에서 여러 컴포넌트 조각들이 끼어있더라도 해당 페이지 관련 컴포넌트들만 import하므로 모든 컴포넌트를 전부 다운받는 SPA보다 초기 로딩속도가 빠르다
-
기본 사용법
- npm install –save next react react-dom
- package.json의scripts를 변경
- “dev”: “next”
- “build”: “next build”
- “start”: “next start”
- pages 폴더 만들기 (next에서 쓰이는 폴더이므로 반드시 이름 pages로)
- 이 폴더의 폴더 하나하나가 url이 된다
- ex) pages/user/user.js -> /user/user
- component 조각들은 따로 components 폴더 만들고 import해서 사용
-
라우팅
- Next에서 제공하는 Link 컴포넌트를 이용
import Link from 'next/link'; <Link href='/path'><a>이동</a></Link>
- Next애서 제공하는 Router를 이용
import Router from 'next/router'; <button onClick={() => Router.push('/path')}></button>
-
스타일링
- Next에서 기본적으로 제공하는 styled-jsx를 이용
- <style jsx> 태그 안에 중괄호+백틱 사이에 css코드를 작성
<div> <style jsx>{` div { border: 1px solid #eee; } `}</style> </div>
-
에러처리
- 에러 페이지를 커스터마이징 할 수 있다
- pages 폴더 안에 _error.js 파일을 작성(지정된 이름 사용)
{/* ex) pages/404/_error.js */} import React from 'react'; import Link from 'next/link'; const errorPage = () => ( <div> <h1>요청한 페이지가 존재하지 않습니다</h1> <Link href='/'> <a>돌아가기</a> </Link> </div> ); export default errorPage;
-
Lifecycle
- getInitialProps(context) {} -> 클래스 방식
- pageName.getInitialProps = context => {} -> 함수형 방식
- CSR에서 렌더링이 된 후 componentDidMount 등으로 fetching을 하는 것과 달리 Next에서는 getInitialProps를 이용해 사전에 fetching 작업을 할 수 있다
- Next ver 9.0 이상에서는 getInitialProps 대신 getStaticProps, getStaticPaths, getServerSideProps를 권장하고 있다
- context 오브젝트는 pathname, query, asPath, req, res, err 등의 데이터를 담고 있다
static async getInitialProps(context) { {/*data fetching*/} } pageName.getInitialProps = async context => { {/*data fetching*/} }
참고 자료
Udemy - React The Complete Guide