[nextjs] nextjs 기록1

do_large·2022년 1월 16일
0

nextjs

목록 보기
1/1

nextjs를 사용해서 아주 간단한 웹사이트를 만들어보고있는데,
구현해보면서 배운것들을 기록해보고자한다.

우선 nextjs는 react + ssr으로 유명하다.

리액트를 기반으로한 프레임워크이기때문에 지켜야할 룰들이있어서 공식문서를 보면서 구현중이다.


그 중 오늘 공부해본것을 기록해보면

데이터 페칭 시점에 따라 html구성이 달라진다.

우선 ssr 방식으로 구현을 해보고싶으면 아래처럼 getInitialProps를 사용해보면된다.

const Home: NextPage<{ pocketmon: PocketmonAPI }> = ({ pocketmon }) => {
  return (
    <div className={styles.container}>
      <Head>
        <title>Pocketmon</title>
        <meta name="description" content="Generated by create next app" />
        <link rel="icon" href="/favicon.ico" />
      </Head>
      {pocketmon.results.map((info) => (
        <div key={info.name}>{info.name}</div>
      ))}
    </div>
  );
};

Home.getInitialProps = async (ctx) => {
  const response = await axios.get<PocketmonAPI>(
    "https://pokeapi.co/api/v2/pokemon?limit=20"
  );

  return { pocketmon: response.data };
};

아래의 사진은 브라우저에서 받은 index.html파일인데, body를 보면 알수있듯이 데이터가 박혀서 html이 넘어온다. 즉, 서버에서 이미 데이터페칭을 완료한 뒤 받아온 데이터를 렌더링 한 html을 클라이언트로 보내주는것이다.

그럼 리액트에서 보통 하는방식으로 해보자
useSWR을 사용해서 컴포넌트가 렌더링 되는 시점에 데이터 페칭을 해서, data의 유무에따라 loading or 리스트를 보여준다.

const Home: NextPage<{ pocketmon: PocketmonAPI }> = ({ pocketmon }) => {
  const { data, error } = useSWR<{ results: Pocketmon[] }>(
    "/api/list",
    fetcher
  );

  return (
    <div className={styles.container}>
      <Head>
        <title>Pocketmon</title>
        <meta name="description" content="Generated by create next app" />
        <link rel="icon" href="/favicon.ico" />
      </Head>
    	 {data ? (
          data.results.map((info) => <div key={info.name}>{info.name}</div>)
        ) : (
          <div>Loading...</div>
        )}
    </div>
  );
};

이 코드를 실행시켰을때 html파일을 보면 초기엔 data가 undefined이기 때문에 loading만 렌더링된 채로 클라이언트로 보내진다.

0개의 댓글