
در Part 1 دربارهی خودِ caching حرف زدیم و دیدیم ابزارهایی مثل TanStack Query چطور runtime caching رو برای ما هندل میکنن.
اما تو پروژههای واقعی، مشکل معمولاً این نیست که cache نداریم؛
مشکل اینه که نمیدونیم چی رو، کی و تا چه زمانی cache کنیم.
اینجاست که load strategy و expiration وارد بازی میشن.
یکی از اشتباههای رایج اینه که همهچیز رو با هم لود میکنیم،
بعد سعی میکنیم با cache یا memoization اوضاع رو بهتر کنیم.
در حالی که ترتیب درست معمولاً اینه:
اول تصمیم بگیریم چی واقعاً بحرانیه
بعد مشخص کنیم چی میتونه دیرتر بیاد
و در نهایت، برای هرکدوم استراتژی cache تعریف کنیم
Lazy-loading یعنی:
چیزی رو لود نکن، مگر اینکه کاربر واقعاً بهش نیاز داشته باشه.
مثلاً:
یک tab ثانویه
یک modal سنگین
یک صفحهی تنظیمات که شاید ۱۰٪ کاربران ببینن
در SPAها، lazy-loading اگر با cache ترکیب نشه، تبدیل میشه به:
«هر بار دیر لود میشه»
اما وقتی درست استفاده بشه:
بار اول lazy-load
دفعات بعد از cache
و این دقیقاً جاییه که ابزارهایی مثل TanStack Query به ما کمک مکنه.
Preload یعنی:
«میدونم کاربر بهزودی اینو میخواد، بذار زودتر بیارمش»
مثالهای رایج:
دیتای صفحهی بعد از کلیک
اطلاعاتی که بعد از login بلافاصله استفاده میشن
routeهایی که احتمال ورود بهشون بالاست
در این حالت:
preload بدون cache = مصرف بیدلیل شبکه
preload + cache = تجربهی خیلی نرم
یکی از خطرناکترین حالتها:
cache درست کار میکنه، ولی دادهها قدیمیان
اینجاست که مفهوم stale مهم میشه.
در TanStack Query:
داده میتونه cache باشه
ولی stale باشه
و در background آپدیت بشه
مثال ساده:
useQuery(['products'], fetchProducts, { staleTime: 5 * 60 * 1000 })
یعنی:
تا ۵ دقیقه داده «قابل اعتماد» حساب میشه
بعد از اون:
داده سریع از cache نمایش داده میشه
ولی fetch جدید در پسزمینه انجام میشه
این یعنی:
UX سریع
بدون نمایش دیتای خیلی قدیمی
بدون blocking UI
بعضی دادهها رو نمیشه فقط با زمان کنترل کرد.
مثلاً:
بعد از submit فرم
بعد از update پروفایل
بعد از تغییر وضعیت یک entity
اینجا cache باید آگاهانه invalidate بشه
queryClient.invalidateQueries(['user'])
این یعنی:
«میدونم چیزی تغییر کرده، برو دوباره fetch کن»
و این تفاوت بزرگیه بین:
cache تصادفی
cache معماریشده
Performance فقط به cache داشتن نیست
Load strategy (lazy vs preload) به اندازهی cache مهمه
Cache بدون expiration = بدهی فنی
ابزارها مشکل رو حل نمیکنن، تصمیمهای درست حل میکنن
اگر از اول بدونی چی قراره کی استفاده بشه،
caching خودش تبدیل میشه به یک مزیت معماری، نه یک patch.
.