NVM을 이용한 Node 버전 업데이트
// 현재 컴터에 설치되있는 Node 버전들을 보여준다.
nvm list
// 설치 하고 싶은 Node 버전을 적고 install
nvm install 16.17.0
// 원하는 Node 버전 사용
nvm use 16.17.0
// 기존 Node 버전 삭제 하고 싶다면?
nvm uninstall 14.17.6
Next.js는 클라이언트에게 웹 페이지를 보내기 전에 Server side 단에서 미리 웹페이지를 pre-render한다.
e. 브라우저를 열어보면 맨 처음 응답 받는 요소가 document Type
파일이고, 이후에 React 코드들이 렌더링된 JS 파일들이 Chunk 단위로 다운로드 된다.
Hydrate
라고 한다.새롭게 로딩할때 마다 약간 뒤늦게 스타일이 적용, HTML DOM 요소에 뒤늦게 자바스크립트가 동작하고 Hydration 현상
Document
는 모든 자바스크립트 요소들이 빠진 굉장히 가벼운 상태이므로 클라이언트에게 빠른 로딩이 가능하다.Next.js의 _app.js
와 _document.js
의 역할
server only file
즉 client 로직 eventListener, window, dom 로직을 사용하면 안된다._app.js
: _app은 로직, 전역 스타일 등 컴포넌트에 공통 데이터를 다룬다.// /pages/_app.js
// MyApp이 props로 받은 'Component'는 요청한 페이지이다. /pages/index.js 파일이 props로 내려온다.
function MyApp({ Component, pageProps }) {
return (
<Layout>
<Component {...pageProps} />
</Layout>
);
}
export default MyApp;
_document
는 공통적으로 적용할 HTML 마크업을 중심으로 다룬다. static html을 구성하기 위한 _app.js
에서 구성한 컴포넌트가 html body가 어떤 형태로 들어갈지 구성 하는곳.// /pages/_document.js
import Document, { Html, Head, Main, NextScript } from 'next/document'
class MyDocument extends Document {
render() {
return (
<Html>
<Head />
<body>
<Main />
<NextScript />
</body>
</Html>
)
}
}
export default MyDocument
_app.js
가 실행되고나서 갖춰진 Content들은 <Main />
아래 생성된다._document.js
에 애플리케이션 로직을 넣으면 안된다.웹 페이지는 각 페이지마다 사전에 불러와야할 데이터들이 있다. CSR에서는 보통 useEffect
훅 안에 Data fetching
로직을 넣는다.
그렇게 되면 컴포넌트가 마운트 되고나서 데이터를 가져오게 된다.
<aside> 💡 SSR에서는 이 과정을 서버에서 미리 처리하도록 도와준다.
</aside>
_app.js
에 getInitialProps를 붙인다./pages/필요한 페이지
import axios from 'axios';
const Page = ({ stars }) => {
return <div>Next stars: {stars}</div>;
};
// getInitialProps 내부 로직은 서버에서 실행된다.
Page.getInitialProps = async ctx => {
const { data } = await axios.get('...url');
return { stars: data };
}
export default Page;
export default class MyApp extends App {
static async getInitialProps({ Component, ctx }) {
let pageProps = {};
// 실행하고자 하는 component에 getInitialprops가 있으면 실행하여 props를 받아올 수 있다.
if (Component.getInitialProps) {
pageProps = await Component.getInitialProps(ctx);
}
return {
pageProps
};
}
render() {
const { Component, pageProps, router } = this.props;
return (
<div>
<Component {...pageProps} />
</div>
);
}
};
_app.js에서 getInitialProps
실행후 pageProps
를 받아와서 하위 페이지에 pageProps
로 데이터 전달하는 방식.