Introducción/Guías/JSON-LD

Cómo implementar JSON-LD en tu aplicación Next.js

JSON-LD es un formato para datos estructurados que pueden ser utilizados por motores de búsqueda e inteligencia artificial para ayudarles a entender la estructura de la página más allá del contenido puro. Por ejemplo, puedes usarlo para describir una persona, un evento, una organización, una película, un libro, una receta y muchos otros tipos de entidades.

Nuestra recomendación actual para JSON-LD es renderizar los datos estructurados como una etiqueta <script> en tus componentes layout.js o page.js.

El siguiente fragmento utiliza JSON.stringify, que no sanitiza cadenas maliciosas usadas en inyección XSS. Para prevenir este tipo de vulnerabilidad, puedes limpiar etiquetas HTML del payload JSON-LD, por ejemplo, reemplazando el carácter < con su equivalente unicode, \u003c.

Revisa el enfoque recomendado por tu organización para sanitizar cadenas potencialmente peligrosas, o usa alternativas mantenidas por la comunidad para JSON.stringify como serialize-javascript.

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>
      {/* Add JSON-LD to your page */}
      <script
        type="application/ld+json"
        dangerouslySetInnerHTML={{
          __html: JSON.stringify(jsonLd).replace(/</g, '\\u003c'),
        }}
      />
      {/* ... */}
    </section>
  )
}

Puedes validar y probar tus datos estructurados con la Prueba de Resultados Enriquecidos para Google o el Validador de Marcado Schema genérico.

Puedes tipar tu JSON-LD con TypeScript usando paquetes de la comunidad como schema-dts:

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.',
}