دنیای آشفته ی JavaScript

اگر الان کسی یک چرت بزنه و بیدار شه حتی برای ۱۰ دقیقه، قطعا می بینه که فریمورک ها و کتابخونه هایی برای جاوا اسکریپت ساخته شدند!در واقع این زبان دائما در حال زایشه!من خودم React JS کار میکنم. در واقع رابطه ای که باهاش دارم love hate هست. یعنی هم متنفرم ازش هم دوستش دارم. به همین دلیل هم دنیای جاوا اسکریپت رو بی در و پیکر میدونم.بیایید با #C مقایسه کنیم:در واقع وقتی به اکو سیستم سی شارپ نگاه میکنیم همه چیز خیلی اتو کشیده اس. میتونم بگم تنوعی که JS داره رو نداره اما خیلی با نظمه و با ساختار. - پکیج منیجر NUget رو دارید که به صورت ویژوال و بدون خط فرمان پکیج ها رو نصب میکنه در ویژوال استودیودر عوض JS هم پکیج منیجر های NPM و Yarn رو دارید که هم سنگین و کند اند هم یه فولدر حجیمی با خرده ریز فایل ها به اسم Node Modules دارید! که کاملا CLI هستند و رابط گرافیکی ندارند.از طرفی کتابخانه ها و فریمورک های جاوا اسکریپت هم بسیار گیج کننده است. کابوس من ریکت هست. یک کتابخانه ساخته شده توسط فیسبوک برای جاوا اسکریپت.سینتکس و نوع کد نویسی دوست داشتنی داره به نظر من. من کلا با OOP و شی گرایی رابطه خوبی ندارم. البته نه که بلد نباشم. شکل کد نویسیشو دوست ندارم. برعکس React که الان دیگه همه چیز فانکشنی هست. اما چیز هایی هستند که واقعا و واقعا دوست دارم سرمو بخاطرشون بکوبم به دیوار و بمیرم!رندر و آپدیت کردن کامپوننت ها:‌مزخرف ترین خاصیت ریکت آپدیت کردن همه کامپوننت ها به ازای تغییر یک وضعیت هست. مگر اینکه با useMemo یک کامپوننتی بسازید که فقط وضعیت خاصی رو رصد کنه.در واقع این قطعه کد رو من خودم برای خودم نوشتم و به کامپوننت تبدیل کردم‌ صرفا به همین دلیل:چیزی که نمی فهمم اینه که چرا باید به ازای هر تغییر وضعیت ، همه کامپوننت ها وضعیتشون باید تغییر کنه؟!خیلی احمقانه است و از بزرگترین ایرادات ریکت هست.یادمه یکبار قرار بود یک فرمی بسازم که سه بخش داشت. بخش اولش نظر سنجی بود که یک TextBox برای نظر دهی و دوتا Radio برای تعیین جنسیت داشت. همه این عنصر ها از طریق API گرفته میشدند. در واقع یک ElementType داشتم و فرم ها داینامیک بود. در هر بار که دکمه Radio تغییر میکرد. متن داخل TextBox هم حذف میشد.در واقع مسئله خیلی پیچیده تر از این حرفاست و چون به سورس کد ها و کارم مربوط میشه زیاد دوست ندارم جزئیات بدم. همین مسئله ۳ روز طول کشید تا راه حلی براش پیدا کنیم. نداشتن داکیومنت کافی و ساختار منسجمریکت ساختار خاصی برای هندل کردن فرم ها یا state management و ... نداره. در واقع آزادی عمل بیشتری دارید درسته اما دردسر هاتون هم بیشتره. تو ساختن فرم ها دو تا گزینه معروف داریم که یکی Formik هست:‌یکی هم React Hook Form: در واقع Formik به صورت Controlled هست و هر فیلد به یک State وصله اما React Hook Form به صورت Uncontrolled هست و نوشتن چیزی مثلا در input ها باعث رندر شدن نمیشه.بگذریم.. مشکلی که من دارم اینه که هیچکدوم این کتابخانه ها که معروف ترین های ریکت هستند مثال یا داکیومنتی برای سناریو های پیچیده ندارند. تنها چیزی که گذاشتند مثالی هست برای لاگین فرم های ساده و اعتبار سنجی input ها که مثلا قرمز بشن اگه ورودی معتبری نداشتند. خب اینا که چیزی نیست. اینا رو بدون کتابخانه هم میشه ساخت. مشکلی که من داشتم در مورد همین داینامیک فرم ها این بود. مثلا کتابخانه React Hook Form رو در نظر بگیرید. در ابتدا مقادیر پیش فرض فرم بایستی تعریف بشه که خب اگه فرم ثابتی داشته باشیم اصلا مشکلی نیست. اما وقتی فرمی داریم که داینامیک هست و ما اصلا نمیدونیم فرمه قرار چی باشه ، چه خاکی بر سر کنیم؟!برای همین هم دوباره یک کامپوننت ساختم که خیلی وقتم رو گرفت. که با یه سری ورودی هایی میاد مقادیر اولیه ای بدست میاره و از طریق یک آرایه، عناصر رو رندر میکنه. باورم نمیشه که برای همچین سناریو هایی هیچ چیزی نوشته نشده. داکیومنت های کتابخانه های ریکت فقط دارای مثال های بسیار مبتدی اند. در حالیکه باید مثال هایی یکم پیشرفته تر هم میزدند.هیچ کس برای یه لاگین فرم ساده کتابخانه نصب نمیکنه. خب داکیومنت رو گفتم اما ساختار چی؟الان دنبال فریمورک های ریکت بگردید، Next JS هست Remix هست Vite هست و البته یار قدیمی که دیگه از دور خارج میشه Create React App یا همان CRA. خب کدومشو استفاده کنیم؟!چرا یکپارچگی وجود نداره؟‌هیچکس هم بر حسب نیاز انتخاب نمیکنه. الان ترند محبوب ما Next JS هست. چون همه استفاده میکنن ها، ما هم باید استفاده کنیم. همه اینا هم کند هستند. به غیر از Vite که سریع هست اما اون هم تا جایی که من باهاش کار کردم دیباگ کردن و اشکال گیری سختی داره. هیچ خطایی نشون نمیده وقتی صفحه سفید میشه. CRA بهتر خطاها رو نشون میداد. خود CRA هم که از نظر سرعت میتونم بگم فاجعه است. و البته که useEffect عزیزمون که پدر مارو در آورده هم فراموش نشود !آخرین موضوعی که وجود داره اینه که زندگی آدم رو ازش میگیره همین برنامه نویسی فرانت اند البته با جاوا اسکریپت.زمانی که من شروع به یادگیری و ساختن چیزی هایی کردم. CRA استفاده میشد و تایپ اسکریپت هم مد نبود. الان Vite و Next JS اومدن و همه چیزی داره به سمت TS پیش میره. من کار میکنم که زندگی کنم نه برعکسش! هر روز باید پشت کامپیوتر فلان چیز و بهمان چیز رو یاد بگیرم. بسه دیگه.خب هر سری باید یه فریمورک و زبان و سیستم دیگه ای یاد بگیرم؟!پس فردا هم یه چیزی رو دست Next JS بلند میشه و باید اونو یاد گرفت و الا امنیت شغلی نداری. سیستم خیلی مزخرفی هست!بعضی موقع ها به خودم میگم بهتر نبود بجاش Blazor یا Flutter یاد میگرفتم...‍‍‍