//
Busque em todas as páginas da documentação
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥
function BlogPost({ post }: { post: { title: string; description: string; author: string } }) {
return (
<article>
{/* Estes são elevados para <head> automaticamente */}
<title>{post.title}</title>
<meta name="description" content={post.description} />
<meta name="author" content={post.author} />
<link rel="canonical" href={`https://example.com/blog/${post.title}`} />
<h1>{post.title}</h1>
<p>{post.description}</p>
</article>
);
}Quando usar isso: Use metadados integrados sempre que um componente precisar definir o título da página, a descrição ou outras tags de head. Isso elimina a necessidade de react-helmet ou efeitos manuais de document.title.
// Um aplicativo multipágina onde cada rota define seus próprios metadados
function ProductPage({ product }: {
product: {
name: string;
description: string;
price: number;
image: string;
category: string;
};
}) {
return (
<main>
{/* Título da página */}
<title>{product.name} | Minha Loja</title>
{/* Tags meta SEO */}
<meta name="description" content={product.description} />
<meta name="keywords" content={`${product.category}, comprar, loja`} />
{/* Tags Open Graph */}
<meta property="og:title" content={product.name} />
<meta property="og:description" content={product.description} />
<meta property="og:image" content={product.image} />
<meta property="og:type" content="product" />
{/* Twitter card */}
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content={product.name} />
<meta name="twitter:image" content={product.image} />
{/* Pré-carregar a imagem do produto */}
<link rel="preload" href={product.image} as="image" />
{/* Stylesheet para esta página */}
<link rel="stylesheet" href="/styles/product.css" precedence="default" />
{/* Conteúdo da página */}
<div className="max-w-4xl mx-auto p-6">
<img src={product.image} alt={product.name} />
<h1 className="text-3xl font-bold">{product.name}</h1>
<p className="text-xl">${product.price.toFixed(2)}</p>
<p>{product.description}</p>
</div>
</main>
);
}
function SettingsPage() {
return (
<div>
<title>Configurações | Minha Loja</title>
<meta name="robots" content="noindex" />
<h1>Configurações da Conta</h1>
{/* ... */}
</div>
);
}
export { ProductPage, SettingsPage };O que isso demonstra:
<title> renderizado inline, automaticamente elevado para <head><link rel="preload"> para otimização de desempenho<link rel="stylesheet"> com precedence para ordenação de CSS<title>, <meta> e <link> quando renderizados dentro de um componente e os eleva para o <head> do documento.<head> inicial do HTML. Durante a navegação do lado do cliente, o React atualiza o <head> adicionando, removendo ou atualizando os elementos elevados.<title> são deduplicadas -- apenas o último <title> renderizado vence se vários componentes renderizarem um.<meta> são deduplicadas pelo atributo name ou property. Duas tags <meta name="description"> de componentes diferentes resultarão em apenas a mais recente.<link rel="stylesheet"> suportam um atributo precedence que controla a ordem de inserção. Folhas de estilo com a mesma precedence são agrupadas. O React também deduplica links de folhas de estilo por href.<link> (preload, icon, canonical, etc.) são elevados, mas não deduplicados por padrão.Título dinâmico com dados ao vivo:
function ChatRoom({ roomName, unreadCount }: { roomName: string; unreadCount: number }) {
const titlePrefix = unreadCount > 0 ? `(${unreadCount}) ` : "";
return (
<div>
<title>{titlePrefix}{roomName} | Chat</title>
<h1>{roomName}</h1>
{/* UI do chat */}
</div>
);
}Componentes aninhados adicionando metadados:
function Layout({ children }: { children: React.ReactNode }) {
return (
<html>
<body>
{/* Metadados base */}
<meta charSet="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="icon" href="/favicon.ico" />
{children}
</body>
</html>
);
}
function AboutPage() {
return (
<Layout>
{/* Metadados específicos da página se misturam com os metadados do layout */}
<title>Sobre Nós</title>
<meta name="description" content="Saiba mais sobre nossa empresa" />
<h1>Sobre Nós</h1>
</Layout>
);
}Ordenação de precedência de folhas de estilo:
function App() {
return (
<>
{/* "default" precedence carrega primeiro */}
<link rel="stylesheet" href="/base.css" precedence="default" />
{/* "high" precedence carrega após "default" */}
<link rel="stylesheet" href="/theme.css" precedence="high" />
</>
);
}
function Widget() {
return (
<>
{/* Mesma precedência agrupa junto com outras folhas de estilo "default" */}
<link rel="stylesheet" href="/widget.css" precedence="default" />
<div>Conteúdo do Widget</div>
</>
);
}<title>, <meta> e <link> usam seus tipos de atributo HTML padrão de React.JSX.IntrinsicElements.precedence em <link> é uma extensão específica do React tipada como string | undefined.<title> -- Apenas o último <title> renderizado é aplicado. Se dois componentes irmãos renderizarem <title>, o resultado depende da ordem de renderização. Correção: Defina <title> em apenas um componente por rota, tipicamente o componente no nível da página.metadata e generateMetadata. Usar ambos e tags <title> inline pode causar duplicatas. Correção: Escolha uma abordagem por projeto. Para aplicativos Next.js, prefira a API metadata do framework.<head> no HTML SSR -- O React eleva tags durante a renderização, mas se você inspecionar a resposta HTML bruta, elas aparecem em <head>. Se ocorrerem incompatibilidades de hidratação, verifique as diferenças entre servidor/cliente. Correção: Garanta que os valores dos metadados sejam determinísticos (sem Date.now() ou Math.random()).<link rel="stylesheet"> sem precedence -- Se você omitir precedence, o link da folha de estilo é tratado como um link regular e não é deduplicado ou ordenado pelo React. Correção: Sempre adicione precedence aos links de folha de estilo para ordenação gerenciada pelo React.<script> -- O React 19 não eleva tags <script> para <head>. Correção: Use preinit de react-dom para scripts, ou coloque tags script em seu template HTML.| Abordagem | Quando escolher |
|---|---|
| Metadados integrados (React 19) | Escolha padrão para novos projetos React 19 |
Exportação metadata do Next.js | Projetos Next.js App Router com metadados estáticos ou dinâmicos |
react-helmet / react-helmet-async | Projetos React 18 ou mais antigos |
document.title manual em useEffect | Hack rápido para alterações de título apenas do lado do cliente |
<head> HTML no template | Metadados estáticos que nunca mudam |
<head> do documento automaticamente<head> adicionando, removendo ou atualizando elementos elevados<title> renderizado é aplicado -- o React os deduplica<title>, o resultado depende da ordem de renderização<title> em apenas um componente por rota, tipicamente o componente no nível da página<meta> são deduplicadas pelo atributo name ou property<meta name="description"> de componentes diferentes resultam em apenas a mais recente<link> (preload, icon, canonical) são elevados, mas não deduplicados por padrãoprecedence controla a ordem de inserção de folhas de estilo no <head>precedence são agrupadashref e suspende a renderização até que a folha de estilo carreguefunction Page({ title, description, image }) {
return (
<>
<meta property="og:title" content={title} />
<meta property="og:description" content={description} />
<meta property="og:image" content={image} />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content={title} />
{/* conteúdo da página */}
</>
);
}function ChatRoom({ roomName, unreadCount }) {
const prefix = unreadCount > 0 ? `(${unreadCount}) ` : "";
return (
<>
<title>{prefix}{roomName} | Chat</title>
{/* UI do chat */}
</>
);
}O título é atualizado reativamente à medida que unreadCount muda.
<meta charSet>, <link rel="icon">) e páginas filhas adicionam tags específicas da página<title> específico da página substitui o do layout se ambos renderizarem um<meta> por name/property garante que não haja duplicatasmetadata e generateMetadata que podem conflitar com tags inline<head>metadata do framework<script> para <head>preinit de react-dom para scripts, ou coloque tags script em seu template HTML<title>, <meta> e <link>precedence, a folha de estilo é tratada como um link regular e não é deduplicada ou ordenada pelo Reactprecedence às folhas de estilo que você deseja que o React gerencieprecedence em <link> é uma extensão específica do React tipada como string | undefined<title>, <meta> e <link> usam seus tipos de atributo HTML padrão de React.JSX.IntrinsicElementsDate.now(), Math.random() ou outros valores não determinísticospreload e preinitRevisado por Chris St. John·Última atualização: 19 de jul. de 2026
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