기본적으로 Next.js는 모든 페이지를 미리 렌더링합니다. 즉, Next.js는 클라이언트 측 JavaScript에서 모든 작업을 수행하는 대신 각 페이지에 대해 미리 HTML을 생성합니다. 생성된 각 HTML은 해당 페이지에 필요한 최소한의 JavaScript 코드와 연결됩니다. 브라우저에서 페이지를 로드하면 해당 JavaScript 코드가 실행되고 페이지가 완전히 상호작용합니다. 이 과정을 hydration이라고 합니다. 사전 렌더링은 더 나은 성능과 SEO를 가져올 수 있습니다.
사전 렌더링이 더 나은 성능과 SEO를 가져온다는 것은 반대로 react-hooks의 useEfftect() 함수를 사용할 경우 성능이 저하될 수 있다는 것을 뜻합니다. 아래 사진에서 처음에 렌더링하면서 undefined가 보였다가 한번 깜빡이고 데이터를 받아오는 것을 볼 수 있습니다. 페이지와 데이터가 많을수록 심한데, 사전 렌더링은 이러한 단점을 개선했습니다.
동적라우팅([id].js)이 가능한 페이지의 Static Site Generation을 말합니다. getStaticProps와 getStaticPaths 모두 사용하여야 합니다.
getStaticPaths를 사용하지 않는 경우 Server Error가 발생합니다.
=> Error: getStaticPaths is required for dynamic SSG pages ...
서버에서 데이터를 fetch 받을 때도 동적라우팅 주소를 사용해서 받아야합니다. ex) /detail/${id}
1) getStaticProps와 getStaticPaths를 사용하는 경우
/detail/[id].js
export async function getStaticPaths({ params }) {
const res = await fetch("http://해당주소");
const list = await res.json();
const paths = list.map((list) => ({
params: { id: list.id.toString() },
}));
return {
paths,
fallback: false,
};
}
export async function getStaticProps({params}) {
const res = await fetch(`http://해당주소/${params.id}`);
const list = await res.json();
return {
props: { shows: list },
};
}
2) getInitialProps를 사용하는 경우
/detail/[id].js
import React, { useEffect, useState } from "react";
import { useRouter } from "next/router";
import RequestDetailHeader from "../../../../components/Header/RequestDetailHeader";
import RequestInfoHeader from "../../../../components/Header/RequestInfoHeader";
import RequestInfo from "../../../../components/RequestDetail/RequestInfo";
import styles from "./Detail.scss";
import { REQUEST_NUMBER_TEXT } from "../../../../constants/requestDetail/RequestInfo";
import { PROPOSAL_INFO } from "../../../../constants/requestDetail/ProposalInfo";
import { PROPOSAL } from "../../../../constants/requestDetail/Proposal";
import fetch from "isomorphic-unfetch";
const Detail = (list) => {
const isProposal = true;
const { shows } = list;
const router = useRouter();
console.log(shows, "ddddddd");
return (
<div className={styles.container}>
<RequestDetailHeader requestDetail={"요청상세"} />
<RequestInfo list={shows} />
<div style={{ paddingTop: "15px" }} />
<RequestInfoHeader
proposal={PROPOSAL}
isProposal={isProposal}
requestNumber={REQUEST_NUMBER_TEXT}
proposalInfo={PROPOSAL_INFO}
style={{ display: "none" }}
/>
</div>
);
};
Detail.getInitialProps = async function () {
const res = await fetch("http://localhost:5700/api/getRequestInfo");
const list = await res.json();
console.log(list, "difjsdoifjwoj");
return {
shows: list,
};
};
export default Detail;
당신 천재야...?