Vercel Doctor

Кеширование

Правила, обнаруживающие паттерны, препятствующие эффективному кешированию на Vercel.

Эти правила выявляют паттерны, которые обходят CDN и ISR-кеширование Vercel, вынуждая к ненужному серверному рендерингу и увеличивая затраты на вычисления.

Поведение с учетом версии

Диагностика кеширования подстраивается под обнаруженную мажорную версию Next.js:

  • Next.js 15: предупреждения подчеркивают, что fetch и GET-обработчики по умолчанию не кешируются.
  • Next.js 16+: предупреждения отдают приоритет рекомендациям по Cache Components ("use cache", теги кеша, целевая ревалидация).
  • Для других/неизвестных версий: предупреждения используют независимые от фреймворка рекомендации по политике кеширования.

nextjs-no-side-effect-in-get-handler

Error · vercel-doctor/nextjs-no-side-effect-in-get-handler

Обнаруживает GET-обработчики маршрутов, содержащие побочные эффекты (изменение cookies, заголовков или обращения к базе данных) или расположенные на мутирующих сегментах маршрутов, таких как /logout, /signout, /delete и т.д.

Почему это важно: GET-запросы могут быть вызваны предзагрузкой и уязвимы к CSRF. Побочные эффекты в GET-обработчиках также препятствуют кешированию.

Bad
// app/api/logout/route.ts
export async function GET() {
  cookies().delete("session");
  return Response.json({ ok: true });
}
Good
// app/api/logout/route.ts
export async function POST() {
  cookies().delete("session");
  return Response.json({ ok: true });
}

Обнаруживаемые мутирующие сегменты маршрутов: logout, log-out, signout, sign-out, unsubscribe, delete, remove, revoke, cancel, deactivate.


vercel-no-force-dynamic

Warning · vercel-doctor/vercel-no-force-dynamic

Обнаруживает страницы с export const dynamic = "force-dynamic".

Почему это важно: force-dynamic принуждает к серверному рендерингу при каждом запросе, полностью обходя кеширование полной страницы.

Bad
export const dynamic = "force-dynamic";

export default function Page() { ... }
Good
export const revalidate = 3600;

export default function Page() { ... }

vercel-no-no-store-fetch

Warning · vercel-doctor/vercel-no-no-store-fetch

Обнаруживает вызовы fetch с cache: "no-store" или revalidate: 0.

Почему это важно: Эти параметры полностью отключают кеширование, увеличивая некешированный трафик и затраты на вычисления при каждом запросе.

Bad
const data = await fetch(url, { cache: "no-store" });
Good
const data = await fetch(url, {
  next: { revalidate: 3600 },
});

vercel-missing-cache-policy

Warning · vercel-doctor/vercel-missing-cache-policy

Обнаруживает GET-обработчики маршрутов без явной конфигурации кеширования — без заголовков Cache-Control, без экспорта revalidate и без экспорта dynamic.

Почему это важно: Без явной политики кеширования ответы могут упускать возможности кеширования на CDN, вызывая повторные обращения к серверу.

Bad
export async function GET() {
  const data = await fetchData();
  return Response.json(data);
}
Good
export const revalidate = 3600;

export async function GET() {
  const data = await fetchData();
  return Response.json(data);
}

vercel-prefer-get-static-props

Warning · vercel-doctor/vercel-prefer-get-static-props

Обнаруживает маршруты Pages Router, использующие getServerSideProps.

Почему это важно: getServerSideProps выполняется при каждом запросе. Переход на getStaticProps (с опциональным ISR) кеширует страницы на CDN и снижает нагрузку на сервер.


vercel-get-static-props-consider-isr

Warning · vercel-doctor/vercel-get-static-props-consider-isr

Обнаруживает getStaticProps без возвращаемого значения revalidate.

Почему это важно: Без revalidate все страницы генерируются во время деплоя. Для больших сайтов это значительно замедляет сборку. ISR генерирует страницы по запросу и кеширует их.

Good
export async function getStaticProps() {
  const data = await fetchData();
  return {
    props: { data },
    revalidate: 3600,
  };
}
Edit on GitHub

Last updated on

On this page