Nextjs does not allow defining the metadata object in client components. There are a couple of ways to resolve this problem. I will be talking about two of them here.
In case you aren’t aware of this, the new metadata object looks like below:
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "",
description: "",
};
Now, the most obvious way would be to extract the code that needs client components and put it another file. This way you can remove the "use client"
from your page.tsx
file and put it in your new file where you have the extracted code.
But if you’re not willing to do this for whatever reason, an easier way would be to just place a simple layout.tsx
file in the same directory as your page.tsx
.
I am sharing a sample layout.tsx
file from one of my projects:
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Black Friday Deals 2024 - macOS apps",
description: "A directory of macOS apps that are free or 50% off for a limited time.",
};
export default function BfdLayout({
children,
}: {
children: React.ReactNode
}) {
return (
<>
{children}
</>
)
}
The above approach doesn’t need you to modify your page.tsx
.