الكاش · فصل ٤

استراتيجيات الكاش — الريكوست بيروح فين؟

cache-first · network-first · stale-while-revalidate · network-only · cache-only
🎯 الهدف: تفهم كل استراتيجية بترتيب خطواتها، وتختار المناسبة لكل نوع ملف.

كل استراتيجية هي إجابة على سؤال واحد: لما ييجي request، أسأل مين الأول؟ الأرقام على الأسهم هي ترتيب الخطوات.

١. Cache First — التلاجة الأول

Cache First
  1. الصفحة ← Service Worker: ١ طلب
  2. Service Worker ← Cache: ٢ عندك؟
  3. Cache ← Service Worker: ٣ لقيته ✓ خلاص
  4. Service Worker ← النت: ٤ مش موجود؟ هاته
  5. النت ← Service Worker: ٥ احفظه وابعته
  6. Service Worker ← الصفحة: الرد

لو الملف في الكاش، مفيش نت خالص. أسرع حاجة ممكنة، بس لو الملف اتغير على السيرفر مش هتعرف.

مناسبة لـ: ملفات اسمها فيه hash (app.3f9a1c.js)، والخطوط، والصور اللي مبتتغيرش.

sw.js
async function cacheFirst(request) {  const cached = await caches.match(request);  if (cached) return cached;  const response = await fetch(request);  if (response.ok) {    const cache = await caches.open("assets-v1");    cache.put(request, response.clone()); // clone: الـ body بيتقري مرة واحدة بس  }  return response;}

٢. Network First — المطبخ الأول

Network First
  1. الصفحة ← Service Worker: ١ طلب
  2. Service Worker ← النت: ٢ هات الجديد
  3. النت ← Service Worker: ٣ وصل ✓ احفظه
  4. Service Worker ← Cache: ٤ النت وقع؟
  5. Cache ← Service Worker: ٥ آخر نسخة
  6. Service Worker ← الصفحة: الرد

دايمًا بتحاول تجيب الأحدث، والكاش احتياطي. العيب: على نت بطيء المستخدم بيستنى لحد ما الشبكة ترد أو تفشل. حط timeout عشان متستناش للأبد.

مناسبة لـ: داتا لازم تبقى حديثة، زي API الرسايل أو الطلبات.

٣. Stale-While-Revalidate — ادّيله القديم وهات الجديد

Stale-While-Revalidate
  1. الصفحة ← Service Worker: ١ طلب
  2. Service Worker ← Cache: ٢ هات اللي عندك
  3. Cache ← Service Worker: ٣ فورًا
  4. Service Worker ← الصفحة: ٤ الرد القديم ⚡
  5. Service Worker ← النت: ٥ في الخلفية: هات الجديد
  6. النت ← Cache: ٦ حدّث للمرة الجاية

المستخدم بياخد رد فوري من الكاش، وفي نفس اللحظة بنحدّث الكاش من النت. يعني بيشوف الجديد المرة الجاية، مش دلوقتي.

مناسبة لـ: حاجات مش مشكلة لو اتأخرت مرة: الـ avatar، فهرس البحث، الـ config.

sw.js
async function staleWhileRevalidate(event, request) {  const cache = await caches.open("static-v1");  const cached = await cache.match(request);  const network = fetch(request).then((res) => {    if (res.ok) cache.put(request, res.clone());    return res;  });  if (cached) {    event.waitUntil(network.catch(() => {})); // كمّل التحديث حتى بعد ما رديت    return cached;  }  return network;}

٤ و ٥. Network Only و Cache Only

🌐 Network Only

متدخلش الكاش خالص. لـ POST والدفع والـ login وأي حاجة لازم تبقى لحظية. (الـ SW ممكن ميعملش respondWith أصلًا.)

🧊 Cache Only

من الكاش بس، ولو مش موجود يبقى error. لملفات اتحفظت في install وإنت متأكد إنها هناك.

إزاي تختار؟

نوع الملفالاستراتيجيةليه
JS و CSS باسم فيه hashCache Firstالاسم بيتغير لو المحتوى اتغير
صفحات HTML لمحتوىCache First بصلاحية، أو Network Firstمحتاجة تتحدث بس تفتح offline
API داتا متغيرةNetwork First + timeoutالأحدث أهم، والكاش احتياطي
صور المستخدمين والـ configStale-While-Revalidateالسرعة أهم من الحداثة اللحظية
POST والدفعNetwork Onlyميتكاشش أبدًا

خلّصت الفصل لما

🧠 اختبر نفسك
١) في SWR، المستخدم شاف النسخة الجديدة إمتى؟
المرة الجاية. دلوقتي خد اللي في الكاش، والجديد اتحفظ في الخلفية.
٢) ليه Cache First خطر على ملف اسمه ثابت زي app.js؟
لو اتغير على السيرفر، المستخدم هيفضل شايف القديم للأبد.
٣) ليه cache.put(request, response) من غير clone بيبوّظ الدنيا؟
الـ body stream بيتقري مرة. لو الكاش قراه، الصفحة هتاخد رد فاضي.