Fundamentos do Next.js 15

0/26 aulas0%
teoria

Metadata e SEO para suas Aplicações Next.js

Aprenda sobre metadata e seo para suas aplicações next.js

30 min
Aula 4 de 5

🚀 Metadata e SEO para suas Aplicações Next.js

Olá! 👋 Nesta aula, vamos mergulhar em um tópico crucial para o sucesso de qualquer aplicação web: Metadata e SEO (Search Engine Optimization). Em Next.js 15, a gestão de metadados é poderosa e integrada, permitindo que você controle como suas páginas aparecem nos resultados de busca e nas redes sociais.

1. Introdução: Por que Metadata e SEO são Essenciais?

Imagine que você criou um site incrível, mas ninguém consegue encontrá-lo no Google ou quando compartilha um link no Twitter. Frustrante, certo? É aí que a metadata e o SEO entram em jogo!

Metadata são dados sobre dados. No contexto web, são informações sobre sua página que não são visíveis diretamente para o usuário, mas são lidas por navegadores, motores de busca (como Google, Bing) e plataformas de redes sociais (como Facebook, Twitter).

SEO é o processo de otimizar seu site para que ele apareça em posições mais altas nos resultados de busca. Uma boa metadata é a base de um SEO eficaz.

Em Next.js, você pode gerenciar metadados de forma declarativa, tanto estaticamente quanto dinamicamente, garantindo que seu conteúdo seja bem compreendido e ranqueado pelos motores de busca.

2. Explicação Detalhada: Gerenciando Metadata no Next.js

Next.js 15 oferece duas maneiras principais de lidar com metadados no App Router:

  1. Configuração de Metadata Baseada em Objeto: Exporte um objeto metadata de um arquivo layout.js ou page.js. Ideal para metadados estáticos ou que não dependem de dados assíncronos.
  2. Configuração de Metadata Baseada em Função: Exporte uma função generateMetadata de um arquivo layout.js ou page.js. Perfeita para metadados que precisam ser gerados dinamicamente, buscando dados de APIs ou bancos de dados.

Ambos os métodos são executados no servidor, o que significa que os metadados são incluídos no HTML inicial enviado ao navegador, tornando-os acessíveis para crawlers de motores de busca desde o início. 🧠

2.1. Metadata Estática com o Objeto metadata

Você pode exportar um objeto metadata de qualquer arquivo layout.js ou page.js. O Next.js combina esses objetos, priorizando os metadados definidos em níveis mais específicos (por exemplo, page.js sobrescreve layout.js).

Vamos ver um exemplo básico:

// app/layout.tsx
import type { Metadata } from 'next';
 
export const metadata: Metadata = {
  title: 'Next.js 15 - Fundamentos',
  description: 'Aprenda os fundamentos do Next.js 15 com este curso completo.',
  keywords: ['Next.js', 'React', 'JavaScript', 'Web Development', 'SEO'],
  authors: [{ name: 'Seu Nome', url: 'https://seusite.com' }],
  creator: 'Seu Nome',
  publisher: 'Sua Empresa',
  openGraph: {
    title: 'Fundamentos do Next.js 15',
    description: 'Aprenda os fundamentos do Next.js 15 com este curso completo.',
    url: 'https://seusite.com',
    siteName: 'Next.js Curso',
    images: [
      {
        url: 'https://seusite.com/og-image.jpg', // Must be an absolute URL
        width: 800,
        height: 600,
        alt: 'Banner do Curso Next.js',
      },
      {
        url: 'https://seusite.com/og-image-alt.jpg', // Optional: provide an alternative image
        width: 1800,
        height: 1600,
        alt: 'Banner alternativo',
      },
    ],
    locale: 'pt_BR',
    type: 'website',
  },
  twitter: {
    card: 'summary_large_image',
    title: 'Fundamentos do Next.js 15',
    description: 'Aprenda os fundamentos do Next.js 15 com este curso completo.',
    site: '@seutwitter',
    creator: '@seutwitter',
    images: ['https://seusite.com/twitter-image.jpg'], // Must be an absolute URL
  },
};
 
export default function RootLayout({
  children,
}: {
  children: React.ReactNode;
}) {
  return (
    <html lang="pt-BR">
      <body>{children}</body>
    </html>
  );
}

