التخزين المؤقت
قواعد تكشف الأنماط التي تمنع التخزين المؤقت الفعّال على 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
vercel-doctor/nextjs-no-side-effect-in-get-handlerيكشف معالجات مسارات GET التي تحتوي آثاراً جانبية (تعديل cookies أو headers أو استدعاءات قاعدة البيانات) أو في أجزاء مسارات متغيرة مثل /logout، /signout، /delete، إلخ.
لماذا يهم: طلبات GET يمكن تفعيلها عبر prefetch وهي عرضة لـ CSRF. الآثار الجانبية في معالجات GET تمنع التخزين المؤقت أيضاً.
// app/api/logout/route.ts
export async function GET() {
cookies().delete("session");
return Response.json({ ok: true });
}// 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
vercel-doctor/vercel-no-force-dynamicيكشف الصفحات ذات export const dynamic = "force-dynamic".
لماذا يهم: force-dynamic يفرض عرضاً جانب الخادم في كل طلب، متجاوزاً تماماً تخزين الصفحة الكاملة مؤقتاً.
export const dynamic = "force-dynamic";
export default function Page() { ... }export const revalidate = 3600;
export default function Page() { ... }vercel-no-no-store-fetch
vercel-doctor/vercel-no-no-store-fetchيكشف استدعاءات fetch مع cache: "no-store" أو revalidate: 0.
لماذا يهم: هذه الخيارات تعطّل التخزين المؤقت بالكامل، مما يزيد العرض الترددي غير المخزّن مؤقتاً وتكاليف الحوسبة في كل طلب.
const data = await fetch(url, { cache: "no-store" });const data = await fetch(url, {
next: { revalidate: 3600 },
});vercel-missing-cache-policy
vercel-doctor/vercel-missing-cache-policyيكشف معالجات مسارات GET دون أي إعداد تخزين مؤقت صريح — لا رؤوس Cache-Control، ولا تصدير revalidate، ولا تصدير dynamic.
لماذا يهم: بدون سياسة تخزين مؤقت صريحة، قد تفوت الاستجابات فرص تخزين CDN مؤقتاً، مسبّبة ضربات أصل متكررة.
export async function GET() {
const data = await fetchData();
return Response.json(data);
}export const revalidate = 3600;
export async function GET() {
const data = await fetchData();
return Response.json(data);
}vercel-prefer-get-static-props
vercel-doctor/vercel-prefer-get-static-propsيكشف مسارات Pages Router التي تستخدم getServerSideProps.
لماذا يهم: getServerSideProps يعمل في كل طلب. التحوّل إلى getStaticProps (مع ISR اختياري) يخزّن الصفحات مؤقتاً عند CDN ويقلّل حوسبة الخادم.
vercel-get-static-props-consider-isr
vercel-doctor/vercel-get-static-props-consider-isrيكشف getStaticProps دون قيمة إرجاع revalidate.
لماذا يهم: بدون revalidate، تُبنى جميع الصفحات عند وقت النشر. للمواقع الكبيرة هذا يُبطئ البناء بشكل كبير. يولّد ISR الصفحات عند الطلب ويخزّنها مؤقتاً.
export async function getStaticProps() {
const data = await fetchData();
return {
props: { data },
revalidate: 3600,
};
}Last updated on