Next.js SSGビルドサイトで遷移の検知方法とエラーの回避策

ウェブ制作

Next.js で SSG (静的サイト生成) を使用する際、クライアントサイドでのページ遷移や URL のクエリパラメータの変更を検知するために、useSearchParamsusePathname フックを使うことができます。ただし、これらのフックはクライアントサイド専用であるため、SSGやSSRのコンテキストでは注意が必要です。以下では、ページ遷移やクエリパラメータ変更の検知方法と、エラーを回避するための実装について簡潔にまとめます。

クライアントサイドでのページ遷移とパラメータの検知

Next.js の useSearchParamsusePathname を利用して、クエリパラメータやページ遷移を検知できます。これらのフックはクライアントサイドでのみ動作するため、"use client"; を宣言した上で使用します。

"use client";
import React, { useEffect } from "react";
import { useSearchParams, usePathname } from "next/navigation";
import { Suspense } from "react";

const HeaderCore = () => {
  const searchParams = useSearchParams();
  const pathname = usePathname();

  useEffect(() => {
    console.log("パスまたはクエリパラメータの更新を検知:", {
      searchParams: searchParams.toString(),
      pathname: pathname,
    });
  }, [searchParams, pathname]);

  return <div>Header</div>;
};

const Header = () => {
  return (
    <Suspense>
      <HeaderCore />
    </Suspense>
  );
};

export default Header;

説明:

  • useSearchParams: クエリパラメータの変化を検知します。
  • usePathname: ページのパスの変化を監視します。
  • Suspense: クライアントサイドでのレンダリングを待機させる際に使用。これを利用して、静的ビルド時のエラーを回避します。

2. エラー回避

SSG ビルド中に useSearchParams を使用すると、Next.js は「useSearchParams() should be wrapped in a Suspense boundary at page…」というエラーを表示します。これは、クライアントサイド専用のフックが SSG で誤って使用された場合に発生します。

エラー回避の方法

  • Suspense の利用: クライアントサイド専用の部分を Suspense でラップし、ビルド時にサーバーサイドレンダリングされないようにします。これにより、ビルド中のエラーを回避できます。
  • useEffect を使ったクライアントサイドのみの実行: クエリパラメータやパスの監視はクライアントサイドで行われるべき処理なので、useEffect 内で監視処理を行います。

参考ドキュメント

URL: https://nextjs.org/docs/messages/missing-suspense-with-csr-bailout

今回の対処法は Next.jsの 14系での対処法になり、15系では設定ファイルから設定ができます。

タイトルとURLをコピーしました