Neste layout.tsx, definimos metadados globais para todo o site. Agora, se tivermos uma página específica, podemos sobrescrever ou adicionar metadados:

// app/sobre/page.tsx
import type { Metadata } from 'next';
 
export const metadata: Metadata = {
  title: 'Sobre Nós - Next.js Curso', // Sobrescreve o título global
  description: 'Conheça a equipe por trás do curso de Next.js 15.', // Sobrescreve a descrição global
  // Outros metadados podem ser adicionados aqui e serão mesclados com os do layout
};
 
export default function AboutPage() {
  return (
    <main>
      <h1>Sobre Nós</h1>
      <p>Detalhes sobre a nossa história e missão.</p>
    </main>
  );
}

Propriedades Comuns do Objeto metadata:

  • title: O título da página que aparece na aba do navegador e nos resultados de busca. Pode ser um string ou um objeto { default: string; template: string; } para títulos dinâmicos.
  • description: Uma breve descrição da página, usada por motores de busca.
  • keywords: Palavras-chave relevantes para o conteúdo da página.
  • authors: Informações sobre os autores da página.
  • openGraph: Metadados para o protocolo Open Graph (Facebook, LinkedIn, etc.). Inclui title, description, url, images, type, locale, etc.
  • twitter: Metadados específicos para o Twitter Cards. Inclui card, title, description, site, creator, images.
  • icons: Configuração de favicons e ícones de toque para diferentes dispositivos.
  • viewport: Meta tag para controle do viewport em dispositivos móveis.
  • themeColor: Cor do tema para a barra de endereço do navegador.
  • robots: Controla o comportamento dos crawlers (ex: noindex, nofollow).
  • alternates: Define URLs canônicas e versões alternativas de idioma.

2.2. Metadata Dinâmica com a Função generateMetadata

Para páginas que dependem de dados externos (como uma página de produto com ID dinâmico, um post de blog, etc.), você precisa gerar metadados dinamicamente. A função generateMetadata é uma função async que pode buscar dados e retornar um objeto metadata.

Ela recebe os mesmos props que os Server Components (params e searchParams).

// app/produtos/[slug]/page.tsx
import type { Metadata } from 'next';
 
// Simula uma função de busca de dados
async function getProduct(slug: string) {
  // Em uma aplicação real, você buscaria dados de um banco de dados ou API
  const products = {
    'nextjs-course': {
      name: 'Curso de Next.js 15 Avançado',
      description: 'Aprenda a construir aplicações Next.js escaláveis e performáticas.',
      price: 'R$ 997,00',
      image: 'https://seusite.com/product-nextjs-course.jpg',
    },
    'react-fundamentals': {
      name: 'Fundamentos de React',
      description: 'Domine os conceitos essenciais do React para iniciar sua jornada.',
      price: 'R$ 497,00',
      image: 'https://seusite.com/product-react-fundamentals.jpg',
    },
  };
  return products[slug as keyof typeof products] || null;
}
 
export async function generateMetadata({ params }: { params: { slug: string } }): Promise<Metadata> {
  const product = await getProduct(params.slug);
 
  if (!product) {
    return {
      title: 'Produto Não Encontrado',
      description: 'O produto que você está procurando não existe.',
    };
  }
 
  return {
    title: product.name,
    description: product.description,
    openGraph: {
      title: product.name,
      description: product.description,
      images: [{ url: product.image }],
    },
    // Adicione mais metadados dinâmicos aqui
  };
}
 
export default async function ProductPage({ params }: { params: { slug: string } }) {
  const product = await getProduct(params.slug);
 
  if (!product) {
    return (
      <main>
        <h1>Produto Não Encontrado</h1>
        <p>Desculpe, o produto que você está procurando não foi encontrado.</p>
      </main>
    );
  }
 
  return (
    <main>
      <h1>{product.name}</h1>
      <p>{product.description}</p>
      <img src={product.image} alt={product.name} width={400} />
      <p>Preço: {product.price}</p>
    </main>
  );
}

Neste exemplo, a função generateMetadata busca os detalhes do produto com base no slug da URL e usa essas informações para construir o title, description e openGraph dinamicamente. Isso é crucial para SEO, pois cada página de produto terá metadados únicos e relevantes. ✨

2.3. Outros Arquivos Relacionados a SEO

