Проблемы при развертывании 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/

По моему опыту, это должно значительно уменьшить проблемы с ограничением скорости на сервере содержимого.

Другие вопросы по тегам