Vercel Doctor

التخزين المؤقت

قواعد تكشف الأنماط التي تمنع التخزين المؤقت الفعّال على Vercel.

تكشف هذه القواعد الأنماط التي تتجاوز تخزين CDN و ISR المؤقت لـ Vercel، وتفرض عرضاً جانب الخادم غير ضروري وزيادة تكاليف الحوسبة.

سلوك واعٍ بالإصدار

تتكيف تشخيصات التخزين المؤقت مع الإصدار الرئيسي المكتشف من Next.js:

  • Next.js 15: تؤكد التحذيرات أن fetch و GET handlers غير مخزنة مؤقتًا افتراضيًا.
  • Next.js 16+: تعطي التحذيرات الأولوية لإرشادات Cache Components ("use cache"، cache tags، targeted revalidation).
  • الإصدارات الأخرى/غير المعروفة: تستخدم التحذيرات إرشادات سياسات cache غير المرتبطة بإطار عمل معيّن.

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

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

يكشف معالجات مسارات GET التي تحتوي آثاراً جانبية (تعديل cookies أو headers أو استدعاءات قاعدة البيانات) أو في أجزاء مسارات متغيرة مثل /logout، /signout، /delete، إلخ.

لماذا يهم: طلبات GET يمكن تفعيلها عبر prefetch وهي عرضة لـ 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