0Pricing
Frontend Academy · درس

استراتيجيات التخزين المؤقت دون اتصال: CacheFirst وNetworkFirst

نفّذ استراتيجية Cache-First للأصول الثابتة وNetwork-First لاستجابات API باستخدام Cache API ومكتبة Workbox

استراتيجيات التخزين المؤقت دون اتصال: CacheFirst وNetworkFirst درس مجاني في Frontend Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Frontend Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Frontend Academy 4 دروس في المجموع.

أهمية استراتيجيات التخزين المؤقت

يمكن لـ Service Workers اعتراض كل عملية fetch، لكنكم تحتاجون إلى استراتيجية. فالمحتوى المختلف يحتاج إلى قواعد مختلفة: ينبغي تخزين الشعار مؤقتًا إلى الأبد، وينبغي أن تكون استجابة API حديثة دائمًا، بينما تستفيد المقالات الإخبارية من استراتيجية stale-while-revalidate.

واجهة Cache API

تستخدم Service Workers واجهة Cache API، وهي مخزن أزواج من Request ← Response بنظام مفتاح وقيمة، ويكون نطاقها محددًا لكل origin. وتبقى محفوظة بين الجلسات.

// open a cache:
const cache = await caches.open('v1');

// add resources:
await cache.add('/styles.css');
await cache.addAll(['/', '/app.js', '/styles.css']);

// look up:
const response = await cache.match('/styles.css');

// delete:
await cache.delete('/styles.css');

التخزين المؤقت أولًا

تحققوا من الذاكرة المؤقتة أولًا. إذا وُجدت الاستجابة، فأعيدوها. وإذا لم توجد، فانتقلوا إلى الشبكة ثم خزّنوا الاستجابة. الأفضل لـ: الأصول الثابتة والخطوط والشعارات وapp shell.

self.addEventListener('fetch', (event) => {
  event.respondWith(
    caches.match(event.request).then(cached => {
      if (cached) return cached;
      return fetch(event.request).then(res => {
        const clone = res.clone();
        caches.open('v1').then(c => c.put(event.request, clone));
        return res;
      });
    })
  );
});

الشبكة أولًا

جرّبوا الشبكة أولًا. إذا فشل الاتصال (عند عدم الاتصال)، فانتقلوا إلى الذاكرة المؤقتة. الأفضل لـ: استدعاءات API والمحتوى الديناميكي الذي تكون حداثته أهم من سرعته.

self.addEventListener('fetch', (event) => {
  event.respondWith(
    fetch(event.request).then(res => {
      const clone = res.clone();
      caches.open('api-v1').then(c => c.put(event.request, clone));
      return res;
    }).catch(() => caches.match(event.request))
  );
});

قديم ثم إعادة التحقق

أعيدوا المحتوى المخزّن مؤقتًا فورًا (بسرعة)، ثم اجلبوا المحتوى في الخلفية وحدّثوا الذاكرة المؤقتة للاستخدام التالي. الأفضل لـ: الصور الرمزية والمقالات الإخبارية والبيانات الحديثة جزئيًا.

self.addEventListener('fetch', (event) => {
  event.respondWith(
    caches.match(event.request).then(cached => {
      const network = fetch(event.request).then(res => {
        caches.open('v1').then(c => c.put(event.request, res.clone()));
        return res;
      });
      return cached || network;
    })
  );
});

الشبكة فقط

تجاوزوا الذاكرة المؤقتة بالكامل، وانتقلوا دائمًا إلى الشبكة. استخدموا ذلك للطلبات غير القابلة للتخزين المؤقت، مثل نقاط نهاية المصادقة والتحليلات والتعديلات.

self.addEventListener('fetch', (event) => {
  if (event.request.url.includes('/api/auth')) {
    event.respondWith(fetch(event.request));
    return;
  }
  // ... other strategies
});

الذاكرة المؤقتة فقط

لا تنتقلوا إلى الشبكة مطلقًا، بل أعيدوا المحتوى المخزّن مؤقتًا أو أبلغوا عن فشل العملية. يفيد ذلك للملفات التي خُزنت مسبقًا ولا تريدون تحديثها أثناء الجلسة.

استراتيجيات Workbox

تضمّن Workbox جميع الاستراتيجيات في صورة أصناف مُسمّاة، ما يقلل الكود التمهيدي.

import { registerRoute } from 'workbox-routing';
import { CacheFirst, NetworkFirst, StaleWhileRevalidate } from 'workbox-strategies';

