getStaticPaths
Если страница использует Динамические маршруты и getStaticProps
, она должна определить список путей для статической генерации.
Когда вы экспортируете функцию getStaticPaths
(Статическая генерация сайта) из страницы с динамическими маршрутами, Next.js предварительно отрендерит все пути, указанные в getStaticPaths
.
import type {
InferGetStaticPropsType,
GetStaticProps,
GetStaticPaths,
} from 'next'
type Repo = {
name: string
stargazers_count: number
}
export const getStaticPaths = (async () => {
return {
paths: [
{
params: {
name: 'next.js',
},
}, // См. раздел "paths" ниже
],
fallback: true, // false или "blocking"
}
}) satisfies GetStaticPaths
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
}
export async function getStaticPaths() {
return {
paths: [
{
params: {
name: 'next.js',
},
}, // См. раздел "paths" ниже
],
fallback: true, // false или "blocking"
}
}
export async function getStaticProps() {
const res = await fetch('https://api.github.com/repos/vercel/next.js')
const repo = await res.json()
return { props: { repo } }
}
export default function Page({ repo }) {
return repo.stargazers_count
}
Справочник API getStaticPaths
охватывает все параметры и свойства, которые можно использовать с getStaticPaths
.
Когда следует использовать getStaticPaths?
Используйте getStaticPaths
, если вы статически предварительно рендерите страницы с динамическими маршрутами и:
- Данные поступают из headless CMS
- Данные поступают из базы данных
- Данные поступают из файловой системы
- Данные могут кэшироваться публично (не являются пользовательскими)
- Страница должна быть предварительно отрендерена (для SEO) и быть очень быстрой —
getStaticProps
генерирует файлыHTML
иJSON
, которые могут кэшироваться CDN для повышения производительности
Когда выполняется getStaticPaths
getStaticPaths
выполняется только во время сборки в production и не вызывается во время выполнения. Вы можете проверить, что код внутри getStaticPaths
удаляется из клиентского бандла, с помощью этого инструмента.
Как getStaticProps выполняется относительно getStaticPaths
getStaticProps
выполняется во времяnext build
для всех путей, возвращённых во время сборкиgetStaticProps
выполняется в фоновом режиме при использованииfallback: true
getStaticProps
вызывается перед первоначальным рендерингом при использованииfallback: blocking
Где можно использовать getStaticPaths
getStaticPaths
обязательно должен использоваться сgetStaticProps
- Нельзя использовать
getStaticPaths
сgetServerSideProps
- Можно экспортировать
getStaticPaths
из Динамического маршрута, который также используетgetStaticProps
- Нельзя экспортировать
getStaticPaths
из файла, не являющегося страницей (например, из папкиcomponents
) getStaticPaths
должен экспортироваться как отдельная функция, а не как свойство компонента страницы
Выполняется при каждом запросе в режиме разработки
В режиме разработки (next dev
) getStaticPaths
будет вызываться при каждом запросе.
Генерация путей по требованию
getStaticPaths
позволяет контролировать, какие страницы генерируются во время сборки, а не по требованию с помощью fallback
. Генерация большего количества страниц во время сборки замедлит процесс.
Вы можете отложить генерацию всех страниц по требованию, возвращая пустой массив для paths
. Это особенно полезно при развертывании Next.js-приложения в нескольких средах. Например, можно ускорить сборку, генерируя все страницы по требованию для превью (но не для production-сборок). Это полезно для сайтов с сотнями/тысячами статических страниц.
export async function getStaticPaths() {
// Когда это true (в средах предпросмотра) не
// предварительно рендерить статические страницы
// (быстрее сборка, но медленнее первоначальная загрузка страницы)
if (process.env.SKIP_BUILD_STATIC_GENERATION) {
return {
paths: [],
fallback: 'blocking',
}
}
// Вызов внешнего API для получения постов
const res = await fetch('https://.../posts')
const posts = await res.json()
// Получение путей для предварительного рендеринга на основе постов
// В production-средах предварительно рендерить все страницы
// (медленнее сборка, но быстрее первоначальная загрузка страницы)
const paths = posts.map((post) => ({
params: { id: post.id },
}))
// { fallback: false } означает, что другие маршруты должны возвращать 404
return { paths, fallback: false }
}