كل استراتيجية هي إجابة على سؤال واحد: لما ييجي request، أسأل مين الأول؟ الأرقام على الأسهم هي ترتيب الخطوات.
١. Cache First — التلاجة الأول
- الصفحة ← Service Worker: ١ طلب
- Service Worker ← Cache: ٢ عندك؟
- Cache ← Service Worker: ٣ لقيته ✓ خلاص
- Service Worker ← النت: ٤ مش موجود؟ هاته
- النت ← Service Worker: ٥ احفظه وابعته
- Service Worker ← الصفحة: الرد
لو الملف في الكاش، مفيش نت خالص. أسرع حاجة ممكنة، بس لو الملف اتغير على السيرفر مش هتعرف.
مناسبة لـ: ملفات اسمها فيه hash (app.3f9a1c.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 — المطبخ الأول
- الصفحة ← Service Worker: ١ طلب
- Service Worker ← النت: ٢ هات الجديد
- النت ← Service Worker: ٣ وصل ✓ احفظه
- Service Worker ← Cache: ٤ النت وقع؟
- Cache ← Service Worker: ٥ آخر نسخة
- Service Worker ← الصفحة: الرد
دايمًا بتحاول تجيب الأحدث، والكاش احتياطي. العيب: على نت بطيء المستخدم بيستنى لحد ما الشبكة ترد أو تفشل. حط timeout عشان متستناش للأبد.
مناسبة لـ: داتا لازم تبقى حديثة، زي API الرسايل أو الطلبات.
٣. Stale-While-Revalidate — ادّيله القديم وهات الجديد
- الصفحة ← Service Worker: ١ طلب
- Service Worker ← Cache: ٢ هات اللي عندك
- Cache ← Service Worker: ٣ فورًا
- Service Worker ← الصفحة: ٤ الرد القديم ⚡
- Service Worker ← النت: ٥ في الخلفية: هات الجديد
- النت ← Cache: ٦ حدّث للمرة الجاية
المستخدم بياخد رد فوري من الكاش، وفي نفس اللحظة بنحدّث الكاش من النت. يعني بيشوف الجديد المرة الجاية، مش دلوقتي.
مناسبة لـ: حاجات مش مشكلة لو اتأخرت مرة: الـ avatar، فهرس البحث، الـ config.
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
متدخلش الكاش خالص. لـ POST والدفع والـ login وأي حاجة لازم تبقى لحظية. (الـ SW ممكن ميعملش respondWith أصلًا.)
من الكاش بس، ولو مش موجود يبقى error. لملفات اتحفظت في install وإنت متأكد إنها هناك.
إزاي تختار؟
| نوع الملف | الاستراتيجية | ليه |
|---|---|---|
| JS و CSS باسم فيه hash | Cache First | الاسم بيتغير لو المحتوى اتغير |
| صفحات HTML لمحتوى | Cache First بصلاحية، أو Network First | محتاجة تتحدث بس تفتح offline |
| API داتا متغيرة | Network First + timeout | الأحدث أهم، والكاش احتياطي |
| صور المستخدمين والـ config | Stale-While-Revalidate | السرعة أهم من الحداثة اللحظية |
| POST والدفع | Network Only | ميتكاشش أبدًا |