هنوز به کتابخونهٔ مدیریت State نیاز داریم؟
خلاصهٔ کاملتر
نویسنده تعریف میکنه که تو ضبط یه قسمت پادکست با دن آبراموف، سازندهٔ Redux، وسط گفتوگو شنیده که کتابخونههای مدیریت State دیگه ضروری نیستن و اولش جا خورده — ولی بعد از کمی فکر، منطقی به نظرش اومده. استدلال اینه که ما این کتابخونهها رو آوردیم تا جلوی رندرهای اضافیِ Context رو بگیریم، در حالی که چیزی که واقعاً میخوایم دقت بیشتر تو مدیریت خودِ State ـه.
به گفتهٔ نویسنده، اول باید State رو تفکیک کرد: وضعیت UI مثل باز بودن مودال با useState، وضعیت سرور بهعنوان کش دادههای بکاند با TanStack Query، وضعیت URL با ابزارهایی مثل Nuqs، و وضعیت سراسریِ تقریباً ثابت مثل تم و زبان با Context. چیزی که میمونه یه برش کوچیکه: state مشترک و پیچیدهٔ سمت کلاینت. سؤال مقاله اینه که آیا برای همون یه برش هم هنوز کتابخونه لازمه یا نه.
بعد میره سراغ مکانیزمها. Redux در اصل یه فروشگاه pub/sub ـه که یه قانون بهش اضافه شده: تغییر state فقط از راه reducer. مزیت این کار، سریالایزپذیریِ اکشنهاست؛ همینه که DevTools و سفر در زمان رو ممکن میکنه. عیبش هم بویلرپلیت معروفشه — یه بولین ساده چهار فایل میخواست — که Redux Toolkit با createSlice جمعش کرده. Zustand همون مکانیزمه منهای قراردادها: setState جای dispatch و reducer میشینه، پس نه لاگ اکشن داری نه سفر در زمان، در عوض کل کتابخونه حدود یک کیلوبایت فشردهست.
Jotai مسیر رو برعکس میره: بهجای یه فروشگاه بزرگ که ازش برش برمیداری، اتمهای کوچیک داری که از پایین به بالا ترکیب میشن. جالب اینجاست که خودِ اتم هیچ state ای نگه نمیداره و فقط یه شیء پیکربندیه:
export function atom(read) {
if (typeof read === 'function') {
return { read };
}
return { init: read };
}مقدارها جای دیگهای زندگی میکنن: توی یه WeakMap داخل استور که کلیدش خودِ شیء اتمه. همین یه حرکت، مشکل قدیمی Recoil رو حل کرده؛ اونجا هر اتم باید یه کلید رشتهای یکتا میداشت که بین باندلهای code-split و تستها با هم تداخل پیدا میکرد (متا توسعهٔ Recoil رو متوقف کرد و اوایل ۲۰۲۵ مخزنش رو آرشیو کرد). چون شناسایی با ارجاعه، وقتی اتمی دیگه ایمپورت نشه، state ـش هم جمعآوری میشه. برای state مشتق هم Jotai تابع رو اجرا میکنه و میبینه سراغ چه اتمهایی میره تا وابستگیها رو کشف کنه.
نخ مشترک همهٔ اینها یه اسمه که مدام برمیگرده: useSyncExternalStore. از نسخهٔ ۸ به بعد، useSelector در react-redux روی همین هوک سواره، هوک Zustand هم با همین به استور وصل میشه؛ یعنی این کتابخونهها بیشتر از اینکه جادو باشن، یه لایهٔ نازک روی یه قابلیت استاندارد خودِ ریاکتان.
نکات کلیدی:
- State رو اول تفکیک کن: UI، سرور، URL، پیکربندی، و بعد اون برش مشترک باقیمونده
- Redux = pub/sub + قانون reducer؛ اکشنهای سریالایزپذیر پایهٔ سفر در زمانان
- Zustand همون مکانیزمه بدون قرارداد، حدود یک کیلوبایت فشرده
- در Jotai، اتم فقط یه شیء پیکربندیه و مقدارها تو یه WeakMap نگهداری میشن
- هر سه در نهایت از useSyncExternalStore برای اتصال به ریاکت استفاده میکنن




