
نسخه جدید NextJS یعنی NextJS 14.2 منتشر شد و در این نسخه ما شاهد عملکردی بهتر در Development, Production و Cache خواهیم داشت.
next dev --turbostaleTimesهمچنین اگر علاقه مند به یادگیری مدرن و اصولی فرانت اند از جمله NextJS هستید، پیشنهاد میکنیم نگاهی هم به دوره آموزش فرانت اند ما بندازید.
طبق گفته داکیومنت نکست، توسعه دهنده های این فریمورک چند ماه اخیر را مشغول کار برروی ارتقا عملکرد و سرعت Turbopack بودن و حالا در نکست 14.2 بطور کامل و رسمی کارش تمام شده و میتونیم ازش نهایت استفاده رو بکنیم!
همچنین تیم توسعه دهنده از Turbopack برروی اپلیکیشن های اصلی خودش مثل vercel.com استفاده کرد تا مطمئن بشه که turbopack در بهترین و پایدار ترین حالت ممکن خودش هست و پس از استفاده هم نتایج زیر را بدست آورد:
next dev --turbo
همچنین اهداف بعدی تیم توسعه دهنده nextjs طبق گفته وبسایت رسمیشون، برروی بهبود مصرف Memory، پیاده سازی یک حافظه cache دائمی و کار برروی next build --turbo خواهد بود.
build را در حالت Turbopack هم اضافه کنه. در حال حاضر بیش از 76% از تست های این پیاده سازی پاس شده و به محض تکمیل شدن در اختیار ما قرار خواهند گرفت.علاوه بر بهبودهای عملکردی که در Turbopack شاهدش بودیم، تیم سازنده برای build و حالت production هم اقداماتی را داشته ( هم برای pages router و هم app router )
در نکست 14.2 تا حد خیلی زیادی دیگه export های بلا استفاده در bundle ما قرار نخواهند گرفت.به عنوان مثال اگر یک پکیجی نصب کرده باشید که شامل 1000 آیکون مختلفه و شما از یدونه این آیکون ها در یکی از کامپوننت هاتون صرفا استفاده کرده اید و در این شرایط طبیعتا نمیخواهید که ما بقی اون 999 آیکون هم در bundle شما قرار بگیره و پروژه شمارو سنگین تر بکنه. قبل تر این اتفاق ممکن بود بیوفته اما حالا در ورژن جدید nextjs شاهد این اتفاق نخواهیم بود و export های بلا استفاده از bundle ما حذف خواهند شد.
این بهینه سازی را برروی پکیجی مثل react-aria-components تست کردند و نتیجه تست هم کاهش 51.3 درصدی سایز بوده.
نکته: این بهینه سازی در حال حاضر برای barrel files کار نمیکنه ( منظور از barrel files کامپوننت هایین که یکجا اونهارو export کردیم و بعد مجدد توی یک فایل دیگه با یک نام دیگه هم export مجدد ازشون گرفتیم ) و برای اعمال این بهینه سازی برروی این تیپ پکیج ها در حال حاضر نیازه تا کانفیگ زیر را در next.config.ts بنویسیم.
module.exports = { experimental: { optimizePackageImports: ['package-name'], }, };
تیم توسعه دهنده NextJS متوجه مصرف بیش از حد Memory در زمان Build گرفتن شد و پس از بررسی گزارش های کاربران و تست هایی که خودشون انجام دادن متوجه شدند که دلیل این مصرف بیش از حد memory بخاطر ایجاد فایل های تکراری جاوااسکریپتی حین build هست و در نتیجه با refactor کردن منطق bundle و کمی بهینه سازی بیشتر تونستن این مشکل را رفع کنند.
در نهایت هم پس از این تغییرات و بهینه سازی ها، نتایج تست نشان دهنده کاهش سایز و مصرف memory از 2.2GB به زیر 190M بود ( بطور میانگین البته )
همچنین بوسیله --experimental-debug-memory-usage که یک flag در زمان build هست میتونیم بهتر مصرف memory در زمان build را دیباگ کنیم. برای مطالعه بیشتر هم درباره این مورد میتونید به صفحه بهینه سازی مصرف memory که در وبسایت رسمی nextjs هست مراجعه کنید.
تیم توسعه دهنده نحوه بهینه سازی فایل های CSS در زمان Build را تغییر داده و با با تبدیل فایل های css به فایل های کوچکتر ( css chunks ) مطمئن میشه که هیچ تداخلی بین استایل های ما در هنگام جابجایی بین صفحات مختلف پیش نیاد.
از nextjs 14.2 به بعد ترتیب css chunk ها بر اساس ترتیب import اونها هستش، به عنوان مثال base-button.module.css قبل از page.module.css قرار میگیرد.
// base-button.tsx import styles from './base-button.module.css'; export function BaseButton() { return <button className={styles.primary} />; }
// page.tsx import { BaseButton } from './base-button'; import styles from './page.module.css'; export function Page() { return <BaseButton className={styles.primary} />; }
همچنین برای پیاده سازی درست و با ترتیب اصولی، تیم توسعه دهنده پیشنهاد میکنه که به شکل زیر عمل کنیم:
تیم توسعه دهنده میگه که انتظار میره که این تغییرات برروی عملکرد عادی اپلیکیشن ها تاثیر نزاره، اما اگر دیدید جایی اتفاق غیر منتظره ای افتاد، حتما نگاهی به ترتیب اصولی پیاده سازی css که در داکیومنت رسمی نوشته شده بندازید.
امروزه مبحث cache یکی از مهم ترین مفاهیم برای داشتن یک اپلیکیشن سریع و قابل اعتماده و ضرورت وجودش در همه اپلیکیشن های تحت وب حس میشه. عمکرد cache در اپلیکیشن ها هم باید کاملا اصولی و قابل اعتماد باشه تا به عنوان مثال زمانی که یک mutation اتفاق میوفته و مثلا یک مقاله جدید به وبلاگ سایت شما اضافه میشه انتظار میره که این حافظه cache بروزرسانی بشه و آخرین و تازه ترین داده هارو به کاربران نمایش بده.
Router cache سمت کاربر، کاربردش اینه که با cache کردن صفحات دیده شده یا prefetch شده، تجربه ای سریع و بهینه را به کاربر بده و در این نسخه از نکست طبق درخواست مکرر کاربران از تیم توسعه دهنده، قابلیتی به نام staleTime اضافه شده که به ما این اجازرو میده تا در client-side router cache یک بازه زمانی را جهت باطل شدن حافظه cache و تازه سازی اون ثبت کنیم.
بطور پیشفرض صفحاتی که از طریق کامپوننت Link و بدون تعیین کردن پراپ prefetch بهشون لینک دادیم، بمدت 30 ثانیه cache میشن و اگر هم prefetch را تعیین و اونرو مساوی true قرار بدیم هم بمدت 5 دقیقه cache میشن.
این مقدارهای پیشفرض هم اکنون در این نسخه جدید nextjs قابل تنظیمن و میتونیم این مدت زمان هارا با قرار دادن کانفیگ زیر در فایل next.config.ts تغییر بدیم.
const nextConfig = { experimental: { staleTimes: { dynamic: 30, static: 180, }, }, }; module.exports = nextConfig;
هدف از staleTime اینه که کنترلی بیشتر از گذشته برروی مدت زمان موندگاری cache بده، اما همچنان یک راه حل کامل نیست و تیم توسعه دهنده میگه که در نسخه های بعدی آزادی عمل بیشتری را در اختیار ما خواهد گذاشت.
همچنین برای Parallel Routes و Intercepting Routes هم در این نسخه بهبود هایی را داریم و این ۲ هم اکنون با Client-side Router Cache سازگار شدند.
تیم توسعه دهنده در نسخه 14.1 شروع به کار برروی بهبود ارور ها کرد و این کار تا به امروز و در نسخه 14.2 ادامه داشت و در نتیجه ما در این نسخه ارورهایی واضح تر و پر جزئیات تر، با طراحی ظاهری بهتری را میبینیم.
این بهبود هم برای App Router و هم Pages Router پیاده شده و در ظاهری بهتر، هم در نسخه dark و هم light ارورها و لاگ های بهتری را در اختیار ما قرار میده. در زیر میتونید مثالی از قبل و بعد از این تغییر را مشاهده کنید.
قبل:

بعد:

پس از اینکه تیم توسعه دهنده ری اکت خبر از نسخه ای جدید یعنی ری اکت 19 را داد، تیم توسعه دهنده NextJS هم دست به کار شد و سعی کردند این قابلیت های جدید ری اکت که در حال حاضر در نسخه React Canary موجوده را داخل NextJS هم اضافه کنند و این فرایند همچنان ادامه داره تا زمانیکه تیم توسعه دهنده NextJS یک نسخه اصلی و هماهنگ با نسخه جدید ری اکت را منتشر کنند.