Подробности о getStaticProps
Вот важная информация, которую вам следует знать о getStaticProps
.
Запрос к внешнему API или базе данных
В файле lib/posts.js
мы реализовали функцию getSortedPostsData
, которая получает данные из файловой системы. Но вы можете получать данные и из других источников, например, из внешнего API, и это будет работать так же хорошо:
export async function getSortedPostsData() {
// Вместо файловой системы
// получаем данные постов из внешнего API
const res = await fetch('..');
return res.json();
}
Примечание: Next.js предоставляет полифилл для
fetch()
как на клиенте, так и на сервере. Вам не нужно его импортировать.
Вы также можете напрямую запрашивать базу данных:
import someDatabaseSDK from 'someDatabaseSDK'
const databaseClient = someDatabaseSDK.createClient(...)
export async function getSortedPostsData() {
// Вместо файловой системы
// получаем данные постов из базы данных
return databaseClient.query('SELECT posts...')
}
Это возможно, потому что getStaticProps
выполняется только на стороне сервера. Она никогда не выполняется на клиенте и даже не включается в JS-бандл для браузера. Это означает, что вы можете писать код, например, прямые запросы к базе данных, не опасаясь, что они попадут в браузер.
Разработка vs. Продакшен
- В режиме разработки (
npm run dev
илиyarn dev
) функцияgetStaticProps
выполняется при каждом запросе. - В продакшене
getStaticProps
выполняется во время сборки. Однако это поведение можно изменить с помощью ключаfallback
, возвращаемого функциейgetStaticPaths
.
Поскольку функция предназначена для выполнения во время сборки, вы не сможете использовать данные, доступные только во время запроса, такие как параметры запроса или HTTP-заголовки.
Доступно только в страницах
getStaticProps
можно экспортировать только из страницы. Вы не можете экспортировать её из других файлов.
Одно из ограничений связано с тем, что React должен получить все необходимые данные до рендеринга страницы.
Что делать, если данные нужно получать во время запроса?
Поскольку Статическая генерация происходит один раз во время сборки, она не подходит для данных, которые часто обновляются или меняются при каждом запросе пользователя.
В таких случаях, когда данные могут изменяться, вы можете использовать Рендеринг на стороне сервера (SSR). Подробнее о серверном рендеринге мы расскажем в следующем разделе.