Проблемы при развертывании Next.js в Vercel с помощью #getStaticProps()
Используя Next.js, подключенный к Apollo, у меня есть около 50 нединамических URL-адресов, извлекающих данные с помощью getStaticProps(). Он прекрасно работает, и мне нравится, как загружаются страницы. Проблема, с которой я сталкиваюсь, заключается в том, что, поскольку Vercel создает статические версии этих страниц при сборке, я быстро достигаю пределов скорости для API, используемого на этих страницах, примерно через 40 секунд. построен. Учитывая, что у меня нет контроля над этими ограничениями скорости, есть ли способ ограничить мои вызовы данных в каждом #getStaticProps, чтобы выделить эти вызовы данных во время сборки? Мой #getStaticProps на каждой странице выглядит примерно так:
export async function getStaticProps() {
const apolloClient = initializeApollo()
await apolloClient.query({
query: XXXXXXX,
variables: {handle: "XXXXXXX"}
})
return {
props: {
initialApolloState: apolloClient.cache.extract(),
},
revalidate: 1,
}
}
Все работает нормально, или это было, когда у меня было меньше страниц и не хватало страниц, чтобы достичь предела скорости.
2 ответа
В итоге я ограничил свои запросы на 100 мс, бросив setTimeout с моим запросом внутри обещания. Во время производственной сборки все работало так, как задумано.
const sleep = (milliseconds, apolloClient) => {
return (
new Promise(function(resolve, reject){
setTimeout(() => {
const request = apolloClient.query({
query: XXXXXX,
variables: {handle: "XXXXXX"}
});
resolve(request);
}, milliseconds)
});
)
};
экспортировать асинхронную функцию getStaticProps() {const apolloClient = initializeApollo()
await sleep(200, apolloClient)
return {
props: {
initialApolloState: apolloClient.cache.extract(),
},
revalidate: 1,
}
}
Без какой-либо настройки сборка NextJS попытается выполнить своего рода многопоточность, что приведет к множеству одновременных HTTP-запросов во время сборки и потенциальной перегрузке принимающего сервера. Я не знаю, какая здесь конфигурация по умолчанию и как она зависит от сервера сборки.
Следующая конфигурация NextJS в вашемnext.config.js
заставит процесс сборки быть однопоточным, когда он циклически проходит черезgetStaticProps
иgetStaticPaths
Запросы:
...
experimental: {
workerThreads: false,
cpus: 1
},
...
Вы можете найти дополнительную информацию об этой конфигурации здесь: https://docs.uniform.dev/sitecore/deploy/how-tos/how-to-control-nextjs-threads/
По моему опыту, это должно значительно уменьшить проблемы с ограничением скорости на сервере содержимого.