Next.js / المتقدم: أنماط المخبأ والدورة وأدلة الإصدار / الدرس 13
Cache Components كنمط بديل صريح
قيم التخزين والجلب الجزئي الاختياريين منفصلين عن النمط التقليدي الأساسي للمقرر.
في هذه الصفحة
أهداف الدرس
- اشرح use cache وcacheLife وcacheTag ضمن نطاقها المضبوط.
- وضح افتراضات هوية الطلب والتسلسل والمخزن المشترك.
يغير تبديل النمط عقد التصيير
يفعل هذا الدرس وحده نموذج Cache Components الموصوف في توثيق Next 16.4 المراجع. لا تنسخ توجيهاته للنمط السابق وتفترض تطابق السلوك. يجمع العمل المخزن وغلافاً محضراً وتدفقاً وقت الطلب مع نطاقات صريحة. يطلب الضبط الحالي اختيار partialPrefetching صراحة؛ احتفظ بالإعداد واختباره لأن القيود بإصدار. لا يفوض الغلاف الأسرع وضع الخاص بمشترك أو حذف السياسة. يجب أن يراجع التغيير كعقد تصيير جديد لا تحسين إعداد صغير، فقد يغير توقيت طلب البيانات وما يبقى محفوظاً لدى المتصفح أثناء التنقل.
استعمل العلامات الحالية كضبط معزول واحد
الجزء next.config.ts بديلة لا إضافة للأساسي. يتطلب التوثيق Node.js لـCache Components ولا يدعم إبقاء تصدير runtime للمقطع بهذا النمط. ليست أعلام PPR أو dynamicIO القديمة بدائل متبادلة. لم يفحص الضبط بحزمة مثبتة أو يبن. تحقق من التصحيح والنشر قبل التفعيل، وافصل إرشادات التقليدي خصوصاً عند نقل force-dynamic وrevalidate وخيارات الجلب التي كانت سياسة التطبيق. لا يعني نجاح JSON تشبه الضبط قبول TypeScript أو أن منصة الاستضافة تملك مخزناً يوافق عقد الديمومة المطلوب.
import type {NextConfig} from "next";
const config:NextConfig={cacheComponents:true,partialPrefetching:true};
export default config;
يحل هذا الضبط محل الأساسي للمقارنة فقط ولم يطبق أو يفحص ببناء.
مرر قيماً فعلية مقصودة إلى نطاق قابل للتخزين
يجب أن تكون دوال ومكونات use cache غير متزامنة وفق الواجهة المراجعة. اقرأ cookies أو headers خارج نطاق التخزين المعتاد، ثم مرر قيماً معتمدة كمعاملات بدلاً من قراءة حالة الطلب ضمنياً داخله. توضع cacheLife داخل النطاق لتحديد سياسة الحداثة، وتربط cacheTag البيانات بمفردات الإبطال. قد تستخدم دالة فهرس عام سياسة مشتركة مقصودة، لكن الدالة المخصصة لمستخدم يجب أن تراعي هويته والبيانات المسموح بكشفها له. يفترض المثال مساعد مصدر لا يعيد إلا البيانات العامة، ولا يتضمن سراً أو حالة مصادقة. لا يستبدل التسلسل أو التخزين التحقق من المصدر. ويجب إثبات معنى «عام» في عقد المساعد، لا افتراضه من اسم الدالة أو العلامة.
import {cacheLife,cacheTag} from "next/cache";
export async function publicCourseList(locale:string) {
"use cache";
cacheLife("minutes");
cacheTag("public-courses");
return readValidatedPublicCourses(locale);
}
يفترض المساعد العام وتحقق اللغة ولم يترجم التوجيه أو ينفذ العمر والعلامة.
نمذج أهلية مدخل المخبأ دون تقليد المترجم
يسمح الشرط بنطاق عام معلن ولغتين للدالة المشتركة. لا ينفذ مفتاح المترجم أو التسلسل أو الخصوصية أو مخزناً بعيداً، بل يفحص شرط العمل قبل المشاركة. قد تكون الذاكرة خاصة بمثيل وعابرة فلا تستنتج ديمومة بين الطلبات أو النشر من التوجيه. للبدائل البعيدة والخاصة عقود منصة وخصوصية خارج المثال تحتاج إرشاداً ودليلاً مستقلين. يظل التحقق من هذا الشرط مهماً حتى لو ولّد الإطار مفتاحاً صحيحاً، لأن مفتاحاً صحيحاً لبيانات أعلنت عامة خطأ لا يمنع كشفها للجمهور غير المناسب.
function shareable(scope,locale) {return scope === "public" && ["en","ar"].includes(locale);}
console.assert(shareable("public","ar"));
console.assert(!shareable("principal:p1","ar"));
console.assert(!shareable("public","unknown"));
ينجح العام المعلن بلغة مدعومة فقط دون اختبار مفتاح أو مخزن Cache Components.
تحقق من أجزاء وقت الطلب وسلوك التنقل المحفوظ
تحتاج مناطق الطلب غير المخزنة تصميم Suspense والانتظار الموثق. قد يغير الجلب الجزئي المسبق البيانات المعدة، ويغير حفظ نشاط المكونات عمر الحالة وEffects. اختبر الواجهة والحداثة والرجوع والحساب والإبطال فعلياً ولا تستنتجها من الموجه التقليدي. ينفذ المقرر الشرط فقط دون ضبط أو مترجم أو تحضير أو مخزن أو نشاط متصفح. احفظ القيود قبل التكييف واستخدم تصحيحات مدعومة؛ المثال بإصدار لا وعد بسلوك مستقبلي دائم. تساعد المقارنة على اختيار خطة انتقال لا خلط خيارات قد يقبلها نمط ويرفضها الآخر.
الأخطاء الشائعة وإصلاحها
تضاف use cache دون ضبط الميزة المختارة
- لماذا يحدث؟
- افترض أن التوجيه يثبت نموذج التصيير المطلوب تلقائياً.
- كيف تصلحه؟
- فعل النمط الحالي الموثق وافحص إعداده كوحدة واحدة.
- كيف تتجنب تكراره؟
- احفظ عينات بناء وسلوك للإصدار الدقيق.
يقرأ نطاق مشترك سلطة الطلب ضمنياً
- لماذا يحدث؟
- أخفيت هوية مشتقة من الطلب داخل دالة مشتركة.
- كيف تصلحه؟
- اقرأ بيانات الطلب خارج النطاق ومرر مدخلات صريحة معتمدة.
- كيف تتجنب تكراره؟
- اختبر المستدعي الشخصي والعام بصورة منفصلة.
تسمى نتيجة ذاكرة تخزيناً مشتركاً دائماً
- لماذا يحدث؟
- لم يتحقق من موضع المخبأ وعمره في النشر.
- كيف تصلحه؟
- راجع معالج المخبأ الفعلي وحدود المثيل والنشر.
- كيف تتجنب تكراره؟
- افصل فحص المفتاح المحلي عن استمرار المخزن.
اختبر فهمك
1. هل تثبت cacheLife("minutes") بقاء المدخل بعد استبدال العملية؟
اعرض الحل المشروح
لا. تصف سياسة حداثة داخل نطاق مخبأ مضبوط، وتبقى جهة التخزين والمشاركة وهوية النشر عقوداً أخرى. قد تزول الذاكرة أبكر، ويحتاج المعالج البعيد تحققاً خاصاً. لا تجعل ملف العمر ادعاء ديمومة أو نسخة احتياطية.
2. لماذا يفصل هذا النمط عن الدروس التقليدية؟
اعرض الحل المشروح
تختلف العلامات وضبط المسار وقواعد الطلب والتنقل والمخبأ. قد ينتج الخلط إعداداً غير مدعوم أو افتراض حداثة خاطئاً. اختر نمطاً دقيقاً واحفظ مراجعه وافحص البناء والطلب والمتصفح قبل انتقال حقيقي.
أهم ما تعلمته
- Cache Components عقد تصيير مضبوط منفصل.
- تحتاج قابلية التخزين الصريحة جمهوراً ومسؤولية مخزن.