Capítulo 50 de 456
Adiciona dados estruturados (JSON-LD) às páginas para search engines e IA entenderem o conteúdo além do texto puro, renderizando um <script type="application/ld+json"> diretamente em layout.js/page.js.
JSON.stringify não escapa strings maliciosas; é preciso substituir < por < (ou usar serialize-javascript) para evitar XSS.<script> nativo vs next/script: use <script> nativo para JSON-LD porque next/script é otimizado para JS executável, não para dados estruturados.schema-dts: pacote comunitário para tipar o objeto JSON-LD com TypeScript.// app/products/[id]/page.tsx
export default async function Page({ params }) {
const { id } = await params
const product = await getProduct(id)
const jsonLd = {
'@context': 'https://schema.org',
'@type': 'Product',
name: product.name,
image: product.image,
description: product.description,
}
return (
<section>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{
__html: JSON.stringify(jsonLd).replace(/</g, '\\u003c'),
}}
/>
{/* ... */}
</section>
)
}
< para prevenir XSS via dangerouslySetInnerHTML.import { Product, WithContext } from 'schema-dts'
const jsonLd: WithContext<Product> = {
'@context': 'https://schema.org',
'@type': 'Product',
name: 'Next.js Sticker',
image: 'https://nextjs.org/imgs/sticker.png',
description: 'Dynamic at the speed of static.',
}
schema-dts.JSON.stringify sem sanitização: expõe a aplicação a XSS injection se dados do usuário entrarem no JSON-LD.next/script para JSON-LD: componente errado, pois é otimizado para execução de JS, não dados estruturados.<script type="application/ld+json"> nativo em layout.js/page.js.< (<) no output do JSON.stringify, ou use serialize-javascript.schema-dts para tipagem TypeScript de entidades schema.org.