قابلیت Server Components ، هدیه کریسمس React برای توسعه دهندگانش

قابلیت های جدید ری اکت 18 را از این مقاله میتوانید بخوانید

بعد از انتشار نسخه 16 ری اکت و با اضافه شدن قابلیت Hooks بسیاری از توسعه دهنده های این کتابخانه به فکر بروزرسانی کدهایی که نوشته بودند افتادند اگر چه که با کد های قدیمی هم اپلیکیشن هاشون کار میکرد ولی قابلیت Hooks و شخصی سازی و پرفورمنس فانکشنال کامپوننت ها (Functional Component ها ) اون ها رو برای بروزرسانی کد هاشون وسوسه میکرد .

در یکی از صفحات داکیومنت ری اکت به مشکلاتی که کلاس کامپوننت ها (Class Component) داشتند اشاره شده که پیشنهاد میکنم از این لینک حتما مطالعه کنید .

https://reactjs.org/docs/hooks-intro.html

خیلی از مواردی که اون زمان برای توسعه دهنده های ری اکت اتفاق افتاده بود مثل گمراه شدن در استفاده از (this) یا لفظی که خود توسعه دهندگان ری اکت بهش اشاره کردند (Classes confuse both people and machines) که کلاس کامپوننت ها هم توسعه دهنده ها و هم ماشین ها رو دچار گمراهی کرده بودند این ذهنیت رو در توسعه دهنده های ری اکت جا انداخت که اون ها علاوه بر اینکه میتونن نقش خیلی جدی تو فیچر های آینده ری اکت یا حل مشکلاتش داشته باشند ، میتونند همه تقصیر ها رو هم گردن ری اکت بندازن!

حدودا 5 ماه از نسخه بروز شده ری اکت یعنی ری اکت 17 میگذره ، ری اکت همونجوری که در داکیومنت رسمی خودش گفته بود هیچ ویژگی جدیدی به ری اکت اضافه نکرده [البته پیشنهاد میکنم حتما داکیومنت فارسی ری اکت رو که به این بخش میپردازه و من اون رو ترجمه کردم رو از این لینک مطالعه کنید] و بعد از دو و نیم سال آب پاکی ریخته رو دست توسعه دهندگانش ! البته کمی خواست در نسخه 17 ری اکت اونارو راضی نگه داره به طور مثال دیگ با قابلیت جدید JSX Transform نیاز نبود شما ابتدای هر خط ری اکت رو ایمپورت کنی و یا دیگ نیاز نبود مثل تغییر از ری اکت 15 به 16 کل کامپوننتاتو فانکشنال کنی میتونستی دو نسخه از ری اکت همزمان روی یه اپلیکیشن داشته باشی و یکیش رو به حالت Lazy Load در اپلیکیشنت داشته باشی ! اما خود توسعه دهنده های ری اکت هم متوجه این موضوع شدند که بعد دو و نیم سال با توجه به اون انتشار طوفانی نسخه 16 ، طرفداران ری اکت نیاز به حداقل یه فیچر جذاب دارند و اونارو نمیشه با این فیچر هایی که ری اکت 17 داره راضی نگه داشت !

