معرفی مختصر فرم ورک NestJS

اگه تا بحال با نود کار کرده باشید حتما میدونین که چقدر نوشتن یه پروژه با نود میتونه جذاب و سریع باشه . اما خاطرتون باشه که همون لحظه ای که پروژه داره بزرگ میشه و تیم هم اسکیل میشه، کم کم مشکلات شروع میکنه به پدیدار شدن . هر برنامه نویسی سبک کد زدن خودشو داره و از طرفی بعضی از برنامه نویس ها بسیار تنبل تشریف دارن و ممکنه فقط بخوان تسک رو انجام بدن و به impact ای که کدشون در آینده میتونه داشته باشه توجهی نداشته باشن . بخصوص اگر از تایپ اسکریپت استفاده نکرده باشید، کار رو برای برنامه نویس هایی که بعدا به تیم اضافه میشن بسیار سخت کردید چرا که تایپ وریبل ها مشخص نیست و کد زدن رو برای کسی که قبلا با این کد کار نکرده سخت و پیچیده میکنه. به عبارت دیگه onboard کردن دولپر‌های جدید زمانبرتر میشه. تجربه‌ی برنامه نویس‌های این تکنولوژی ثابت کرده که کد زدن با Node.js تا یک زمانی آسونه و با زیاد شدن حجم کدها و اسکیل شدن پروژه و افزوده شدن برنامه نویس‌های جدید به پروژه، پیچیدگی بیشتر و بیشتر میشه.

گراف نمایی از پیچیدگی و حجم یک اپلیکیشن که با Node.js نوشته میشه
گراف نمایی از پیچیدگی و حجم یک اپلیکیشن که با Node.js نوشته میشه


این یعنی نوشتن یه پروژه‌ی اینترپرایز با نود نیاز به یه معماری اصولی و قابل اسکیل کردن داره. در عین حال کد زدن با نود همچنان باید جذاب و سریع باشه.

راستش ما هم توی تیممون با همین مشکل روبرو شدیم و تصمیم گرفتیم که برای حل این مشکل یه boilerplate روی express بسازیم (دلیلمون هم ساده بود چون ما نمیخواستیم از یه فرم ورک دیگه‌ای استفاده کنیم که دست مارو برای استفاده از تکنولوژی‌های دیگه ببنده برای همین اکسپرس رو انتخاب کردیم) ما میخواستیم تا حد ممکن ساختار ماژولار داشته باشیم و از مزایای OOP استفاده کنیم و همچین dependency injection رو برای ایزوله کردن ماژول‌ها و تست راحت‌تر و دلایل دیگه توی پروژمون لحاظ کنیم .همچنین قصد داشتیم ارتباط بین سرویس‌ها رو با rpc هندل کنیم تا از مزایای ماکروسرویس بودن هرچه بیشتر در معماریمون استفاده کنیم. خلاصه بعد از یه مدت کوتاهی این boilerplate ما به یه شبه فرم ورک با کلی کد تست نشده تبدیل شده بود که اصلا برای استفاده در پروداکشن reliable نبود. و همین باعث شد که تصمیم گرفتیم چرخ رو دوباره اختراع نکنیم و این شد که به سراغ NestJS اومدیم.

معرفی NestJS:

بزارید Nest رو از زبون خودش براتون معرفی کنم:

نست (NestJS) بستریه که برای ساخت بهتر و مقیاس پذیر اپلیکیشن‌های سمت سرور توسعه داده شده و از تایپ اسکریپت استفاده میکنه ( البته شما هنوز میتونید از جاوا اسکریپت هم استفاده کنید ) تا به شما اجازه بده که از ویژگی‌های OOP (برنامه نویسی شی گرا)‌, (برنامه نویسی فانکشن محور) FP استفاده کنید. نست به صورت پیش فرض از اکسپرس به عنوان http server استفاده میکنه اما شما میتونید از Fastify به جای اکسپرس برای سرعت بیشتر استفاده کنید‌. در واقع اگه بخواهید میتونید هر نوع http server ای رو که بخواهید برای نست استفاده کنید و موقع کد زدن به api اون http server مستقیم دسترسی داشته باشید‌.

در واقع نست برخلاف باقی فرم ورک‌های نود دست شما رو برای استفاده از ابزار‌های مختلف باز میزاره‌. چه طوری‌؟ به لطف معماری بی نظیرش که همه چیز توش ماژول‌های ایزوله هست و مثلا اگه شما میخواهید از Logger خودتون استفاده کنید، به راحتی این کار امکان پذیره‌. یا مثلا شما یه فرم ورک http برای خودتون نوشتید که سرعت فوق العاده‌ای داره، نست میتونه به جای اکسپرس از اون استفاده کنه‌. فوق العاده نیست‌؟

