Vue Router اسکرول رو دست کامپوننت میده
خلاصهٔ کاملتر
posva تو PR شمارهٔ ۲۸۰۵ مخزن Vue Router یه پلاگین آزمایشی به اسم Scroll Restoration اضافه کرده. تو توضیح خودش اومده که هدف این پلاگین رفع چند مشکل scrollBehavior و در نهایت جایگزین شدنشه. چهار تفاوت اصلی داره: فقط تو کانتکست یه ناوبری و بعد از mount یا update شدن کامپوننت اجرا میشه، میتونه چند موقعیت رو همزمان ذخیره کنه (مثل کانتینرها و لیستهای مجازی)، میتونه دستی باشه، و داخل خود کامپوننتها مصرف میشه نه تو تنظیمات راوتر.
کنارش یه API تازه هم اومده: onRouteRendered(). این هوک ترکیب router.afterEach() با onMounted()/onUpdated() تو سطح کامپوننته، یعنی کالبک شما بعد از اینکه ویوی روت واقعاً رندر شد اجرا میشه. نکتهٔ مهمش اینه که وقتی transition یا کامپوننت async نمایش رو عقب میاندازه، باز هم درست کار میکنه. RouterView مسئول صدا زدن کالبکهاست، اون هم بعد از اینکه روت نمایشدادهشده تثبیت شد.
کار پلاگین از داخل اینطوریه که موقعیت هر روت رو تو session storage ذخیره میکنه و بعد از رندر شدن روت برمیگردونه، مگر اینکه حالت دستی روشن باشه. یه diagnostic هم اضافه شده که ثبتهای متناقض رو گزارش میده، تا اپلیکیشنی که اشتباه تنظیم شده پیام واضح بگیره نه یه خطای گنگ زمان اجرا. یه باگ هم درست شده: تأخیر تو mount شدن اپ باعث میشد یه ناوبری تمامشده دو بار گزارش بشه.
این PR کوچیک نیست. تست واحد، تست SSR، تست تایپ و تست مرورگر براش نوشته شده، فیکسچرهای e2e برای Navigation API اضافه شده و مستندات راهاندازی پلاگین، کلیدها، هندلرهای سفارشی و بازگردانی دستی هم نوشته شده. بات CodeRabbit ۷ کامنت قابلاقدام گذاشته و یکی از چکهای پیش از مرج رد شده، چون پوشش docstring فقط ۲۴ درصده در حالی که آستانه ۸۰ درصده. ریسک مرج رو پایین ارزیابی کرده و تخمین زمان ریویو حدود ۶۰ دقیقهست.
یه نکتهٔ امنیتی هم تو ریویو مطرح شده که ارزش دونستن داره: کلید ذخیرهسازی بر اساس روت ساخته میشه، نه حساب کاربری، و موقع unmount شدن پلاگین هم پاک نمیشه. یعنی تو یه تب مشترک، کاربر بعدی که همون روت رو باز میکنه میتونه موقعیت ذخیرهشدهٔ کاربر قبلی رو بگیره. چون این قابلیت opt-in هست (یعنی تا خودت روشنش نکنی کار نمیکنه) و چیزی جز موقعیت اسکرول ذخیره نمیکنه، خطرش محدوده، ولی پیشنهاد شده اپهایی که موقعیت اسکرول توشون میتونه فعالیت کاربر رو لو بده، کانتکست حساب رو هم تو کلید بیارن.
نکات کلیدی:
- پلاگین موقعیتها رو تو session storage نگه میداره و بعد از رندر روت برمیگردونه، مگر با حالت دستی
- onRouteRendered() معادل سطحکامپوننتِ router.afterEach() بهعلاوهٔ onMounted()/onUpdated() هست
- برخلاف scrollBehavior، پلاگین میتونه چند موقعیت رو همزمان ذخیره کنه
- چک پیش از مرج روی پوشش docstring رد شده: ۲۴ درصد در مقابل آستانهٔ ۸۰ درصد، روی ۲۵ تابع در ۲۴ فایل
- کلید ذخیرهسازی بر اساس روت هست نه حساب کاربری، پس تو تب مشترک موقعیت کاربر قبلی میتونه برگرده




