Next.js 공부를 하기앞서, Next.js가 어떤식으로 동작하는지 알아보자
Next 서버로 요청이 들어오면 Next서버에서 요청이 들어온 페이지에 들어갈 데이터를 Fetch하고 (서버측에서 Fetch를 한다는점이 기존과 다르다) Html을 구성하여 Client로 보내준다.
styled-components
layout
meta
등등 옵션이 있다.pages
폴더 안에 있다.server only file
이므로 Client에서 사용되는 로직을 사용해서는 안된다. 만약 사용한다면 window is not defined
라는 에러를 뿜을것이다function MyApp({ Component, pageProps }) {
return (
<Layout>
<Component {...pageProps} />
</Layout>
);
}
export default MyApp;
여기서 props로 받는 Component
는 요청한 페이지이다.
pageProps
는 getInitialProps를 통해 내려받은 props를 말한다.
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
에 클라이언트 로직을 넣으면 안된다.
브라우저는Main
컴포넌트를 제외한 다른 컴포넌트를 initialize하지 않는다.
공통된 로직이 필요하다면_app.js
를 활용하라.
getStaticProps
, getStaticPaths
, getServerSideProps
를 사용한다_app.js
에서 getInitialProps를 가져오면 되고, 각각의 컴포넌트마다 다른 데이터가 필요하면 해당 컴포넌트마다 알맞은 getInitialProps를 가져오면 된다.window
나 document
같은 Client에서의 로직은 피해야한다._app.js
에 getInitialProps이 있다면 페이지에 있는 getInitialProps는 실행되지 않을거다. 다만 아래처럼 커스터마이징을 한다면 최종 결과를 pageProps에 담을 수 있다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>
);
}
};
getInitialProps는 기본으로 받는 Context(ctx)라는 props가 있다.
Context의 기본구성은 아래와 같다
pathname
: 현재 pathNamequery
: 현재 query를 object형태로 출력asPath
: 전체 pathreq
res
err
_app.js
의 getInitialProps가 있다면 실행_document.js
의 getInitialProps가 있다면 실행_app.js
를 통해서 page Component를 렌더링한다._document.js
를 실행하여 html형태로 출력한다_app.js
는 서버로 요청이 들어왔을때 가장 먼저 실행되고 공통 레이아웃 역할을 해준다.
_document.js
는 다음으로 실행되며 공통으로 활용할 <head> <body>
안의 내용을 커스텀할때, font 임포트
, 웹접근성
, charset
, styled-components
등을 커스텀하는 역할이다
유익한 내용인 것 같습니다. 잘 읽고갑니다.