学習ブログ。
自分向けの備忘録。

Next.jsとは

React開発のためのフレームワーク。

3種類のレンダリングの使用

  1. CSR クライアントサイドレンダリング
  2. SSR サーバーサイドレンダリング
  3. SG 静的サイト生成

CSR(クライアントサイドレンダリング)

データフェッチやルーティングの全てがクライアント側で行われる

【メリット】
・ブラウザ側でのみ画面が構築されるため、静的なファイルの配置のみで動く
・サーバーの負荷が軽い

【デメリット】
・初期描画に時間がかかる

SSR(サーバーサイドレンダリング)

サーバーにリクエストがきたタイミングで動的にHTMLを生成

【メリット】
・利用者の端末による差異を軽減することができる
・JSをサーバー上で事前に実行するため、大量のJSファイルをクライアントに送信する必要がない
・生成済みのHTMLを取得するためSEOにつよい

【デメリット】
・生成処理を全てサーバー側でするため、負担が大きい
・サーバー上でのページの生成には時間がかかる

SG(静的サイト生成)

・ビルド時にデータフェッチや値の決定を行いHTMLを構築する
・クライアントからリクエストされたら、生成済みのHTMLを渡す

【メリット】
・構築済みのページのため表示速度が早い

【デメリット】
・更新にはビルドが必要なため、リアルタイムでの更新ができない
→更新頻度が高い動的コンテンツとの相性が悪い

App Routerとは

パスを管理するための独自のルーターを提供しているものの1つ。(もう1つはPages Routerだが、App Routerが推奨されている)
フォルダーベースのルーターとなる。

/app配下のフォルダー階層に準じて、リクエストパスとコンポーネントとの対応関係が決まる。

構成

※Udemy内で使用したプロジェクト内をキャプチャ

①src > app > page.js
ページを開いた際に最初に表示される

②src > app > layout.js
グローバルに共有されるUIを定義するために使用される。
rootのlayoutは全てのページに適用される。その配下ディレクトリごとに定義するのも可能。

③src > app > dataディレクトリ
データを格納

src > app > not-found.js
一致するパスのページが見つからなかった場合に表示する

公式参考:
https://nextjs.org/docs/getting-started/project-structure

fetch関数

Next.jsではfetch()を拡張しており、キャッシュの動作をコントロールすることができる。
デフォルトはキャッシュが効いてる。(cache: force-cacheと同意)

import "./lib";
import ClientComp from "./components/ClientComp";
import { ENDPOINT } from "@/constants";
import ArticleList from "@/components/articleList";

export default async function SSR() {
 // fetch関数に第二引数でoptionを渡す(下記のオプションrevalidateは10秒ごとにキャッシュをクリアするの意味)
  const articles = await fetch(ENDPOINT, { revalidate: 10 }).then((res) =>
    res.json()
  );
  return (
    <>
      <div>SSR Page</div>
      <ClientComp />
      <ArticleList list={articles} basePath="/010_SSR" />
    </>
  );
}

MEMO
キャッシュを効かせる場合(cache: force-cache)
→ハードリフレッシュした場合には、キャッシュを使用せずに新しくデータを取りに行き、サーバーサイドからHTMLを返す

ダイナミックルーティング

[]で生成されたフォルダは動的にパスが変わるというルール
↓今回で言うと、010_SSRの直下のパスが動的に変化するという意味

import { ENDPOINT } from "@/constants";
import Article from "@/components/article";

// paramsでidを取得、該当の記事情報をcomponentへ渡し、表示させる
export default async function SSR({ params }) {
  const article = await fetch(`${ENDPOINT}/${params.id}`, {
    revalidate: 10,
  }).then((res) => res.json());
  return (
    <>
      <Article data={article} />
    </>
  );
}

【参考】
・Udemy:【2024年最新】React(v18)完全入門ガイド

c.sakyou

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA