ذاكرة Apollo المؤقتة: التطبيع والتحديثات
افهم InMemoryCache المطبّعة في Apollo، وحدّث البيانات المخزنة مؤقتًا بعد عمليات Mutation دون إعادة الجلب
ذاكرة Apollo المؤقتة: التطبيع والتحديثات درس مجاني في React Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في React Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة React Academy 4 دروس في المجموع.
كيف يطبّع InMemoryCache البيانات
يخزّن InMemoryCache كل كائن باستخدام مفتاح ذاكرة تخزين مؤقت يتكوّن من __typename وid، مثل: User:1 وPost:42. عندما يعيد أحد الاستعلامات User بالمعرّف "1"، يُخزَّن الكائن مرة واحدة تحت هذا المفتاح، بغضّ النظر عن عدد الاستعلامات المختلفة التي تتضمّنه.
يقرأ أي استعلام لاحق يجلب User:1 البيانات من إدخال ذاكرة التخزين المؤقت نفسه، ما يضمن أن جميع المكوّنات ترى البيانات ذاتها.
التحديثات التلقائية بين الاستعلامات
عندما تعيد عملية mutation كائن User:1 محدَّثًا، يكتبه Apollo في إدخال User:1 في ذاكرة التخزين المؤقت. يعكس كل استعلام نشط تضمّن User:1 الحقول المحدَّثة تلقائيًا في واجهة المستخدم، من دون أي تعليمات برمجية إضافية.
يُعدّ هذا الانتشار التلقائي الميزة الأساسية لذاكرة التخزين المؤقت المُطبَّعة مقارنةً بذاكرة تخزين مؤقت مستندة إلى المستندات (ومفاتيح الاستعلامات).
cache.readQuery
يقرأ النتيجة الحالية المخزّنة مؤقتًا لاستعلام: يعيد cache.readQuery({ query: GET_USERS }) كائن البيانات كما لو أن useQuery أعاده. ويعيد null إذا لم يكن الاستعلام موجودًا في ذاكرة التخزين المؤقت.
استخدم readQuery داخل دوال update الخاصة بعملية mutation لقراءة القائمة الحالية قبل تعديلها.
cache.writeQuery
يكتب cache.writeQuery({ query: GET_USERS, data: { users: updatedUsers } }) مباشرةً في ذاكرة التخزين المؤقت، ما يؤدي إلى إعادة التصيير في جميع المكوّنات التي تقرأ GET_USERS. لا يُرسل أي طلب إلى الشبكة.
اجمع بين readQuery وwriteQuery لتنفيذ تحديثات غير قابلة للتغيير لذاكرة التخزين المؤقت: اقرأ، وأنشئ مصفوفة جديدة، ثم اكتبها مجددًا.
cache.modify لتحديث الكيانات مباشرةً
يعدّل cache.modify({ id: cache.identify(user), fields: { name: () => 'New Name' } }) حقول كيان محدّد في ذاكرة التخزين المؤقت مباشرةً. لا حاجة إلى قراءة استعلام أولًا عندما تعرف معرّف الكيان في ذاكرة التخزين المؤقت.
يربط كائن fields أسماء الحقول بدوال تعديل تتلقى القيمة الحالية وتعيد القيمة الجديدة.
تحديث ذاكرة التخزين المؤقت بعد عملية mutation
مرّر دالة update إلى useMutation: useMutation(ADD_POST, { update(cache, { data: { addPost } }) { cache.modify({ id: cache.identify(user), fields: { posts: existingPosts => [...existingPosts, addPost] } }); } }).
تضيف هذه العملية المنشور الجديد إلى مصفوفة منشورات المستخدم المخزّنة مؤقتًا، فتحدّث جميع المكوّنات التي تعرض قائمة منشورات المستخدم.
cache.evict: إزالة إدخالات ذاكرة التخزين المؤقت
تزيل cache.evict({ id: 'User:1' }) إدخال User:1 من ذاكرة التخزين المؤقت. سيعيد أي استعلام نشط تضمّن User:1 التصيير مع غياب ذلك الكيان من النتيجة.
بعد إزالة الإدخالات، استدعِ cache.gc() لإزالة أي كائنات لم يعد بالإمكان الوصول إليها من استعلامات الجذر. يمنع ذلك تسرّبات الذاكرة في التطبيقات طويلة التشغيل.
جمع البيانات غير المستخدمة
يجتاز cache.gc() رسم ذاكرة التخزين المؤقت بدءًا من جميع الاستعلامات النشطة، ويزيل أي كيانات لم يعد بالإمكان الوصول إليها. من الآمن استدعاؤه دوريًا أو بعد عمليات mutation دفعيّة تحذف عددًا كبيرًا من الكيانات.
لا تُجمَع البيانات المهملة للكيانات التي تشير إليها خطافات useQuery النشطة مطلقًا؛ الذي يُجمع فقط هو الكيانات孤ولة التي لم تعد جزءًا من نتيجة أي استعلام.
إعادة توجيه ذاكرة التخزين المؤقت باستخدام سياسات الحقول
إذا أجريت استعلامًا عن كيان واحد (GET_USER باستخدام id) وكان هذا الكيان مخزّنًا مؤقتًا بالفعل كجزء من استعلام قائمة، يستطيع Apollo قراءته من ذاكرة التخزين المؤقت من دون طلب ذهاب وإياب إلى الشبكة، وذلك باستخدام سياسات الحقول: keyArgs ودوال read في سياسة النوع.
تعيد دالة read مرجعًا إلى ذاكرة التخزين المؤقت: return toReference({ __typename: 'User', id: args.id })، وبذلك تُخبر Apollo بقراءة البيانات من إدخال User:id الموجود في ذاكرة التخزين المؤقت.
حقول keyFields المخصّصة للمعرّفات غير القياسية
إذا كانت الكيانات لديك تستخدم حقلًا غير id كمفتاح فريد لها، مثل slug أو uuid، فاضبطه في سياسة النوع: new InMemoryCache({ typePolicies: { Post: { keyFields: ['slug'] } } }).
يستخدم Apollo بعد ذلك Post:my-post-slug كمفتاح لذاكرة التخزين المؤقت بدلًا من اشتراط وجود حقل id، وبذلك يحافظ على التطبيع للمخططات غير القياسية.
refetchQueries أم دالة update
يؤدي refetchQueries: [{ query: GET_USERS }] ضمن خيارات useMutation إلى إعادة جلب الاستعلام من الشبكة بعد اكتمال عملية mutation. هذا الخيار أبسط، لكنه يرسل دائمًا طلبًا إلى الشبكة.
تعدّل دالة update ذاكرة التخزين المؤقت محليًا وتتجنب طلب ذهاب وإياب إلى الشبكة. استخدم refetchQueries عندما تكون منطقية تحديث ذاكرة التخزين المؤقت معقّدة، أو عندما تجعل الحقول التي يحسبها الخادم تحديثات ذاكرة التخزين المؤقت المحلية غير موثوقة.
مفتاح التطبيع في InMemoryCache
ما تنسيق مفتاح ذاكرة التخزين المؤقت الافتراضي الذي يستخدمه InMemoryCache لتخزين الكيانات؟
مراجعة الدرس
يطبّع InMemoryCache الكيانات باستخدام __typename+id، ما يتيح التحديثات التلقائية بين الاستعلامات. اقرأ واكتب في ذاكرة التخزين المؤقت باستخدام cache.readQuery وcache.writeQuery وcache.modify. أزل الكيانات باستخدام cache.evict ثم cache.gc. اضبط حقول المفاتيح المخصّصة عبر typePolicies للمفاتيح الأساسية غير المعتمدة على id.
استخدم دوال update الخاصة بعمليات mutation لتحقيق كفاءة محلية في ذاكرة التخزين المؤقت، واستخدم refetchQueries عندما تجعل الحقول التي يحسبها الخادم التحديثات المحلية غير موثوقة.
الأسئلة الشائعة
هل درس «ذاكرة Apollo المؤقتة: التطبيع والتحديثات» مجاني؟
نعم — نص درس «ذاكرة Apollo المؤقتة: التطبيع والتحديثات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة React Academy، انتقل إلى CoddyKit PRO. تتضمن دورة React Academy 4 دروس في المجموع.
ماذا ستتعلم في «ذاكرة Apollo المؤقتة: التطبيع والتحديثات»؟
افهم InMemoryCache المطبّعة في Apollo، وحدّث البيانات المخزنة مؤقتًا بعد عمليات Mutation دون إعادة الجلب تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ React Academy؟
لا تُشترط خبرة سابقة. React Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «ذاكرة Apollo المؤقتة: التطبيع والتحديثات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس React Academy هذا؟
نعم. كل درس في React Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أساسيات GraphQL لمطوّري React
- إعداد Apollo Client في React
- Hooks: useQuery وuseMutation
- ذاكرة Apollo المؤقتة: التطبيع والتحديثات