به طور کلی اگه بخوام ویژگی‌های جذاب نست رو براتون توضیح بدم میتونم به چند مورد زیر اشاره کنم‌:

تکنیک Dependency injection‌: اگه با این تکنیک آشنایی دارین میدونید که چقدر موثر میتونه باشه‌. ساختار ماژولار نست به کمک DI ممکن شده‌. در واقع کل معماری نست بر این اساس شکل گرفته‌.

ساختار ماژولار‌: معماری نست بر اساس ساختار ماژولار شکل گرفته. شما میتونید قطعات کد رو بر اساس کاراییشون در ماژول‌های مختلفی قرار بدین: مثلا ماژول User, که هر چیزی که مربوط به کاربر باشه رو درون خودش داشته باشه‌.

انعطاف پذیری‌: در موردش صحبت کردم اما به طور خلاصه نست به شما امکان این رو میده که از هر ابزاری که نیاز داشته باشید به صورت یکپارچه در کل سیستم استفاده کنید‌.


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


داکیومنت‌: داکیومنت نست بی نظیره. شما فقط با خوندن داکیومنت نست آماده میشید که به صورت کامل باهاش کار کنید. هیچ نکته ای در داکیومنتش فراموش نشده و نیازی نیست که برای درک بهتر نست کد هاشو مطالعه کنید و یا توی stackovrflow دنبال راه حل باشید. خواندن داکیومنت به معنی واقعی کافیه‌.


همونطور که گفتم نست برای ما بسیار کارامد اومد و به کمکش تونستیم یه ساختار دقیق و منظم داشته باشیم. از طرفی نست به صورت پیش فرض از ساختار ماکروسرویس پشتیبانی میکنه .حتی شما میتونید از یه کد monolithic شروع کنید و بعد‌ها هر کدوم از ماژول‌ها رو به یه سرویس مجزا تبدیل کنید که نحوه‌ی ارتباطشون با هم از طریق grpc باشه‌. این‌ها رو گفتم اما حالا چطوی شروع کنیم‌؟

شروع کار با نست:

برای شروع کار طبیعتا باید node رو به صورت پیش فرض نصب داشته باشید. و از cli مخصوص نست استفاده کنید. برای نصب cli :

npm i -g @nestjs/cli
$ nest --version

اگر کامند nest --version بدون مشکل کار کرد، همه چیز آمادست. حالا میتونیم یه اپلیکیشن ساده درست کنیم. برای اینکار کافیه که در ترمینال عبارت زیر رو وارد کنیم:

$ nest new hello-world

بعد از چند ثانیه همه چیز آمادست. از اونجایی که نست از decorator ها زیاد استفاده میکنه بهتون پیشنهاد میکنم که از vscode برای محیط کد زدن استفاده کنید. این عبارتی که گفتم شاید الان صحیح نباشه، اما قدیما که از webstorm استفاده میکردم حسابی با decorator ها مشکل داشتم، الان رو نمیدونم : )

حالا برای ران شدن سرور کامند زیر رو روی دایرکتوری اپلیکیشن وارد کنید:‌

$ cd hello-world
$ npm run start

تبریک میگم. شما یه اپلیکیشن در حال اجرا بر روی نست دارید:

حالا چی‌؟

شاید از خوندن این متن چیز زیادی دستگیرتون نشه‌. سعی دارم که نست رو به صورت کامل در یک سری آموزش بهتون معرفی کنم اما پیشنهاد میکنم یه سر به داکیومت جذابش بزنید و کار رو شروع کنید. به صورت کلی استفاده از این فرم ورک نیاز به دانش متوسطی از Node.js داره و اگر شما فکر میکنید که یه روزی قراره پروژه‌تون خیلی بزرگ بشه و کلی برنامه نویس همزمان روش کار کنن، بهتون پیشنهاد میکنم حتما ازش استفاده کنید. اینم فراموش نکنید که ما اینجا نیستیم که چرخ رو از اول اختراع کنیم. اگه براتون سرعت بسیار مهمه، نیازی نیست که حتما فرم ورک خودتون رو توسعه بدین، چون اگر از fastify در کنار نست استفاده کنید میتونید به کانکرنسی فوق العاده و سرعت بینظری برسید (بنچمارک) که برای بسیاری از پروژه‌های اینترپرایز کافیه. در واقع شما اونجایی به مشکل برمیخورید که فکرشم نمیکنید. و اون نقطه دقیقا زمانیه که شما اسکیل شدین و نود به لحاظ سرعت هیچ مشکلی نداره اما توی maintenance و افزودن فیچر جدید توی کدتون به مشکل برمیخورید.

اونچه که خوندید برگرفته از اطلاعات شخصی بنده و داکیومنت نست و این مقاله بود.

اگه مشکلی داشتین یا سوالی در مورد این نوشته داشتین خیلی خوشحال میشم کمکتون کنم.