getStaticProps

Exportar una función llamada getStaticProps generará previamente una página en tiempo de compilación usando las props devueltas por la función:

import type { InferGetStaticPropsType, GetStaticProps } from 'next'

type Repo = {
  name: string
  stargazers_count: number
}

export const getStaticProps = (async (context) => {
  const res = await fetch('https://api.github.com/repos/vercel/next.js')
  const repo = await res.json()
  return { props: { repo } }
}) satisfies GetStaticProps<{
  repo: Repo
}>

export default function Page({
  repo,
}: InferGetStaticPropsType<typeof getStaticProps>) {
  return repo.stargazers_count
}

Puedes importar módulos en el ámbito de nivel superior para usar en getStaticProps. Las importaciones no se incluirán en el paquete para el lado del cliente. Esto significa que puedes escribir código del lado del servidor directamente en getStaticProps, incluyendo la obtención de datos desde tu base de datos.

Parámetro context

El parámetro context es un objeto que contiene las siguientes claves:

NombreDescripción
paramsContiene los parámetros de ruta para páginas que usan rutas dinámicas. Por ejemplo, si el nombre de la página es [id].js, entonces params se verá como { id: ... }. Debes usar esto junto con getStaticPaths, que explicaremos más adelante.
preview(Obsoleto en favor de draftMode) preview es true si la página está en Modo de Vista Previa y false en caso contrario.
previewData(Obsoleto en favor de draftMode) Los datos de vista previa establecidos por setPreviewData.
draftModedraftMode es true si la página está en Modo Borrador y false en caso contrario.
localeContiene la configuración regional activa (si está habilitada).
localesContiene todas las configuraciones regionales soportadas (si está habilitado).
defaultLocaleContiene la configuración regional predeterminada configurada (si está habilitada).
revalidateReasonProporciona una razón por la cual se llamó a la función. Puede ser uno de: "build" (ejecutado en tiempo de compilación), "stale" (el período de revalidación expiró, o se ejecuta en modo desarrollo), "on-demand" (activado mediante revalidación bajo demanda)

Valores de retorno de getStaticProps

La función getStaticProps debe devolver un objeto que contenga props, redirect o notFound seguido de una propiedad opcional revalidate.

props

El objeto props es un par clave-valor, donde cada valor es recibido por el componente de página. Debe ser un objeto serializable para que cualquier prop pasado pueda ser serializado con JSON.stringify.

export async function getStaticProps(context) {
  return {
    props: { message: `Next.js es increíble` }, // se pasará al componente de página como props
  }
}

revalidate

La propiedad revalidate es la cantidad en segundos después de la cual puede ocurrir una regeneración de página (por defecto es false o sin revalidación).

// Esta función se llama en tiempo de compilación en el lado del servidor.
// Puede llamarse nuevamente, en una función serverless, si
// la revalidación está habilitada y llega una nueva solicitud
export async function getStaticProps() {
  const res = await fetch('https://.../posts')
  const posts = await res.json()

  return {
    props: {
      posts,
    },
    // Next.js intentará regenerar la página:
    // - Cuando llegue una solicitud
    // - Como máximo una vez cada 10 segundos
    revalidate: 10, // En segundos
  }
}

Aprende más sobre Regeneración Estática Incremental.

El estado de caché de una página que utiliza ISR puede determinarse leyendo el valor del encabezado de respuesta x-nextjs-cache. Los valores posibles son los siguientes:

  • MISS - la ruta no está en la caché (ocurre como máximo una vez, en la primera visita)
  • STALE - la ruta está en la caché pero excedió el tiempo de revalidación, por lo que se actualizará en segundo plano
  • HIT - la ruta está en la caché y no ha excedido el tiempo de revalidación

notFound

El booleano notFound permite que la página devuelva un estado 404 y una Página 404. Con notFound: true, la página devolverá un 404 incluso si hubo una página generada exitosamente antes. Esto está diseñado para admitir casos de uso como contenido generado por usuarios que es eliminado por su autor. Nota: notFound sigue el mismo comportamiento de revalidate descrito aquí.

export async function getStaticProps(context) {
  const res = await fetch(`https://.../data`)
  const data = await res.json()

  if (!data) {
    return {
      notFound: true,
    }
  }

  return {
    props: { data }, // se pasará al componente de página como props
  }
}

Nota importante: notFound no es necesario para el modo fallback: false ya que solo las rutas devueltas por getStaticPaths se generarán previamente.

redirect

El objeto redirect permite redirigir a recursos internos o externos. Debe coincidir con la forma { destination: string, permanent: boolean }.

En algunos casos raros, es posible que necesites asignar un código de estado personalizado para que los clientes HTTP antiguos redirijan correctamente. En estos casos, puedes usar la propiedad statusCode en lugar de la propiedad permanent, pero no ambas. También puedes establecer basePath: false similar a las redirecciones en next.config.js.

export async function getStaticProps(context) {
  const res = await fetch(`https://...`)
  const data = await res.json()

  if (!data) {
    return {
      redirect: {
        destination: '/',
        permanent: false,
        // statusCode: 301
      },
    }
  }

  return {
    props: { data }, // se pasará al componente de página como props
  }
}

Si las redirecciones son conocidas en tiempo de compilación, deben agregarse en next.config.js en su lugar.

Lectura de archivos: Usa process.cwd()

Los archivos se pueden leer directamente del sistema de archivos en getStaticProps.

Para hacer esto, debes obtener la ruta completa a un archivo.

Dado que Next.js compila tu código en un directorio separado, no puedes usar __dirname ya que la ruta que devuelve será diferente del Enrutador de Páginas.

En su lugar, puedes usar process.cwd() que te da el directorio donde se está ejecutando Next.js.

import { promises as fs } from 'fs'
import path from 'path'

// posts se llenará en tiempo de compilación por getStaticProps()
function Blog({ posts }) {
  return (
    <ul>
      {posts.map((post) => (
        <li>
          <h3>{post.filename}</h3>
          <p>{post.content}</p>
        </li>
      ))}
    </ul>
  )
}

// Esta función se llama en tiempo de compilación en el lado del servidor.
// No se llamará en el lado del cliente, por lo que incluso puedes hacer
// consultas directas a la base de datos.
export async function getStaticProps() {
  const postsDirectory = path.join(process.cwd(), 'posts')
  const filenames = await fs.readdir(postsDirectory)

  const posts = filenames.map(async (filename) => {
    const filePath = path.join(postsDirectory, filename)
    const fileContents = await fs.readFile(filePath, 'utf8')

    // Generalmente analizarías/transformarías el contenido
    // Por ejemplo, puedes transformar markdown a HTML aquí

    return {
      filename,
      content: fileContents,
    }
  })
  // Al devolver { props: { posts } }, el componente Blog
  // recibirá `posts` como prop en tiempo de compilación
  return {
    props: {
      posts: await Promise.all(posts),
    },
  }
}

export default Blog

Historial de versiones

VersiónCambios
v13.4.0App Router ahora es estable con una obtención de datos simplificada
v12.2.0Regeneración Estática Incremental bajo demanda es estable.
v12.1.0Se agregó Regeneración Estática Incremental bajo demanda (beta).
v10.0.0Se agregaron las opciones locale, locales, defaultLocale y notFound.
v10.0.0Se agregó la opción de retorno fallback: 'blocking'.
v9.5.0Estable Regeneración Estática Incremental
v9.3.0Se introdujo getStaticProps.

On this page