registerRoute(({ request }) => request.destination === 'image',
  new CacheFirst({ cacheName: 'images' })
);

registerRoute(({ url }) => url.pathname.startsWith('/api/'),
  new NetworkFirst({ cacheName: 'api', networkTimeoutSeconds: 3 })
);

registerRoute(({ request }) => request.destination === 'document',
  new StaleWhileRevalidate({ cacheName: 'pages' })
);

انتهاء صلاحية التخزين المؤقت

تنمو ذاكرات التخزين المؤقت إلى الأبد ما لم تضعوا حدودًا لها. توفّر Workbox إضافة ExpirationPlugin.

import { ExpirationPlugin } from 'workbox-expiration';

new CacheFirst({
  cacheName: 'images',
  plugins: [new ExpirationPlugin({
    maxEntries: 50,
    maxAgeSeconds: 30 * 24 * 60 * 60 // 30 days
  })]
});

الاستجابات القابلة للتخزين المؤقت

تخزّن المتصفحات استجابات 200 فقط افتراضيًا. تجاوزوا استجابات 4xx و5xx والاستجابات المعتمة (cross-origin no-cors) لتجنب ملء الذاكرة المؤقتة بالأخطاء.

صفحة بديلة عند عدم الاتصال

اعرضوا صفحة ودية عند عدم الاتصال عندما يفشل الانتقال، فهذا يوفر تجربة استخدام أفضل من خطأ المتصفح الافتراضي.

self.addEventListener('install', (e) => {
  e.waitUntil(caches.open('offline').then(c => c.add('/offline.html')));
});

self.addEventListener('fetch', (e) => {
  if (e.request.mode === 'navigate') {
    e.respondWith(
      fetch(e.request).catch(() => caches.match('/offline.html'))
    );
  }
});

اختيار الاستراتيجية المناسبة

الأصول الثابتة (الشعار والخط وCSS): التخزين المؤقت أولًا. بيانات API (ملف المستخدم والتغذية): الشبكة أولًا. المحتوى الذي يحتاج إلى حداثة متقطعة (الصور الرمزية والأخبار): قديم ثم إعادة التحقق. المصادقة: الشبكة فقط. الملفات الثابتة المثبّتة مسبقًا: الذاكرة المؤقتة فقط.

تحقق سريع

ما استراتيجية التخزين المؤقت الأنسب لملف CSS نادر التغيير، لكنه يجب أن يُحمّل بسرعة؟

مراجعة: استراتيجيات التخزين المؤقت

التخزين المؤقت أولًا: الأصول الثابتة (الأسرع، لكنها قديمة). الشبكة أولًا: بيانات API (الأحدث، لكنها أبطأ). قديم ثم إعادة التحقق: عرض المحتوى المخزّن مؤقتًا مع الجلب في الخلفية. الشبكة فقط: المصادقة والتعديلات. الذاكرة المؤقتة فقط: app shell المثبّت مسبقًا. استخدموا Workbox لتقليل الكود التمهيدي. ضعوا حدودًا لانتهاء الصلاحية. أضيفوا صفحة بديلة عند عدم الاتصال. اختاروا الاستراتيجية حسب نوع المورد.

الأسئلة الشائعة

هل درس «استراتيجيات التخزين المؤقت دون اتصال: CacheFirst وNetworkFirst» مجاني؟

نعم — نص درس «استراتيجيات التخزين المؤقت دون اتصال: CacheFirst وNetworkFirst» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Frontend Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Frontend Academy 4 دروس في المجموع.

ماذا ستتعلم في «استراتيجيات التخزين المؤقت دون اتصال: CacheFirst وNetworkFirst»؟

نفّذ استراتيجية Cache-First للأصول الثابتة وNetwork-First لاستجابات API باستخدام Cache API ومكتبة Workbox تتمرن على Frontend Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Frontend Academy؟

لا تُشترط خبرة سابقة. Frontend Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «استراتيجيات التخزين المؤقت دون اتصال: CacheFirst وNetworkFirst»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Frontend Academy هذا؟

نعم. كل درس في Frontend Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. بيان تطبيق الويب
  2. تسجيل Service Worker ودورة حياته
  3. استراتيجيات التخزين المؤقت دون اتصال: CacheFirst وNetworkFirst
  4. الإشعارات الفورية
← العودة إلى Frontend Academy