Spec-Zone.ru › Next.js

getStaticProps

Экспорт функции под названием getStaticProps позволит предварительно отрисовать страницу во время сборки, используя свойства, возвращаемые из функции:

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
}

Вы можете импортировать модули в области верхнего уровня для использования в getStaticProps. Используемые импорты не будут включены для клиентской стороны. Это означает, что вы можете писать серверный код непосредственно в getStaticProps, включая загрузку данных из вашей базы данных.

Параметр контекста

Параметр context представляет собой объект, содержащий следующие ключи:

Имя Описание
params Содержит параметры маршрута для страниц, использующих динамические маршруты. Например, если имя страницы [id].js, то params будет выглядеть как { id: ... }. Вы должны использовать это вместе с getStaticPaths, что мы объясним позже.
preview (Устарело для draftMode) preview равно true если страница находится в режиме предварительного просмотра и false в противном случае.
previewData (Устарело для draftMode) Данные предварительного просмотра, установленные setPreviewData.
draftMode draftMode равно true если страница находится в режиме черновика и false в противном случае.
locale Содержит активный язык (если включён).
locales Содержит все поддерживаемые языки (если включён).
defaultLocale Содержит настроенный язык по умолчанию (если включён).
revalidateReason Указывает причину вызова функции. Может быть одной из следующих: «build» (выполняется во время сборки), «stale» (выполняется при истечении срока перегенерации или в режиме разработки), «on-demand» (инициируется через перегенерацию по требованию)

Значения возвращаемые getStaticProps

Функция getStaticProps должна возвращать объект, содержащий либо props, либо redirect, либо notFound, за которым следует необязательное свойство revalidate.

Свойства

Объект props представляет собой пару ключ-значение, где каждое значение принимается компонентом страницы. Он должен быть сериализуемым объектом, чтобы любые переданные свойства могли быть сериализованы с помощью JSON.stringify.

export async function getStaticProps(context) {
  return {
    props: { message: `Next.js is awesome` }, // will be passed to the page component as props
  }
}

Перегенерация

Свойство revalidate указывает количество секунд, по истечении которых может произойти перегенерация страницы (по умолчанию false или перегенерация отсутствует).

// This function gets called at build time on server-side.
// It may be called again, on a serverless function, if
// revalidation is enabled and a new request comes in
export async function getStaticProps() {
  const res = await fetch('https://.../posts')
  const posts = await res.json()
 
  return {
    props: {
      posts,
    },
    // Next.js will attempt to re-generate the page:
    // - When a request comes in
    // - At most once every 10 seconds
    revalidate: 10, // In seconds
  }
}

Дополнительную информацию см. в разделе Инкрементальная статическая перегенерация.

Статус кэша страницы, использующей ISR, можно определить, прочитав значение заголовка ответа x-nextjs-cache. Возможные значения следующие:

  • MISS - путь отсутствует в кэше (встречается не более одного раза, при первом посещении)
  • STALE - путь есть в кэше, но истекло время перегенерации, поэтому он будет обновлён в фоновом режиме
  • HIT - путь есть в кэше и время перегенерации не истекло

notFound

Логическое значение notFound позволяет странице возвращать статус 404 и страницу 404. С notFound: true, страница вернёт 404 даже если ранее была успешно сгенерирована страница. Это предназначено для поддержки таких случаев, как удаление пользователем сгенерированного контента. Обратите внимание, что notFound следует тому же поведению, что и revalidate описанном здесь.

export async function getStaticProps(context) {
  const res = await fetch(`https://.../data`)
  const data = await res.json()
 
  if (!data) {
    return {
      notFound: true,
    }
  }
 
  return {
    props: { data }, // will be passed to the page component as props
  }
}

Важно знать: notFound не требуется для режима fallback: false, так как будут предварительно отрисованы только пути, возвращаемые из getStaticPaths.

redirect

Объект redirect позволяет перенаправлять на внутренние или внешние ресурсы. Он должен соответствовать форме { destination: string, permanent: boolean }.

В некоторых редких случаях может потребоваться назначить пользовательский код состояния для старых HTTP клиентов, чтобы правильно выполнить перенаправление. В таких случаях можно использовать свойство statusCode вместо свойства permanent, но не оба одновременно. Вы также можете установить basePath: false аналогично перенаправлениям в 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 }, // will be passed to the page component as props
  }
}

Если перенаправления известны во время сборки, их следует добавить в next.config.js.

Чтение файлов: Используйте process.cwd()

Файлы можно читать напрямую из файловой системы в getStaticProps.

Для этого необходимо получить полный путь к файлу.

Поскольку Next.js компилирует ваш код в отдельный каталог, вы не можете использовать __dirname , так как возвращаемый им путь будет отличаться от маршрутизатора страниц.

Вместо этого можно использовать process.cwd() , который предоставляет каталог, в котором выполняется Next.js.

import { promises as fs } from 'fs'
import path from 'path'
 
// posts will be populated at build time by getStaticProps()
function Blog({ posts }) {
  return (
    <ul>
      {posts.map((post) => (
        <li>
          <h3>{post.filename}</h3>
          <p>{post.content}</p>
        </li>
      ))}
    </ul>
  )
}
 
// This function gets called at build time on server-side.
// It won't be called on client-side, so you can even do
// direct database queries.
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')
 
    // Generally you would parse/transform the contents
    // For example you can transform markdown to HTML here
 
    return {
      filename,
      content: fileContents,
    }
  })
  // By returning { props: { posts } }, the Blog component
  // will receive `posts` as a prop at build time
  return {
    props: {
      posts: await Promise.all(posts),
    },
  }
}
 
export default Blog

История версий

Версия Изменения
v13.4.0 Маршрутизатор приложений теперь стабилен с упрощённым получением данных
v12.2.0 Инкрементальная статическая перегенерация по требованию стабильна.
v12.1.0 Инкрементальная статическая перегенерация по требованию добавлена (бета).
v10.0.0 Добавлены параметры locale, locales, defaultLocale, и notFound
v10.0.0 Добавлен вариант возврата fallback: 'blocking'
v9.5.0 Стабильная инкрементальная статическая перегенерация
v9.3.0 Введён getStaticProps

© 2024 Vercel, Inc.
Licensed under the MIT License.
https://nextjs.org/docs/pages/api-reference/functions/get-static-props

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API