Embora não sejam metadados diretamente no HTML, estes arquivos são fundamentais para o SEO e podem ser facilmente gerenciados no Next.js:

  • robots.txt: Este arquivo informa aos motores de busca quais partes do seu site eles podem ou não rastrear. Você pode colocá-lo diretamente na pasta public/.

    # public/robots.txt
    User-agent: *
    Allow: /
    Sitemap: https://seusite.com/sitemap.xml
  • sitemap.xml: Um sitemap lista todas as páginas do seu site que você deseja que os motores de busca rastreiem. Isso ajuda a garantir que todas as suas páginas importantes sejam indexadas. Você pode gerar um sitemap dinamicamente no Next.js usando uma rota API ou um arquivo sitemap.ts no App Router.

    // app/sitemap.ts
    import { MetadataRoute } from 'next';
     
    export default function sitemap(): MetadataRoute.Sitemap {
      return [
        {
          url: 'https://seusite.com',
          lastModified: new Date(),
          changeFrequency: 'yearly',
          priority: 1,
        },
        {
          url: 'https://seusite.com/sobre',
          lastModified: new Date(),
          changeFrequency: 'monthly',
          priority: 0.8,
        },
        {
          url: 'https://seusite.com/blog',
          lastModified: new Date(),
          changeFrequency: 'weekly',
          priority: 0.5,
        },
        // Adicione mais URLs aqui, talvez de forma dinâmica
      ];
    }

    Este arquivo é um Server Component e gera o sitemap.xml automaticamente em tempo de build ou em tempo de requisição.

3. Código de Exemplo Oficial (Adaptado)

Os exemplos acima são baseados na documentação oficial do Next.js. Eles demonstram as duas abordagens principais para gerenciamento de metadados.

Para mais detalhes e todas as opções de configuração, consulte a Documentação Oficial de Metadata do Next.js.

4. Desafios Conceituais 🧠

Como esta é uma aula teórica, vamos pensar em alguns cenários para solidificar seu entendimento:

  1. Cenário de Blog: Você está criando um blog com Next.js. Como você configuraria os metadados para:

    • A página inicial do blog (ex: /blog)?
    • Uma postagem individual do blog (ex: /blog/meu-primeiro-post) que tem título, descrição, autor e imagem de capa únicos, todos vindos de um CMS (Content Management System)?
    • O que você usaria para o title e description da página inicial, e o que usaria para as postagens individuais?
  2. Prioridade de Metadados: Se você definir um title no app/layout.tsx e outro title no app/produtos/[slug]/page.tsx, qual deles terá precedência? Por quê?

  3. Open Graph vs. Twitter Cards: Qual é a principal diferença entre as propriedades openGraph e twitter no objeto metadata? Por que é importante configurar ambos?

  4. robots.txt e sitemap.xml: Qual a função de cada um desses arquivos no contexto de SEO? Em que situações você usaria noindex no seu robots.txt ou na meta tag robots?

5. Resumo e Próximos Passos

Nesta aula, exploramos a importância da metadata e do SEO para suas aplicações Next.js. Vimos como o Next.js 15 oferece ferramentas poderosas para gerenciar metadados:

  • export const metadata = {}: Para metadados estáticos e globais, ou para sobrescrever metadados em páginas específicas.
  • export async function generateMetadata() {}: Para metadados dinâmicos que dependem de dados assíncronos.
  • A importância de arquivos como robots.txt e sitemap.xml para a comunicação com motores de busca.

Dominar a gestão de metadados é fundamental para garantir que suas aplicações Next.js sejam descobertas, bem ranqueadas e apresentadas de forma profissional em qualquer plataforma.

Próximos Passos:

  • Experimente! Crie um novo projeto Next.js e configure metadados estáticos e dinâmicos.
  • Valide seus Metadados: Use ferramentas como o Facebook Sharing Debugger ou o Twitter Card Validator para testar como suas páginas aparecem nas redes sociais.
  • Aprofunde-se em SEO: Explore mais sobre Structured Data (JSON-LD), que pode ser adicionado diretamente ao seu componente, e outras técnicas avançadas de SEO.
  • Performance: Lembre-se que um site rápido e responsivo também é um fator crucial para o SEO.

Até a próxima aula! 🚀

© 2025 Escola All Dev. Todos os direitos reservados.

Metadata e SEO para suas Aplicações Next.js - Fundamentos do Next.js 15 | escola.all.dev.br