Error: There was an error while hydrating. Because the error happened outside of a Suspense boundary, the entire root will switch to client rendering

Shivan M. —
jump to solution

The Problem

When using Next.js 13 and the App directory, you might encounter the following error when using the <head> tag in your root component:

Error: There was an error while hydrating. Because the error happened outside of a Suspense boundary, the entire root will switch to client rendering

This occurs because Next.js controls the injection of metadata into the <head> tag of the HTML of your page during hydration. By using the <head> tag directly, the server-rendered HTML does not match what is on the client at the time of hydration.

The Solution

In the App Router, use the Metadata API to manage <head> elements. The next/head component does not work in the App Router.

Export a metadata object from your page or layout:

export const metadata = {
  title: "Test Title",
};

export default function Home() {
  return (
    <main>
      <div>
        <h1>Hello World</h1>
      </div>
    </main>
  );
}

For dynamic metadata, use the generateMetadata function:

export async function generateMetadata({ params }) {
  const { slug } = await params;
  return { title: `Page - ${slug}` };
}

Pages Router

If you are using the Pages Router, use the Head component from next/head:

import Head from "next/head";

export default function Home() {
  return (
    <main>
      <Head>
        <title>Test Title</title>
      </Head>
      <div>
        <h1>Hello World</h1>
      </div>
    </main>
  );
}

For additional guidance on fixing hydration errors, see this answer.

Considered "not bad" by 4 million developers and more than 150,000 organizations worldwide, Sentry provides code-level observability to many of the world's best-known companies like Disney, Peloton, Cloudflare, Eventbrite, Slack, Supercell, and Rockstar Games. Each month we process billions of exceptions from the most popular products on the internet.

Sentry