Назначение функции getStaticPaths
- создать список путей, для которых stati c HTML будет отображаться во время сборки. Например, для списка из 10 сообщений вы можете заранее сгенерировать 10 posts/[id]
маршрутов, если знаете идентификатор сообщений.
Как getStaticPaths
работает с маршрутами Dynami c подробнее ..
Предположим, у вас есть динамический c маршрут /posts/[postId]
, если вы решите использовать генерацию stati c, вам нужно сгенерировать список путей, которые будут включать postId
в качестве параметра маршрута, и для каждого возвращаемого пути будет вызываться функция getStaticProps
для запроса данных во время сборки. Например,
// for /post/[postId]
export const getStaticPaths = async () => {
// if you know all the postId ahead of time
const paths = [
{ params: { postId: '1234' } }, // keep in mind postId has to be a string
{ params: { postId: '3792' } },
{ params: { postId: '1749' } },
]
return {
paths,
fallback: false // we are disabling fallback because we know all the paths ahead of time
}
}
// for each path returned getStaticProps will be called at build time
export const getStaticProps = async (context) => {
// you have access to the postId params that you returns from
// getStaticPaths here
const postId = context.params.postId
// now you can query the data from postId and return as props
return {
props: // queried data
}
}
Если fallback
установлен на false
any для любого пути маршрута, который не возвращается из функции, getStaticPaths
next js просто отобразит страницу ошибки 404
.
Как использовать fallback: true
для генерации c страниц для параметров маршрута, заранее неизвестных
Если вы знаете некоторые postId
сообщений и данные для posts
меняются не очень часто, вы можете выбрать создание страниц со свойством fallback
, установленным на true
, что будет отображать резервную версию страницы для путей, которые не возвращаются из функции getStaticPaths
. И при запросе следующей страницы js вызовет getStaticProps
и отправит данные как JSON, которые будут использоваться для отображения страницы в браузере. Например,
// for /post/[postId]
export const getStaticPaths = async () => {
// you can get how many ever postIds are know ahead of time
// and return as paths with fallback set to true
const posts = // queried data from db or fetched from remote API
const paths = posts.map(post => { params:{ postId: post.id.toString() }})
return {
paths,
fallback: true
}
}
// in your page Component check for fallback and render a loading indicator
import { useRouter } from 'next/router';
const MyPage = (props) => {
// before you do anything
const router = useRouter();
if (router.isFallback) {
return <div>Loading....</div>
}
// rest of your page logic
}
Если ваши данные очень динамичны c, допустим, они меняются каждые 30 минут или час или около того. Вы можете использовать рендеринг на стороне сервера, который будет fetch
данных для каждого запроса, но TTFB (время до первого байта) будет выше. Например,
// for /post/[postId]
export const getServerSideProps = async (context) => {
// you also have access to the param postId from the context
const postId = context.params.postId
// query the data based on the postId and return as props
return {
props: // queried data
}
}
Имейте в виду, что если вы выберете go с getServerSideProps
, функция будет вызываться для каждого запроса, поэтому время до первого байта будет больше.
В зависимости от сценариев использования вы также можете использовать генерацию stati c с получением данных на стороне клиента, используя swr
из следующего js team repo link .