درود، این اولین مطلب من در سایت ویرگول هست که مینویسم و به دلیل مشغله کاری خیلی کم با مقوله وبلاگ نویسی آشنا هستم پس امیدوارم همه خوششون بیاد!
امروز از شدت هیجان و کنجکاوی زیاد رفتم next.js conf رو بررسی کردم، آخه شب معرفی فقط تونستم قسمتهایی از معرفی next12 ببینم . از امکانات جدید next.js هیجان زده شدم، فکر نمیکردم تغییرات خیلی مهمی رو بتونم ببینم با اینکه منتظر بودم و دائم به این فکر میکردم که یعنی چه تغییراتی میتونه داشته باشه؟ و مثل دفعات قبل vercel غافلگیرم کرد.
خوب بهتره برم سر اصل مطلب، بخش های مهم معرفی next.js 12 شامل بخش های زیر میشه که می خوام هر کدوم رو بررسی کنم (البته در حد قابل فهم بودن مطالب)
خوب همون طور که شنیده بودیم و شایعه ای ایجاد شده بود vercel برای کامپایل صفحات بالاخره ترجیح داد که SWC رو جایگزین Babel کنه و طبق گفته خودشون تمرکز کردند روی سرعت باندل
حالا چه مزیتی داره این swc ؟ خوب اولین مشکلی که داشتیم برای Hot Relode این بود که باید منتظر می نشستیم که صفحه کامپایل بشه چه بسا گاهی رفرش لازم هم می شدیم خوب swc سرعت کامپایل شدن صفحات رو در هنگام Hot Relode و هنگام Build گرفتن افزایش داده است.
طبق این آمار سرعت Hot Relode صفحه 3 برابر و سرعت Build به 5 برابر افزایش پیدا کرده است. که این افزایش سرعت با استفاده از کد بیس های بزرگ ، بهبود Performance ،تغییرات اساسی در Webpack انجام شده است.
ولی یک مشکلی! خوب حالا که Babel نیست من که از Emotion و Styled-component استفاده می کنم چکار کنم؟ خوب فعلا قابلیت پاسخگویی نداره (بد شد!) ولی اونقدر تغییرات زیاده و خوبه که میتونم فعلا از این قسمت چشم پوشی کنم! راه حل جایگزین برای این مورد استفاده از styled-jsx معرفی شده خود next.js هست که میتونه براحتی کامپایل بشه (من باهاش رابطه خوشایندی ندارم) ولی میتونی اینجا در مورد بخونید. هر چند اعلام کردند این مشکل بزودی برطرف میشه و گفته اند کانفیگ های babelrc رو برامون به اشتراک بزارید تا یک ساختار مناسب برای preset ها و plugin های Babel ارائه بدیم. اینجا میتونید کانفیگ های خودتون را به اشتراک بزارید.
یک امکان جالب دیگه که برای این بخش ارائه شده کوچک سازی (minify) کردن باندل با استفاده از SwcMinify هست که میتونید با قطعه کد زیر فعالش کنید.
این امکان بزودی جایگزین ساختار کلی فریمورک میشه.
// next.config.js module.exports = { swcMinify: true }
نیاز به این فیوچر زمانی مشخص شد که پیش خودم گفتم خوب چرا زمانی که سرور و کلاینت رو تعبیه کردن میان افزار براش نزاشتن ? که خب بالاخره این نیاز هم برطرف شد .
مثلا چه کارهایی میشه باهاش انجام داد؟
اگه امکانات دیگه هم بود توی نظرات بگید تا اینجا اضافه کنم.
حالا بعد از اینا چطوری Middleware ها پیاده سازی میشن؟
برای پیاده سازی یک Middleware حتما باید داخل دایرکتوری pages باشند و با کد زیر توی هر دایرکتوری می تونیم پیاده سازی کنید.
// pages/_middleware.js export function middleware(req, ev) { return new Response('Hello, world!') }
به اینکه توجه کنید که فایل middleware.js_ در داخل Route اصلی برای تمام Route ها اعمال میشه و همچنین توصیه شده از fetch api استفاده کنید.
بالاخره React 18 توسط next.js پشتیبانی شد و از این اتفاق خیلی خوشحالم حالا میتونید React.lazy و suspense هم در next.js داشته باشیم و بهمراه آن http streaming هم داشته باشیم .
کلا این قسمت روحم رو جلا میده ! حالا مگه چیه هست این ؟ از وقتی با React-query کار میکنم دنیای کدنویسی برام عوض شده از بس اینکه React-query خوبه ولی یک سری مشکلات هم داره البته با قسمت server-side در next.js مثلا نمیتونی از هوک در قسمت سرور استفاده که همین باعث میشه هر دفعه در قسمت سرور از queryclient یک شی جدید بسازی و استفاده کنی و کلا این قضیه اش رو مخم بود ولی الان با این مشکلات خدافظی میکنم ? چرا ؟ چون تو ورژن 12 دیگه serverSideProps و getStaticProps فانکشن نیستن و میتونیم توی useEffect مدیریت کنیم مثل Create-React-App مزیتش چیه ؟ مزیتش اینه کامپوننت ها را هم میتونیم سمت سرور رندر کنیم. با استفاده از کد زیر این کار امکان پذیره
// next.config.js module.exports = { experimental: { concurrentFeatures: true, serverComponents: true, }, }
برای اینکه سمت سرور را پیاده سازی کنیم فقط باید هر فایلی که می خواهیم قابلیت سرور داشته باشه رو پسوند .server.js بزاریم مثلا index.server.js .
یک قابلیت فوق العاده دیگه هم به next.js 12 اضافه شده اونم Cache Data هست ، دقیقا کاری که React-query انجام میده البته اتوماتیک (در مورد این قسمت بعدا مطلبی می نویسم)
حجم عکس ها از اینی که هست هم کمتر میشه حتی کمتر از webp البته یک نکته هست که اطلاع داشته باشید لود عکس ها و فرمت اونا بر اساس ساپورت مرورگر هست. چرا پیاده سازی میشه؟
module.exports = { images: { formats: ['image/avif', 'image/webp'] } }
یک امکانی برای بهینه لود شدن صفحات با استفاده از SSG هست به نام Incremental Static Regeneration که بر اساس درخواست کلاینت صفحات Build می شوند حالا این قابلیت به صفحات ISR هم اضافه شده (یکی از مطالب آینده من در مورد این قابلیت است)
این قابلیت به نوبه خود بی نظیره حالا از چه لحاظ ؟ اگه با typescript کار کرده باشید برای auto import ماژول ها قطعا به مشکل خورده اید، این مشکل از کجا آب میخورد ؟ از اونجایی که زیر ساخت next به صورت CommonJs استفاده میشد و نمیتونست ES Modules را پشتیبانی که به مشکلات مختلفی برخورد می کرد البته صرفا مخاطبان عزیز می دونن که ES Modules فقط برای این کار نیست، با این امکان next.js سریعتر و Minify تر میشه.
قابلیت مهم بعدی Url Import هست که در اصل به نظرم خط و نشانی برای Deno.js هست حالا با این قابلیت چکار میتونیم انجام بدیم؟ میتونیم به صورت Remote از CDN فایلها و کتابخانه دیگه استفاده کنیم
import confetti from 'https://cdn.skypack.dev/canvas-confetti'
البته قبل از استفاده باید Register بشه به شکل زیر
module.exports = { experimental: { urlImports: ['https://cdn.skypack.dev'] } }
قابلیت های دیگر اضافه شده
Output File Tracking : این قابلیت بهتون اجازه میده فایل ها موقع Build شدن مستقل باشند که در زمان Deploy کردن مثلا داکر خیلی کمک میکنه
بهبود Fast Refresh: برای بهینه شدن برای Fast Refresh از این به بعد از Websocket استفاده میشه
تغییرات بدون نیاز به اجرای سرور: قبلا تغییرات در فایل های app.js_ , _documents.js باید یک بار سرور را Restart میکردیم که دیگر نیاز نیست.
لینتر : Eslint اکنون برای فایل های مجزا هم با --fliles قابل اجرا هست
تغییرات و فیوچرها های جدید به کلی خوب بودن و طبیعتا همراهشون باگ ها و مسائل جدیدی را ایجاد میکنند دنیای فرانت با next.js به نظرم خیلی زیباتر شده و همیشه هم قدم با React جلورفته و حتی در مباحثی مانند SSR به نظرم جلوتر از React پیشتاز بوده یادمون نره تیم قوی پشت next.js هست و قطعا در آینده حرف های بیشتر برای گفتن داره اگه از تغییرات جدید و تکنولوژی جدید استقبال نکنیم و پیشتاز نباشیم قطعا در آینده شکست می خوریم امیدوارم با این مطلب به کسایی که در این حوزه فعالیت می کنند کمک شایانی کرده باشم.
منبع : next.js
من را می تونید در لینکدین دنبال کنید و باعث انگیزه گرفتن من برای ادامه باشید...