- بواسطة x32x01 ||
لو إنت بتشتغل على تطوير تطبيقات موبايل أو ويب، أكيد قابلتك فكرة Caching قبل كده. بس فيه استراتيجية مهمة وناس كتير مش بتطبّقها صح، وهي Stale While Revalidate - SWR.
والحقيقة إنها واحدة من أقوى الطرق اللي بتخلي المستخدم يحس إن تطبيقك سريع وخفيف و"راسي على رجله"
تعالى بقى نشرح الموضوع بطريئة بسيطة ومصرية كده، ونشوف SWR بتشتغل إزاي وليه بنستخدمها في الأساس.
ليه بنستخدم SWR أصلاً؟
الفكرة الأساسية من SWR هي إنها:- تعرض للمستخدم بيانات قديمة Cached بسرعة فورية
- وفي نفس الوقت تجيب نسخة جديدة من السيرفر في الخلفية
- وبعد كده تحدّث البيانات لو فيه اختلاف
يعني المستخدم بيشوف المحتوى في أقل من ثانية، من غير لودينج ولا "شغلانة"، وبرضه بياخد أحدث بيانات من غير ما يحس بأي تأخير.
وده بالظبط اللي بتعمله منصات كبيرة زي Facebook و Instagram و YouTube.
الفكرة العامة للاستراتيجية
خليني أبسطهالك:
أول ما المستخدم يفتح التطبيق:
التطبيق ياخد البيانات اللي كانت متخزنة في الذاكرة Cache ويعرضها فورًا.
في الخلفية:
بيتم الاتصال بالسيرفر علشان يجيب Fresh Data.
بعد استلام البيانات من السيرفر:
لو البيانات القديمة هي هي الجديدة → مفيش حاجة تتغيرلو البيانات مختلفة →
- نعرض البيانات الجديدة للمستخدم
- نحدّث الـ Cache علشان المرة الجاية التطبيق يبقى أسرع
إن المستخدم يحس إن التطبيق سريع جدًا حتى لو الإنترنت ضعيف أو البطء من السيرفر نفسه
مثال واقعي: تطبيق تعليم بيعرض دروس
تخيل إن عندك تطبيق بيدرّس كورسات، وفيه قائمة الدروس.الحالة الطبيعية:
لو مفيش Cache ⇒ المستخدم كل مرة هيفتح يشوف لودينجمع SWR:
التطبيق أول ما يفتح يعرض آخر نسخة محفوظة من الدروس فورًاوفي الخلفية يشيّك لو فيه دروس جديدة.
لو لقى دروس جديدة
كود بسيط يوضّح الفكرة باستخدام JavaScript
وده مثال بسيط بكود مناسب لتطبيقات الويب: JavaScript:
async function fetchWithSWR(key, fetcher) {
// 1) رجع البيانات اللي في الكاش لو موجودة
const cached = localStorage.getItem(key);
if (cached) {
console.log("Showing cached data...");
renderUI(JSON.parse(cached));
}
// 2) هات البيانات الجديدة من السيرفر
const freshData = await fetcher();
// 3) لو مختلفة عن الكاش → حدّث الشاشة والكاش
if (JSON.stringify(freshData) !== cached) {
console.log("Updating fresh data...");
renderUI(freshData);
localStorage.setItem(key, JSON.stringify(freshData));
}
}
// مثال على استخدام الدالة
fetchWithSWR("lessons", () =>
fetch("https://myapp.com/api/lessons").then(res => res.json())
); يعرض بيانات قديمة، يجيب بيانات جديدة، ولو فيه اختلاف يحدّث الواجهة والكاش.
ليه SWR بتفرق في الأداء؟
سرعة عرض المحتوى
المستخدم بيشوف الحاجة فورًا → بدون لودينج → تجربة استخدام ممتازة
استهلاك أقل للإنترنت
مش بيجيب بيانات من السيرفر كل ثانية.
تقليل الضغط على API
سيرفرك مش بيتعب، خصوصًا لو عندك آلاف المستخدمين.
مناسب لتطبيقات فيها بيانات بتتغير
زي:- تطبيقات تعليم
- سوشيال ميديا
- Dashboards
- Apps فيها Lists كتير
تجربة فيسبوك كمثال
فيسبوك بيطبق SWR مليون مرة في الثانية تقريبًا.تفتح التطبيق؟
تلاقي البوستات بتظهر فورًا…
بعد ثواني تلاقي فيه بوست جديد طلع فوق!
وده SWR شغال في الخلفية
SWR مع React و Next.js
لو شغال React يبقى مكتبة SWR الرسمية هتسهل حياتك بطريقة مش طبيعية.مثال بسيط:
JavaScript:
import useSWR from 'swr';
const fetcher = (url) => fetch(url).then((res) => res.json());
export default function Lessons() {
const { data, error } = useSWR('/api/lessons', fetcher);
if (error) return <div>Error loading data ❌</div>;
if (!data) return <div>Loading...</div>;
return (
<ul>
{data.map((lesson) => (
<li key={lesson.id}>{lesson.title}</li>
))}
</ul>
);
}
طب إمتى ما نستخدمش SWR؟
مش مناسب لو البيانات:- لازم تكون Real-time جدًا
- أو البيانات حساسة ولازم دايمًا تتحدّث فورًا
- أو أول مرة بتعرض البيانات ومفيش Cache
SWR ممتازة حرفيًا في 90% من الحالات
خلاصة الكلام
SWR مش مجرد طريقة Caching، دي استراتيجية كاملة علشان تخلي التطبيق:- أسرع
- أخف
- أذكى
- أقل استهلاكًا للإنترنت
- وأكثر راحة للمستخدم
هتلاقي التطبيق “طار” في الأداء