Open1

【Next.js/React】Hydration Error が起きる理由と解決方法について

まさぴょんまさぴょん

Hydration Error:CSRとSSRのRenderデータなどが一致していないことによるError

詳しい説明は、こちらの記事などをご参照ください🙏

https://zenn.dev/luvmini511/articles/71f65df05716ca

根本対応 (プロジェクト全体で、SSRを無効化する)

NoSSRWrapper Componentを作成する

app/src/components/no-ssr/NoSSRWrapper.tsx
import { Fragment, ReactNode } from "react";

export const NoSSRWrapper = ({ children }: { children: ReactNode }) => {
  return <Fragment>{children}</Fragment>;
};

_app.tsxを SSR 無効化Componentでラップする

app/src/pages/_app.tsx
import "@/styles/globals.css"; // Tailwind CSS を適用する
import type { AppProps } from "next/app";
import dynamic from "next/dynamic";

const NoSSRWrapper = dynamic(
  () =>
    import("@/components/no-ssr/NoSSRWrapper").then((mod) => mod.NoSSRWrapper),
  {
    ssr: false,
  }
);

const App = ({ Component, pageProps }: AppProps) => {
  return (
    // SSR 無効化するコンポーネントでラップする
    <NoSSRWrapper>
      <Component {...pageProps} />
    </NoSSRWrapper>
  );
};

export default App;

単一ページ対応

dynamicを使用する

  • 単一ページのComponentをDynamic importとする。
const SampleComponent = dynamic(
  () =>
    import("@/components/no-ssr/NoSSRWrapper").then((mod) => mod.SampleComponent),
  {
    ssr: false,
  }
);

use client

// ファイルの先頭に記載する
"use client";

window Objectの状態でSSR Errorを回避する

  // SSR Error 回避
  if (typeof window === "undefined") {
    return null;
  }

参考・引用

https://zenn.dev/luvmini511/articles/71f65df05716ca

https://qiita.com/ryota_seto/items/efc0831a4dc005850344

https://qiita.com/P-man_Brown/items/ccc956da6b0b00815ddd