بنظر شخصی من ری اکت در رقابت با فریم ورک هاش (در عین دوستی خیلی نزدیکی که با هم دارند ) داشت خیلی عقب میوفتاد ! قابلیتی مشابه JSX Transform خیلی وقت بود در Nextjs وجود داشت ! خیلیا ری اکت رو در نسخه 17 محکوم به کپی برداری از فریم ورکش کردند و بیشتر از اینکه دنبال فیچر جدید باشه سعی کرده بود فیچر های فریم ورک هاش رو اضافه کنه به خودش ! ولی خب اینا همه تنها دلیل کوچ توسعه دهنده های ری اکت به سمت نکست نبود ! اونا دغدغه های مهم تری داشتند که تو ری اکت نتونستند راحت بهش برسند ! خیلی از توسعه دهنده های ری اکت به دلیل اینکه تازه کار بودند اطلاعات خوبی از وب پک نداشتند یا کد های بهینه ای نمیزدند ، با Code Spiliting آشنا نبودند و فکر میکردند که سئو سایت های ری اکت یک امتیاز منفی براشون در رقابت با رقیبانشون بشمار میره ، البته این موارد همه ی دلایلی که اونارو مجبور به کوچ به نکست کرد نیست اما شاید میتونم بگم اگر یه قابلیت SSR به ری اکت اضافه میشد خیلی از این تبدیل های پر هزینه انجام نمیشد ! خیلی تونستن این کار رو با اضافه کردن Express js و به شکل دستی انجام بدن و خیلی اپلیکیشن های جالب و جذابی شد ولی متاسفانه بسیاری از ساید افکت هایی که ایجاد میشد و دانش متوسط تیم های توسعه شاید باعث میشد عطای این کار رو به لقاش ببخشند !

و بله بالخره بعد این مقدمه طولانی میرسیم سر اصل مطلب و اون هدیه کریسمسی تیم توسعه ری اکت به توسعه دهندگانشه ! و اون هم چیزی نیست جز Server Components !!

تیم توسعه ری اکت بعد از انتشار نسخه 17 و انتقاداتی که بهش وارد شد ، برگ آخرش رو برای روز های پایانی سال 2020 رو کرد !

و حالا این قابلیت چیه و به چه کاری میاد !

اول از همه این مورد رو بدونید که این قابلیت در حال توسعه و تحقیق هست و هنوز به طور رسمی انتشار ندادنش و فعلا تنها چیزی که ازش داریم یه ویدیو و یه مخزن کد (ریپازیتوری) هست که پیشنهاد میکنم حتما ازش کلون بگیرید و با شکل و شمایل اتفاقاتی که داخلش میوفته آشنا بشید .

https://github.com/reactjs/server-components-demo

https://youtu.be/TQQPAU21ZUw

این قابلیت به طور خلاصه RSC یا React Server Components نام داره ، در ویدیو معرفی که داخل سایت داکیومنت ری اکت هم هست ، یک کامپوننت به طور دمو ساخته شده و موارد و اتفاقات این ویژگی رو در اون بررسی میکنه ، پیشنهاد میکنم حتما اون ویدیو رو از دست ندین !

به طور خلاصه مواردی که این قابلیت قراره به ری اکت اضافه کنه این موارده :

  • اجرای RSC فقط بروی سرور بدون بانل سایز ! (باندل سایز 0 ، دقیقا مشکلی که خیلیا با ری اکت داشتند باندل سایز های حجیم بود که باعث کند شدن اون کامپوننت و در نهایت کند شدن اپلیکیشنشون میشد )
  • شما با RSC میتوانید مستقیما به دیتا های سمت سرور دسترسی داشته باشید به این شکل که شما میتونین مستقیما روی دیتابیس کئوری بزنید یا با میکروسرویس ها یا فایل سیستم های روی سرورتون دسترسی داشته باشید ( فقط میتونم بگم فوق العادست ! )
  • با RSC شما میتونین تعیین کنین که کدوم کامپوننت سمت کاربر رندر بشند و کاربر فقط اون مقدار از کدی که میخواد و مورد نیازشه رو فقط مشاهده کنه ( دقیقا مشابه قابلیت های Code Spiliting و Lazy loading که ری اکت در داکیومنتش بررسی کرده بود اما این بار سمت سرور (مثل نکست ) که خیلیا ازش استفاده میکردند )
  • استیت های شما با ریلود یا ری رندر شدن کامپوننت های سمت سرور یا RSC تون از بین نمیرن و تخریب نمیشن !
  • کسایی که از React Lazy استفاده میکردند همزمان با اون از قابلیت به نام Suspense استفاده میکردند به این نحو که در هر حال تا زمانی که اون کامپوننت لود بشه یا حتی اگر لود نشه و خطا بخوره اون Suspense کال میشه و شما میتونین اونرو برای خودتون شخصی سازی کنین یا مثلا میتونستین لودینگ برای کامپوننتون بزارین ! و حالا این قابلیت در RSC ها هم وجود داره و اون ها به شکل واحد های استریم مانند به UI شما تزریق میشن این قابلیت میتونه به توسعه دهنده های ری اکت کمک کنه اونا تیکه تیکه به یوزر دیتا رو نشون بدن تا پرفورمنس اپلیکیشن بالاتر بره ! همه این ها با قابلیتی هم اسم و مشابه Suspense انجام میگیره !
  • توسعه دهنده های ری اکت میتونن کد هاشونو بین سمت سرور و سمت کاربر منتشر کنند به این نحو که شمه میتونین یه کامپوننت که برای نشون دادن یه متن ثابت یا استاتیک استفاده میشه رو سمت سرور بسازید بعد اون رو سمت کاربر داینامیک کنین اینجوری دیگ تنها زمانی که این وسط تلف میشه داینامیک شدن کامپوننته نه ساختنش ! و این میتونه کولاک کنه !

