// یادداشت پروژه

Next.js
App Router
Performance
i18n

بازسازی پروژهٔ Next.js؛ فراتر از مرتب کردن پوشه‌ها

تغییر مسیرها، مدیریت زبان، اسکرول، رندر تصاویر و داده‌های سمت کلاینت در Arvand؛ و اینکه چرا استفاده از Next.js به‌تنهایی یک فرانت‌اند سبک نمی‌سازه.

آرسام سرخوشافزوده‌شده به این بلاگ 2 دقیقه مطالعه
خواندن مطلب
یادداشت پروژه
تصویر صفحهٔ اصلی Arvand با طراحی آبی و نارنجی و خانهٔ مدرن؛ همان اسکرین‌شات پیوست پست بازسازی پروژه.
در اصل به فارسی در لینکدین منتشر شده است. خواندن پست اصلی در لینکدین ↗(در زبانهٔ جدید باز می‌شود)

ساختار کد و هزینهٔ اجرا، جدا از هم نبودن

وقتی بازسازی بخش‌هایی از پروژهٔ Arvand رو شروع کردم، موضوع فقط مرتب کردن پوشه‌ها نبود. مسیرها، مدیریت چندزبانه و عملکرد مرورگر، همگی نیاز به بازنگری داشتن.

ساختار پروژه رو بر پایهٔ App Router در Next.js منظم کردم و routeها، featureها، کامپوننت‌های مشترک، محتوا و منطق i18n رو از هم جدا کردم. مسئولیت‌ها واضح‌تر شد، ولی بخش مهم دیگه، کم کردن کار اضافه موقع اجرای سایت بود.

مسیر و صفحهٔ خطا هم بخشی از چندزبانه بودنن

مدیریت زبان‌های انگلیسی و ایتالیایی رو بازنگری کردم تا لینک‌ها، زبان انتخاب‌شده رو در URL در نظر بگیرن. صفحهٔ 404 هر دو زبان هم نیاز به رسیدگی داشت؛ از لینک‌های درست تا جلوگیری از خطاهای hydration.

ترجمه شدن متن صفحه، تمام ماجرای چندزبانه بودن نیست. مسیرهای ناوبری و حالت‌های خطا هم باید با زبان کاربر هماهنگ بمونن.

کار کمتری به مرورگر بسپاریم

  • پیاده‌سازی سنگین smooth scrolling رو حذف کردم؛ حلقهٔ دائمی requestAnimationFrame اون در این پروژه به CPU فشار می‌آورد.
  • برای کاهش هزینهٔ رندر موقع اسکرول از content-visibility استفاده کردم و blurهای سنگین رو در نمایشگرهای کوچک کنار گذاشتم.
  • رندر carousel رو تغییر دادم تا فقط تصویر فعال رندر بشه، نه اینکه همهٔ تصاویر هم‌زمان بارگذاری و decode بشن.
  • صفحهٔ Home دیگه برای نمایش چند preview، کل دادهٔ مقاله‌ها، پروژه‌ها و سرویس‌ها رو دریافت نمی‌کرد.
  • داده‌های غیرضروری رو از Client Componentها به Server Componentها منتقل کردم و یک bundle بزرگ سمت کلاینت حذف شد.

کد مرتب‌تر هم به تست production نیاز داره

تغییرات رو با lint، build نسخهٔ production، بررسی ترجمه‌ها و assetها و smoke test مسیرها و APIها بررسی کردم. نتیجه‌ای که در پست توضیح دادم، فشار کمتر روی مرورگر و اسکرول و ناوبری سبک‌تر بود.

نکتهٔ اصلی برای من این بود که انتخاب Next.js فقط نقطهٔ شروعه. داده‌های حجیم سمت کلاینت، decode کنترل‌نشدهٔ تصاویر و افکت‌های پرهزینه همچنان روی تجربهٔ کاربر اثر می‌ذارن. در این پروژه، مشخص‌تر کردن مرز سرور و کلاینت و کنترل بهتر رندر بود که تفاوت ایجاد کرد.