2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Next.js】管理画面を作りながらNext.jsを学ぶ(レンダリング)

Posted at

まえがき

前記事でNext.jsの基本的な使い方を学んだ。
本記事では、Next.jsでCSR/SSR/SSGを使い分けるために必要な知識をまとめる。

Next.jsでは3つのレンダリング方法(CSR/SSR/SSG)が提供されている。※厳密にはISRもある
公式はパフォーマンス的にSSGを推奨している

CSR/SSR/SSGの良いところ/悪いところは、下記の記事で自分でOUTPUTしてみた。

CSR

・useEffect関数 ... クライアント側で、マウント時に実行されるもの
・useEffect関数は、Server-sideでは実行されない。

import type { NextPage } from "next";
import axios from "axios";
import { useEffect, useState } from "react";
import { AccountTable } from "../components/account/AccountTable";
import { Box } from "@chakra-ui/react";

const Account: NextPage = () => {
  const [accounts, setAccounts] = useState([]);

  // クライアント側でレンダリングする際に実行
  useEffect(() => {
    axios.get("/data/accounts.json").then((res) => {
      setAccounts(res.data);
    });
  });

  return (
    <div>
      <Box m="10px">アカウント管理画面</Box>
      <AccountTable accounts={accounts} />
    </div>
  );
};

export default Account;

SSR

・getServerSideProps関数 ... サーバ側でレンダリング時に実行されるもの
・HTMLを生成するために必要な動的データの取得(APIコール)は、この関数内で実行する。
・ユーザ起因の動的データ取得処理は別で書けばOK。

export async function getServerSideProps(context) {
  return {
    props: {}, // will be passed to the page component as props
  }
}

SSRは基本的に使わない方が良さそう

下記の記事でSSRを使うべきか/使わないべきかについて説明してくれている。
あとで自分用に見返すためにまとめ部分だけ引用させていただく。

・基本的にSSRをするとコードが複雑になるので、避けられるなら避けるべき。
・SSRが必要なのはSEOを意識するWebページだけ。
・SEOが不要なページであれば、認証ありなAPIコールは全てブラウザ上で行えば良い。
・不用意な混入を防ぐために、getInitialPropsをやめてgetServerSidePropsを使おう。

SSG

・useStaticProps関数 ... ビルド時に実行されるもの
・propsとして渡されるデータは、ビルド時にJSONファイルとして生成される
・HTTPリクエスト時にJSONファイルが同梱される。

import type { NextPage, GetStaticProps } from "next";

// propsとして受け取る型を定義
type Props = {
  accounts: AccountDto[];
};

const Account: NextPage<Props> = (props) => {
 //------
}
// ★ pagePropsとしてのデータは「out/_next/data/hogehoge配下にJSONファイルとして保存される」
export const getStaticProps: GetStaticProps<Props> = async () => {
  // getStaticPropsでaxios使うと怒られた。
  // const accounts = (await axios.get("/data/accounts.json")).data;
  const accounts = [
    {
      id: "act_0000001",
      name: "Anthony",
      age: 26,
      gender: "",
    },
  ];
  return {
    props: { accounts }, // will be passed to the page component as props
  };
};
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?