Zero-Bundle-Size Components

اتفاقی که تا اینجا و تا همین زمانی که من برای شما مینویسم تو حوزه توسعه اپ های ری اکتی میوفتاد این بود که ما از یه سری پکیج ها استفاده میکردیم به طور مثال از Jalali Moment یا Moment برای تبدیل تاریخ هامون استفاده میکردیم یا از sanitize-html برای تمیز شدن کد های html از ckeditor یا ما بقی ادیتور ها استفاده میکردیم یا حتی خیلی از پکیج هایی که کار رو برامون راحت میکردند ولی خب همونجوری که میدونین همه این پکیج ها یک فضایی رو اشغال میکنن و زمانی که با gzip اون ها رو کامپکت میکردیم و webPack هم اون ها رو باندل میکرد به یک فضای اشغال شده ای میرسیدیم که بهش باندل سایز میگفتیم ! خب فرض کنین یه کامپوننت دارین که از هیچ کدوم از این پکیج ها استفاده نکرده بود ولی خب چون این پکیج نصب شده بود و ایمپورت شده بود باندل سایز داشت ! به طور مثال

import Momentfrom 'moment';   // 35.9K (11.2K gzipped) 
import sanitizeHtml from 'sanitize-html'; // 206K (63.3K gzipped) function Calender({text}) { 
// some code for date converting and use sanitizeHtml 
// for cleaning Html From Ckeditor markups !
  }



و حالا میخواین بدونید بعد این قابلیت چه اتفاقی میوفته ؟ این شکلی میشه !

import Momentfrom 'moment';   // Zero bundle size  
import sanitizeHtml from 'sanitize-html'; //  Zero bundle size function Calender({text}) { 
 // some code for date converting and use sanitizeHtml
 // for cleaning Html From Ckeditor markups !  
 }



بله دقیقا چیزی که انتظار داشتیم ! پکیج های ما دیگ سمت سرور باندل سایزی رو به اپلیکیشن ما تحمیل نمیکنند و این فیچر به نظر میتونه یکی از انقلابی ترین قابلیت های ری اکت بین تمامی نسخه هایی باشه که تا الان ریلیز کرده !!!

البته فلن باتوجه به اعلام تیم ری اکت منتظر بعد کریسمس باید باشیم و ببینیم که این فیچر که فلن در حالت توسعه و تحقیق تیم ری اکت هست کی قراره ریلیز بشه!

ممنون از وقتی که قرار دادین و این مقاله رو مطالعه کردین اگر این مقاله رو دوست داشتین حتما برای دوستانتون بفرستین تا بتونن از اتفاقاتی که در حوزه ری اکت قراره بیوفته مطلع بشن !

با من میتونین در لینکدین در ارتباط باشین

لینک لینکدین من : linkedin.com/in/pouriya-babaali-2381661b5