سیگنالها به کمکِ کاراییِ ریاکت-ریداکس میان
خلاصهٔ کاملتر
مارک اریکسون، نگهدارندهٔ اصلیِ ریداکس، توی این PR میگه سالهاست مطمئن بوده که یه راهی هست تا با سیگنال و proxy کاراییِ اعلانهای اشتراک رو توی اپهای بزرگِ ریاکت-ریداکس بهتر کنه. مشکل اینه که ریداکس یه event emitterِ سادهست و رفتارش O(n)ه: هر اکشنی که dispatch میشه، روی همهٔ callbackهای subscriber حلقه میزنه. این برای بیشترِ اپها مشکلی نیست، ولی توی مقیاسِ بزرگ — مثلاً اپی با ۲۰ هزار کامپوننتِ connected — خودِ اجرای همون callbackها یه گلوگاهِ جدیه.
راهکارِ اریکسون دو صادراتِ تازهست: SignalProvider و useSignalSelector که هر دو جایگزینِ drop-in برای Provider و useSelector هستن و از دیدِ کاربر فرقی نمیکنن. ایده اینه که وقتی هوکِ selector مانت میشه، stateای که selector میخونه توی یه proxy پیچیده شده؛ مسیرهای دسترسی (مثلِ state.nested.field) ردیابی میشن و هر خوانشِ نهایی به یه سیگنال برای همون مسیر تبدیل میشه. اینطوری دقیقاً معلومه هر کامپوننت به کدوم مسیرهای state وابستهست.
بعد از هر اکشن، SignalProvider بینِ stateِ قبلی و جدید یه diff میگیره و میفهمه کدوم مسیرها عوض شدن؛ فقط برای همون مقادیر، سیگنالِ مربوط ست میشه و در نتیجه فقط همون کامپوننتهایی که واقعاً به اون مسیر وابستهان دوباره رندر میشن، نه همهٔ subscriberها.
اریکسون تأکید میکنه که این یه POCِ alphaست و هنوز توی یه اپ واقعی امتحان نشده، هرچند تستها و بنچمارکها رو پاس میکنه. تریدآفها هم هست: هزینهٔ مانتِ هر کامپوننت بالاتره، هر dispatch یه هزینهٔ reconciliationِ اولیه داره که با اندازهٔ state بزرگتر میشه، و حجمِ باندل هم بیشتره (حدودِ ۵ تا ۱۰ کیلوبایت). نکتهٔ جالب اینه که اریکسون میگه کدِ این کار ۱۰۰٪ با هوش مصنوعی نوشته شده، ولی به گفتهٔ خودش «مهندسیشدهست، نه vibe-coded» و همهٔ کدِ کتابخونه رو قبل از هر کامیت مرور کرده. توی بنچمارکها این شاخه ۲۰ تا ۴۰ درصد زمانِ اسکریپتِ کمتری نسبت به نسخهٔ ۹.x فعلی داشته.
نکات کلیدی:
- مشکلِ اصلی، رفتارِ O(n)ِ ریداکس روی همهٔ subscriberها توی اپهای بزرگه
- SignalProvider و useSignalSelector جایگزینِ drop-in برای Provider و useSelector هستن
- با proxy مسیرهای وابستگیِ هر کامپوننت ردیابی و به سیگنال تبدیل میشن
- فقط کامپوننتهای وابسته به مسیرِ تغییریافته دوباره رندر میشن
- ۲۰ تا ۴۰ درصد سریعتر توی بنچمارک، ولی هنوز alpha با باندلِ بزرگتر




