Node.js یک پلتفرم کدنویسی سمت سرور است که بر پایه موتور جاوا اسکریپت مرورگرگوگل کروم کدنویسی شده است. این پلتفرم توسط رایان داهل در سال ۲۰۰۹ ایجاد شده است و در حال حاضر آخرین نسخه آن ورژن ۰.۱۰.۳۶ میباشد.
تعریف node.js
Node.js یک پلتفرم ایجاد شده بر پایه موتور جاوا اسکریپت گوگل کروم است که باعث سهولت ایجاد و مقیاسپذیری برنامههای تحت شبکه میشود. این پلتفرم از یک مدل I/O رویداد محور استفاده میکند که مسدود نشونده (non-blocking) است و همین امر باعث کاهش فشار موجود بر روی سرور و افزایش کارآیی میشود و این امر برای اجرای برنامههای مبتنی بر داده که بصورت بلادرنگ (Real-Time) بر روی سرورهای نامتمرکز استفاده میشوند بسیار مناسب است.
Node.js یک پلتفرم کد باز برای گسترش برنامههای سمت سرور و تحت شبکه میباشد. این پلتفرم بر اساس زبان جاوا اسکریپت نوشته شده است و میزبانی و هاست Nodejs قابلیت پیادهسازی بر روی سیستمعاملهای ویندوز، لینوکس و سیستم عامل کامپیوترهای اپل را دارد.
این فریم ورک کتابخانهای عظیم از ماژولهای مختلف جاوا اسکریپت را فراهم میکند که سهولت در گسترش وباپلیکیشن ها را تا حد زیادی فراهم میآورد.
نود جی اس با چه زبانی نوشته شده است؟
نود جی اس به زبانهای C ،C++ و جاوا اسکریپت نوشته شده است. همچنین منبع ویکیپدیای انگلیسی، نود جی اس را جزئی از موتور جاوا اسکریپت V۸ گوگل، لایه انتزاعی پلتفرم «libuv» و همچنین نوعی کتابخانه هسته تعریف میکند که عمده اینها با جاوا اسکریپت نوشته شدهاند.
نحوه کار node.js
Node.js در واقع از معماری «یک رشته چندین حلقه» (Single Threaded Event Loop) برای مدیریت همزمانی استفاده میکند. این یعنی نود جی اس روی یک رشته کار میکند و به آن اجازه خواهد داد هزاران حلقه رویداد همزمان را مدیریت کند.
Node.js یک محیط زمانِ اجرای (Runtime) متن باز و چند سکویی (Cross Platform) برای اجرای کد جاوا اسکریپت است. محیط اجرا محیطی است که یک برنامه در آن اجرا میشود. این محیط یک زیرساخت سخت افزاری و نرم افزاری است که از اجرای یک کد خاص در زمان واقعی پشتیبانی میکند. Node یا Node.js به طور گسترده برای برنامه نویسی سمت سرور استفاده میشود، و این امکان را برای توسعه دهندگان فراهم میکند تا از جاوا اسکریپت برای کد سمت کلاینت و سمت سرور بدون نیاز به یادگیری زبان اضافی استفاده کنند.
نحوه کار Node.js
یک برنامه Node.js در یک فرآیند واحد (Single Process) اجرا میشود. Node برای هر درخواست یک نخ (Thread) جدید ایجاد نمیکند، همانطور که اغلب در مورد برنامههای سنتی سمت سرور اتفاق میافتد. به این ترتیب، یک سرور Node.js میتواند هزاران اتصال همزمان را بدون نیاز به مقابله با مسائل همزمانی نخ یا سربار (Overhead) در حالت چند نخی انجام دهد.
Node.js رویداد محور (Event Base) است و به صورت ناهمزمان اجرا میشود. کد نوشته شده برای محیط Node از مدل سنتی دریافت (Receive)، پردازش (Process)، ارسال (Send)، انتظار (Wait) و دریافت که در سیستمهای دیگر یافت میشود، پیروی نمی کند. در عوض، Node یک حلقه رویداد را پیاده سازی میکند که درخواستهای دریافتی را همانطور که در صف رویداد انباشته میشوند پردازش میکند و درخواستهای کوچک را یکی پس از دیگری بدون انتظار برای پاسخ مدیریت میکند.
این یک جابهجایی از مدلهای جریان اصلی (Mainstream Models) است که عملیات بزرگتر و پیچیدهتر را اجرا میکنند و چندین نخ را به طور همزمان پردازش میکنند و هر نخ قبل از حرکت منتظر پاسخ مناسب خود است.
به گفته خالق آن رایان دال (Ryan Dahl)، رویکرد Node.js یک مزیت بزرگ نسبت به این مدلها ارائه می دهد. Node عملیات ورودی/خروجی (I/O) را مانند رویکردهای سنتی تر مسدود نمیکند. این تا حد زیادی به این دلیل است که توابع Node مستقیماً I/O را انجام نمیدهند که به حذف امکان مسدود کردن کمک میکند. مسدود کردن یا بن بست تنها زمانی اتفاق میافتد که از روشهای همزمان در کتابخانه استاندارد Node استفاده میشود، اما این یک استثناست تا یک قاعده، و Node را برای برنامههای بلادرنگ با بار کاری همزمان (Concurrent Workloads) سنگین مناسب میکند.
Node همچنین با رابط خط فرمان (npm (CLI عرضه میشود. CLI بخشی از سیستم مدیریت بسته npm است که شامل یک رجیستری گسترده از نرم افزار جاوا اسکریپت و اطلاعات متا آن است. CLI به کاربران امکان میدهد مستقیماً از کنسول خود با بستههای npm در رجیستری تعامل داشته باشند. طبق گزارشها، این رجیستری بزرگترین مخزن کد تک زبانی در جهان است.
Node مانند جاوا اسکریپت از نظر یادگیری نسبتا آسان است. به طور گسترده پیادهسازی شده است و یک جامعه کاربری فعال و بزرگ به عنوان پشتوانه برای خود دارد. علاوه بر این، از آنجایی که Node ناهمزمان، رویداد محور و غیر مسدود است، میتواند همزمانی بلادرنگ (Real-time Concurrency) که در بسیاری از برنامههای کاربردی وب و خدمات آنلاین امروزی رایج است را مدیریت کند. Node برای کاربرد های بلادرنگ مانند چت، خدمات استریم، اینترنت اشیاء و برنامههای تک صفحهای مناسب است.
Node برای هر نوع حجم کاری مناسب نیست. به عنوان مثال به دلیل ماهیت تک نخی آن، ممکن است نتواند به طور موثر یک برنامه وب که به محاسبات سنگین سمت سرور نیاز دارد را اجرا کند. این بار محاسباتی میتواند منجر به مسدود کردن درخواستهای دریافتی و کاهش عملکرد کلی شود.
از سوی دیگر، اگر Node نیازهای شما را از همه جنبههای دیگر برآورده میکند و بار محاسباتی خیلی زیاد نیست، ممکن است بتوانید آن را به عنوان فرآیندهای پسزمینه در زبان دیگری پیادهسازی کنید. Node میتواند به عنوان بخشی از معماری میکروسرویس (Microservice) نیز استفاده شود که برنامه را به بخشهای کوچکتر تقسیم میکند.
دلایل استفاده از Node.Js
Node.js بازدهی و انعطاف بالایی دارد
نود در کنار V8 engine از زبان برنامه نویسی C++ استفاده کرده و سرعت بسیار بالایی دارد. هم V8 هم Node.js به صورت مرتب آپدیت شده و با قابلیتهای جدید جاوا اسکریپت هماهنگ میشوند، همینطور بازدهی آنها بالاتر رفته و مشکلات امنیتی آنها نیز برطرف میشود. همینطور به دلیل استفاده از زبان جاوا اسکریپت انتقال فایل JSON (متداولترین قالب انتقال داده در وب) به طور پیش فرض بسیار سریع خواهد بود.
Node.js کراس پلتفرم است
پلتفرم هایی مثل Electron.js یا NW.js به شما اجازه میدهند با نود جی اس برنامههای دسکتاپ بسازید. به این ترتیب میتوانید برخی از کدهای برنامه تحت وب خود را در محیط ویندوز، لینوکس و مک IOS استفاده کنید. در واقع به کمک نود جی اس، همان تیمی که روی نسخه وب محصول کار میکنند، بدون نیاز به دانش تخصصی در زبانهای C# یا Objective C یا سایر زبان هایی که برای ساخت برنامههای Native به کار میروند، میتوانند یک برنامه دسکتاپ بسازند.
Node.js میتواند با میکروسرویسها ترکیب شود
اکثر پروژههای بزرگ در اول کار ساده بودند و در یک نسخه MVP معرفی شده بودند. اما به مرور زمان این سرویسها بزرگتر شده و نیاز به اضافه کردن قابلیتهای جدید در آنها حس میشد. گاهی وقتها بزرگ شدن سرویس و اضافه کردن امکانات جدید به محصول میتواند برای تیم توسعه دهندگان تبدیل به یک کابوس شود. اما یک راه حل مناسب برای حل این مشکل استفاده از میکروسرویس است. میکروسرویس کمک میکند برنامه خود را بخشهای کوچک تقسیم کنید که هر بخش میتواند توسط تیم متفاوت و حتی زبانی متفاوت نوشته شود. نود جی اس در کار با میکروسرویسها عملکرد بسیار خوبی دارد.
کاربردهای Node.Js
ساخت برنامههای تک صفحه ای (SPA)
SPA مخفف single-page app بوده و برنامه هایی گفته میشود که تمام بخشهای آن در یک صفحه پیاده سازی میشود. از SPA بیشتر برای ساخت شبکههای اجتماعی، سرویسهای ایمیل، سایتهای اشتراک ویدئو و غیره استفاده میشود. یکی از معروفترین سایت هایی که به این شکل ساخته شده است، سرویس اشتراک ویدئو یوتیوب است. از آنجایی که نود جی اس از برنامه نویسی نامتقارن یا asynchronous به خوبی پشتیبانی میکند، برای ساخت برنامههای SPA انتخاب خوبی به حساب میآید.
ساخت برنامههای RTA
RTA مخفف real-time app میباشد. یعنی برنامه هایی که به صورت لحظه ای دارای تغییرات مختلفی هستند. به احتمال زیاد قبلا با این نوع برنامهها کار کرده اید. برای مثال Google Sheets، Spreadsheets یا Slack از این دست برنامهها هستند. در کل برنامههای تعاملی، ابزارهای مدیریت پروژه، کنفرانسهای ویدئویی و صوتی و سایر برنامههای RTA عملیاتهای سنگین ورودی/خروجی انجام میدهند.
ساخت چت روم
یکی از معروفترین نمونههای برنامه RTA چت رومها و پیام رسانها هستند. احتمالا روزانه از پیام رسان و چت رومهای مختلف استفاده میکنید و دوست دارید یک چت روم برای خودتان بسازید. در واقع نود جی اس یک انتخاب عالی برای این کار است. اگر قصد ساخت چنین محصولی را دارید، باید به موارد مختلفی مثل تحمل ترافیک زیاد کاربران، سبک بودن محصول، سرعت بالای ارسال پیامها وغیره توجه داشته باشید. تمام این موارد به کمک نود جی اس و یک فریم ورک جاوا اسکریپت مثل Express.js در سمت سرور قابل پیاده سازی است.
ساخت بازیهای آنلاین تحت مرورگر وب
به کمک نود جی اس میتوان به توسعه بازی تحت وب پرداخت. در واقع با ترکیب تکنولوژیهای HTML5 و ابزارهای جاوا اسکریپت ( مثل Express.js یا Socket.io یا غیره ) میتوانید بازیهای دوبعدی جذابی مثل Ancient Beast یا PaintWar بسازید.
جاوا اسکریپت دارای فریمورک های بسیاری قوی چون React js ، Angular و Vue.js است که در پیاده سازی وب اپلیکیشن ها بسیار قدرتمند عمل می کنند.
اما Node js در واقع یک run-time environment یا محیط اجرایی مبتنی بر جاوا اسکریپت است و کاربردهای آن بسیار بیشتر از یک فریمورک است. ما از Node js علاوه بر توسعه برنامه های وب میتوانیم در Rest APi ها، رباتیک، میکروکنترلرها و … استفاده کنیم.
مقایسه NODE .JS با :
Node.js و Django
هردو فریم ورک Django و Node.js، فریم ورکهایی هستند که جامعه بسیار بزرگی دارند- یعنی تعداد برنامه نویسانی که به این زبان کار می کنند، زیاد است-. هرکدام از این دو فریمورک، مزایا و معایب خاص خودشان را دارند و بنابر نیاز پروژه و البته مهارتهای برنامه نویس انتخاب میشوند. به عنوان مثال از لحاظ Performance، فریم ورک Node.js در مرحله ی بالاتری از Django قرار دارد در حالی که از لحاظ امنیت، Django رتبه ی بهتری دارد. در کل، در نظر گرفتن موارد زیر برای انتخاب بین این دو گزینه پیشنهاد میشود:
- اگر میخواهید سریعا یک برنامه MVP مقیاسپذیر (Scalable) با قابلیت های بالا ایجاد کنید و یا زبان برنامه نویسی شما پایتون است. جانگو را انتخاب کنید.
- برای ساخت سرویسهایی با پهنای باند بالا، ساخت API ها و ایجاد مایکروسرویسها، Node.js پیشنهاد میشود.
Node.js و Laravel
Laravel یک فریمورک برای زبان Php است و تفاوت های زیادی با Node.js دارد، برخلاف Node که عملکرد آن به صورت نامتقارن است، Laravel به صورت متقارن است و روی چند نخ کار میکند. Performance آن به مراتب کندتر از Node.js است و جامعه آن نیز نسبت به نود جی اس کوچکتر است. برای انتخاب بین این دو گزینه، توسعه دهندگان باید موارد زیر را در نظر بگیرند:
- در صورتی که میخواهید به سرعت مراحل توسعه را انجام دهید و یک سیستم Full-Scale بسازید (مثلا یک CMS شبیه به وردپرس) که از امنیت بالایی برخوردار باشد، فریمورک Laravel میتواند یک گزینهی بسیار مناسب باشد.
- اگر شما یک توسعه دهنده ی Full-Stack هستید که سرعت و کارایی برای شما از اهمیت بالایی برخوردار است، Node.js میتواند انتخاب منطقی تری باشد. به عنوان مثال انتخاب Node.js برای ساخت نرم افزار چت، برنامه های Data Streaming و برنامههای مانیتور کردن، گزینهی بهتری است.
Node.js و ASP.Net core
در بروزرسانیهایی که اخیرا برای ASP.Net ایجاد شده است، بررسی شده که Performance یا کارایی ASP.Net در پروژههای CPU-intensive بالاتر و بهتر از Node.js است. همچنین در ASP.Net امکان ساخت GUI نیز میسر است. بنابراین اگر میخواهید یک وبسایت با عملکردهای پایهای را ظرف چند ساعت بسازید، ASP.Net میتواند یک گزینهی مناسب برای شما باشد.
برخی از حوزه هایی که می توان از node.js استفاده کرد
- اپلیکیشن های تک صفحه ای وب (SPA)
- برنامه های ارتباط و گفتگوی آنلاین (Real-time chats)
- اینترنت اشیا (IOT)
- جریان داده ها یا استریمینگ داده (Data streaming)
- برنامه های مبتنی بر API های JSON وREST
- پلتفرم های شبکه اجتماعی (Social Media)
- پردازشگرهای پرداخت آنلاین (Online Payment)
- ابزارهای اشتراکی از راه دور (Remote Collaboration)
- ابزارهای مدیریت ارتباط با مشتری (CRM)
- سیستم های مدیریت محتوا (Content Management System)
- پلتفرم های آموزش الکترونیکی (E-Learning)
- پلتفرم تجارت الکترونیک (E-Commerce)
- ابزارهای مدیریت پروژه (Project Management)
- برنامه های مبتنی بر لوکیشن (Location-Based)
- ابزارهای ERP
- برنامه های دسکتاپ
- برنامه های بک اند موبایل
- سرویس های مدیریت سرور (Server Management Services)
- سرورهای DNS سفارشی
- توسعه سمت کلاینت و سرور بازی ها
معایب Node.js
علی رغم تمامی کاربردها و ویژگی های منحصر به فرد و فوق العاده، این بستر برنامه نویسی بک اند و فرانت اند به زبان جاوا اسکریپت هم مانند هر سیستم دیگری معایبی نیز دارد.
- کاهش کارایی در زمان مدیریت وظایف بسیار سنگین (Heavy Computing Tasks)
- داشتن تغییرات بسیار در کدها به علت ناپایداری API آن (Unstable API)
- عدم پشتیبانی از کتابخانه ها (Lack Of Library Support)
- وابستگی به برنامه نویس های باتجربه (High demand for experienced resources)
- دشواری ویرایش کدها به علت مدل اجرایی ناهمزمان (Asynchronous Programming Model)