DEV Community

Adrián Bailador
Adrián Bailador

Posted on

Metadata and Dynamic Metadata in Next.js

Metadata is information about the data on your web page and is essential for SEO (Search Engine Optimization) and social media sharing.

What is Metadata?

Metadata is data that describes other data. In the context of a web page, metadata is information about the page that is not directly shown to users but can be useful for search engines, browsers, and other technologies.

For example, the title of a web page, its description, the author, keywords, and other similar details are all metadata. These are specified in the <head> of your HTML document using elements like <title>, <meta>, etc.

What is Dynamic Metadata?

Dynamic metadata refers to metadata that changes based on the page's content. For instance, you might have a blog with multiple posts and you want each post to have its own title and description when shared on social media. This can be achieved with dynamic metadata.

Using Metadata and Dynamic Metadata in Next.js

Next.js uses the Head component from next/head to add elements to the <head> of your HTML page. You can use this component to add metadata and dynamic metadata to your pages.

Here's an example of how you can do it:

import Head from 'next/head'

export default function BlogPost({ post }) {
  return (
    <>
      <Head>
        <title>{post.title}</title>
        <meta name="description" content={post.description} />
        <meta property="og:title" content={post.title} />
        <meta property="og:description" content={post.description} />
        <meta property="og:image" content={post.image} />
      </Head>
      <h1>{post.title}</h1>
      <p>{post.content}</p>
    </>
  )
}
Enter fullscreen mode Exit fullscreen mode

In this example, post is an object containing the information of a blog post. The page's metadata is dynamically set based on the properties of post.

Setting Up Dynamic Metadata in Next.js

Setting up dynamic metadata in your Next.js project is quite straightforward. Here is a step-by-step example:

  1. Import the Head component: Next.js provides a Head component that you can use to add elements to the <head> of your HTML document. To use it, you need to import it from next/head in your component file.

    import Head from 'next/head'
    
  2. Use the Head component: You can use the Head component in your component as follows:

    <Head>
      <title>Your title</title>
    </Head>
    

    In this example, we are adding a <title> element to our HTML document.

  3. Add dynamic metadata: To add dynamic metadata, you simply need to pass dynamic data to your Head component. For example, if you are building a blog and want each post to have its own title, you can do it as follows:

    import Head from 'next/head'
    
    export default function BlogPost({ post }) {
      return (
        <>
          <Head>
            <title>{post.title}</title>
            <meta name="description" content={post.description} />
            <meta property="og:title" content={post.title} />
            <meta property="og:description" content={post.description} />
            <meta property="og:image" content={post.image} />
          </Head>
          <h1>{post.title}</h1>
          <p>{post.content}</p>
        </>
      )
    }
    

    In this example, post is an object containing the information of a blog post. The page's metadata is dynamically set based on the properties of post.

Importance of Metadata for SEO and Social Media

Metadata is crucial for both SEO and social media sharing.

  • SEO: Metadata, such as the title and description, is essential for search engines to understand your page's content and display it appropriately in search results.
  • Social Media: Metadata like og:title, og:description, and og:image are important for how your content is displayed when shared on platforms like Facebook and Twitter.

Using Other Types of Metadata

Besides basic metadata, there are other types of metadata that can be useful:

  • Meta Robots: To control how search engines index your page.
  <meta name="robots" content="index, follow" />
Enter fullscreen mode Exit fullscreen mode
  • Meta Viewport: To improve the experience on mobile devices.
  <meta name="viewport" content="width=device-width, initial-scale=1" />
Enter fullscreen mode Exit fullscreen mode
  • Meta Charset: To define the character encoding.
  <meta charset="UTF-8" />
Enter fullscreen mode Exit fullscreen mode

Complete Example of Metadata in Next.js

Here is a more complete example that includes some of the metadata mentioned above:

import Head from 'next/head'

export default function BlogPost({ post }) {
  return (
    <>
      <Head>
        <title>{post.title} | My Blog</title>
        <meta name="description" content={post.description} />
        <meta property="og:title" content={post.title} />
        <meta property="og:description" content={post.description} />
        <meta property="og:image" content={post.image} />
        <meta property="og:type" content="article" />
        <meta property="og:url" content={`https://my-site.com/blog/${post.slug}`} />
        <meta name="twitter:card" content="summary_large_image" />
        <meta name="twitter:title" content={post.title} />
        <meta name="twitter:description" content={post.description} />
        <meta name="twitter:image" content={post.image} />
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <meta charset="UTF-8" />
      </Head>
      <h1>{post.title}</h1>
      <p>{post.content}</p>
    </>
  )
}
Enter fullscreen mode Exit fullscreen mode

Additional Optimisation

  • Previews and Rich Snippets: Consider using structured data (JSON-LD) to improve rich snippets in search results.
  <script type="application/ld+json">
    {`
      {
        "@context": "https://schema.org",
        "@type": "Article",
        "headline": "${post.title}",
        "image": "${post.image}",
        "author": "${post.author}",
        "publisher": {
          "@type": "Organization",
          "name": "My Blog",
          "logo": {
            "@type": "ImageObject",
            "url": "https://my-site.com/logo.png"
          }
        },
        "datePublished": "${post.datePublished}"
      }
    `}
  </script>
Enter fullscreen mode Exit fullscreen mode

Best Practices

  • Avoid Duplication: Ensure you do not duplicate metadata, as this can confuse search engines.
  • Consistency in Metadata: Maintain consistency between the page title and Open Graph and Twitter metadata to ensure a coherent user experience when the content is shared.

Conclusion

Metadata and dynamic metadata are powerful features in Next.js that allow you to optimise your pages for search engines and social media. By understanding how they work and how you can use them in your projects, you can significantly improve the visibility and sharing of your web pages.

Top comments (0)