در این مطلب از بلاگ ابر زس بررسی کنیم که NodeJS چیست و چه کاری انجام میدهد. برای اجرای وب اپلیکیشنها خارج از مرورگر کلاینت از Node.JS استفاده میشود. از دیگر کاربردهای این پلتفرم، اجرای برنامههای سمت سرور، توسعه وباپلیکیشنهای نیازمند ورودی و خروجی حجیم دیتا مثل وبسایتهای استریم فیلم، برنامههای پیامرسان و… است. طراحی منبع باز این پلتفرم یکی از دلایل محبوبیت آن برای توسعه وب است که باعث شده از شرکتهای بزرگ دنیای فناوری تا استارتاپهای نوپا بتوانند از Node.JS استفاده کنند. جزئیات بیشتر درباره این که روند کار و ویژگیهای اساسی NodeJS چیست و از چه بخشهایی تشکیل شده را در ادامه این مطلب از بلاگ ابر زس بررسی میکنیم.
Nodejs چیست؟
قبل از پاسخ به این سوال که NodeJS چیست بهتر است کمی درباره نقشی که این پلتفرم در روند توسعه برعهده دارد، صحبت کنیم. زمانی که درباره یک برنامه خاص صحبت میکنیم، معمولاً بیشتر به بخشی که کاربر با آن در تعامل است، یعنی همان فرانتاند وبسایت اشاره داریم. این در حالی است که موارد دیگری هم در پسزمینه یا بکاند وبسایت در اجرای درست روند برنامه دخالت دارند. بهطورکلی هر اپلیکیشن از سه بخش اصلی شامل فرانتاند، سرور بکاند و دیتابیس بکاند تشکیل میشود. برای سرور بکاند میتوان از Node.JS ،پایتون، جاوا و… استفاده کرد. اما کاربرد NodeJS چیست؟
در زمان ارسال درخواست کلاینت، این درخواست به سرور فرستاده شده و در آن پردازش میشود تا اعتبارسنجی درخواست سمت کلاینت انجام شده و پس از پردازش یا محاسبات لازم، پاسخ مناسب برای کلاینت ارسال شود. این فریمورک Node.JS جاوا اسکریپت است که برای انجام تمام این محاسبات و پردازشها استفاده میشود.
به عبارت دیگر، Node.JS یک محیط Runtime جاوا اسکریپت است که به صورت منبع باز و cross-platform طراحی شده و همچنین بهعنوان کتابخانه برای اجرای وب اپلیکیشنها، خارج از مرورگر کلاینت از آن استفاده میشود. این پلتفرم در سال ۲۰۰۹ توسط شخصی به نام Ryan Dahla توسعهیافته است. توسعهدهندگان از این محیط برای ایجاد وب اپلیکیشنهای سمت سرور استفاده میکنند. همچنین از آنجایی که از یک رویداد ناهمزمان و مدل رویداد محور (event-driven model) استفاده میکند، برای ایجاد برنامههای با دادههای فشرده بسیار مناسب است. حالا که میدانیم NodeJS چیست، دلیل استفاده گسترده آن در توسعه وب را بررسی میکنیم.
دلیل استفاده از NodeJS چیست؟
موارد متعددی وجود دارد که نشان میدهد دلیل استفاده و محبوبیت NodeJS چیست و چرا برای سمت سرور برنامه از گزینههای محبوب است. برخی از مهمترین دلایل محبوبیت و کاربرد Node.JS عبارت است از:
- مبتنی بر پلتفرم جاوا اسکریپت و ساخته شده بر اساس انجین V8 گوگل کروم که دلیل اجرای سریع آن است.
- دارا بودن بیش از ۵۰،۰۰۰ پکیج در Node Package Manager و صرفهجویی در زمان به دلیل امکان وارد کردن هریک از پکیجها در هر زمان و با توجه به عملکرد موردنیاز
- مناسب بودن JS برای ساخت وب اپلیکیشنهای نیازمند ورودی و خروجی حجیم، به دلیل عدم نیاز Node.JS به صبر کردن برای API در زمان بازگرداندن دادهها و همچنین ماهیت ناهمزمان (asynchronous) و non-blocking بودن آن
- کاهش زمان بارگذاری فایلهای صوتی و ویدئویی توسط Node.JS به دلیل داشتن کد بیس (code base) یکسان و همگامسازی بهتر کد بین کلاینت و سرور
- استفاده راحتتر Node.JS برای توسعهدهندگان علاقمند به جاوا اسکریپت
ویژگیهای Node.JS
حالا که بیشتر با Node.JS آشنا شده و میدانیم که چرا استفاده از آن پیشنهاد میشود، بیایید ببینیم که ویژگیهای NodeJS چیست. Node.JS از ویژگیها و قابلیتهای متعدد و کاربردی برخوردار است که برخی از مهمترین آنها را در ادامه بررسی میکنیم.
طبیعت ناهمزمان و ماهیت رویداد محور
از آنجایی که سرورهای ساخته شده با Node.JS به انتظار برای API نیاز ندارند، مستقیماً به API بعدی منتقل میشوند. به همین دلیل است که تمام APIهای Node.JS ماهیت کاملاً non-blocking داشته و برای دریافت و ردیابی تمام پاسخ درخواستهای API قبلی، یک مکانیسم رویداد محور را اجرا میکند.
معماری Single Threaded یا تک رشته
با یک حلقه رویداد اتفاق میافتد، معماری تک رشتهای یا Single Threaded باعث میشود که Node.JS مقیاسپذیری بالایی داشته باشد. در سوی مقابل، در سایر سرورها، رشتههای محدودی برای پردازش درخواستها ایجاد میشود. این در حالی است که در مکانیسم رویداد محور، سرورهای Node.JS بهصورت non-blocking یا ناهمزمان پاسخ داده و به همین دلیل، مقیاسپذیری بیشتر میشود. در مقایسه با سایر سرورهای سنتی مانند سرورهای HTTP آپاچی، Node.JS میتواند درخواستهای بیشتری را مدیریت کند.
مقیاسپذیری بالا
نرمافزارهایی که مقیاسپذیری بالایی داشته باشند، امروزه بیشتر مورد تقاضای شرکتها هستند. در Node.JS میتوان تعداد زیادی از درخواستهای همزمان را پاسخ داد. در Node.JS یک ماژول کلاستر برای مدیریت توزیع بار تمام هستههای فعال CPU، استفاده میشود.
اگر بخواهیم بگوییم که یکی از جذابترین قابلیتهای NodeJS چیست میتوان به امکان پارتیشنبندی برنامهها بهصورت افقی اشاره کرد. به لطف این ویژگی، نسخههای متمایز برنامه در اختیار هر یک از مخاطبان هدف قرار میگیرد و همچنین میتوان هر نسخه را بر اساس نیاز هر مخاطب، به صورت جدگانه شخصیسازی کرد.
سرعت بالای اجرای کد
پلتفرم Node.JS از موتور اجرای جاوا اسکریپت V8 استفاده میکند که توسط گوگل کروم نیز استفاده میشود. به همین دلیل سرعت بالایی در اجرای کدها دارد.
سازگاری روی پلتفرمهای مختلف
میتوانید از Node.JS برای انواع سیستمعاملها مانند ویندوز، یونیکس، لینوکس، MacOS و عمده دستگاههای تلفن همراه استفاده کنید.
استفاده از جاوا اسکریپت
از دید یک مهندس، برای پاسخ به این سوال که مهمترین جنبه NodeJS چیست میتوان استفاده آن از جاوا اسکریپت را نام برد. اکثر توسعهدهندگان با جاوا اسکریپت آشنا بوده و به همین دلیل، استفاده و انتخاب آن میتواند بسیار سادهتر و کاربردیتر باشد.
جریان سریع داده
معمولاً پردازش دادههایی که به جریانهای مختلف ارسال میشوند، به زمان زیادی نیاز دارد. اما Node.JS برای این کار زمان کمتری را صرف میکند و سرعت بالایی دارد. فایلها در Node.JS بهصورت همزمان پردازش و آپلود میشود و به همین دلیل، بهشدت در زمان صرفهجویی میکند؛ بنابراین، سرعت جریان کلی داده و ویدئوها در Node.JS تا حد زیادی بهبود مییابد.
بدون بافر (Non Buffering)
یکی دیگر از مهمترین ویژگیهای Node.JS آن است که دادهها در اپلیکیشن Node.JS هرگز بافر نمیشوند.
حالا میدانیم که مهمترین ویژگیهای NodeJS چیست که باعث شده تا استفاده از آن در این حد محبوب و گسترده باشد.
مزایا و معایب NodeJS چیست؟
اکنون که با ویژگیها و دلایل استفاده از Node.JS آشنا شدید در این قسمت به بررسی مزایا و معایب آن میپردازیم:
مزایای Node.JS
- استک فناوری قوی
- پردازش سریع کارهای وب
- مقیاسپذیری بالا برای مایکروسرویسها
- اکوسیستم غنی: کتابخانهها و ابزارهای Node.JS
- پشتیبانی قوی از شرکتها
- پشتیبانی یکپارچه JSON
- دارای محبوبیت بالا و یادگیری آسان
- ارائه از جاوا اسکریپت با محبوبیت بالا بین توسعهدهندگان
- استفاده از موتور V8 توسط Google Chrome
- بهرهمندی از بیش از ۵۰،۰۰۰ پکیج با قابلیتهای بسیار متنوع
- از بهترین گزینهها برای استریم حجم بالای دیتا که نیازمند عملیات ورودی و خروجی عظیم است
معایب Node.JS
- ناتوانی در پردازش سریع وظایف مربوط به CPU به دلیل تک رشتهای بودن
- متکی به callbackها به دلیل ماهیت ناهمزمان Node.JS
- نامناسب برای کارهای محاسباتی سنگین
- گزینه خوبی برای پایگاه داده رابطهای محسوب نمیشود.
اجزای Node.js
برای آن که درک بهتری از فضای این پلتفرم داشته باشیم، لازم است بررسی کنیم که اجزای مختلف NodeJS چیست و از چه بخشهایی تشکیل شده است. همانطور که در تصویر زیر میبینید، این پلتفرم از 10 بخش مختلف تشکیل شده است.
در ادامه با هر یک از این بخشها آشنا میشویم.
ماژولها
اگر بخواهیم به بیان ساده توضیح دهیم که وظیفه ماژولها در NodeJS چیست میتوان گفت که از آن بهعنوان کتابخانه جاوا اسکریپت برای قرارگیری مجموعهای از توابع استفاده میشود. برای گنجاندن ماژول در برنامه Node.JS باید از فانکشن ()require استفاده کرده و در پرانتز، نام ماژول را قرار داد.
در Node.JS از ماژولهای بسیاری استفاده میشود که عملکرد اولیه موردنیاز برای یک برنامه وب را فراهم میکنند. برخی از مهمترین ماژولها شامل موارد زیر است:
- http؛ شامل کلاسها، متدها و ایونتها برای ایجاد سرور http توسط Node.JS
- Util؛ شامل فانکشنهای مفید برای توسعهدهندگان
- Fs؛ شامل ایونتها، کلاسها و متدها برای تقابل با عملکردهای I/O فایل
- url؛ شامل متدهایی برای تجزیه URL
- Querystring؛ شامل متدهایی برای کار با رشته کوئری
- Stream؛ شامل متدهایی برای کنترل جریان داده
- Zlib؛ شامل متدهایی برای فشردهسازی و نیز از فشردهسازی خارج کردن فایلها
کنسول
مشابه کنسول اصلی جاوا اسکریپت ارائه شده توسط مرورگرها بوده و ماژولی است که یک روش اشکالزدایی را ارائه میدهد. این کنسول، پیامها را به stdout و stderr پرینت میکند.
خوشه یا Cluster
میدانیم که Node.JS بر اساس برنامهنویسی تکرشتهای ایجاد شده است. خوشه یا Cluster با ایجاد فرایندهای کوچکتر (child processes)، امکان multi-threading را فراهم میکند. فرایندهای child پورت یکسانی را به اشتراک گذاشته و به شکل همزمان اجرا میشوند.
بخش Global
آبجکتهای گلوبال شامل انواع فانکشنها، ماژولها، رشتهها و … در Node.js در همه ماژولها در دسترس هستند. برخی از آبجکتهای گلوبال Node.js را در جدول زیر میبینید:
Global Onbjects | توضیحات |
dirname__ | برای اختصاص دادن نام دایرکتوری که حاوی کد اپلیکیشن است |
filename__ | برای اختصاص دادن نام فایل مربوط به کد |
Exports | یک رفرنس به module.exports، کوتاهتر برای نوشتن |
Module | رفرنس به ماژول جاری |
require | استفاده برای وارد کردن ماژولها، فایلهای بومی و JSON |
Error Handling
در برنامههای Node.js ممکن است چهار نوع خطا را ممکن است تجربه کنید:
- خطاهای استاندارد جاوا اسکریپت
- خطاهای سیستمی
- خطاهای خاص کاربر
- خطاهای Assertion (نوع خاصی از خطا که در شرایط نقض منطقی رخ میدهد.)
کنترل خطاهای Node.js ازطریق استثناها انجام میشود. برای مثال، میتوانیم خطای مربوط به تقسیم یک عدد بر صفر را بررسی کنیم. این خطا برنامه Node.js را از کار انداخته و برای عملکرد عادی برنامه، باید خطا با استفاده از یک استثنا تعریف شود.
Streaming
استریمها اشیایی هستند که امکان خواندن یا نوشتن مداوم دادهها را فراهم میکنند. بهطورکلی چهار نوع استریم یا جریان وجود دارد. بیایید ببینیم انواع استریم NodeJS چیست:
- قابل خواندن یا Readable؛ انواع جریانهایی که میتوان دادهها را از آنها خواند.
- قابل نوشتن یا Writable؛ انواع جریانها برای دادههایی که میتوان آنها را نوشت.
- Duplex؛ جریان مربوط به دادههایی که هم قابل نوشتن و هم قابل خواندن هستند.
- تبدیل یا Transform؛ انواع استریمهایی که میتواند دادهها را حین خواندن یا نوشتن دستکاری کنند.
بافر (Buffer)
امکان مدیریت جریانهایی که تنها شامل دادههای باینری هستند، توسط ماژول بافر فراهم میشود.
دامنه
مسئولیت رهگیری خطاهایی که کنترل نشده باقی میماند، برعهده ماژول دامین است. این ماژول برای رهگیری خطا از دو روش استفاده میکند. ببینیم که این دو روش در ماژول دامنه NodeJS چیست:
- روش Internal Binding که در آن، نشانگر خطا، کد خود را در متد run اجرا میکند.
- روش External Binding که نشانگر خطا ازطریق متد add به دامنه اضافه میشود.
بخش DNS
از ماژول DNS برای اتصال به سرور DNS و فرایند name resolution استفاده میشود.
اشکالزدا یا Debugger
در Node.JS یک ابزار رفع اشکال وجود دارد که با استفاده از یک کلاینت debugging درونی، میتوانید به آن دسترسی پیدا کنید. البته این ابزار قابلیتها و ویژگیهای متعددی را ارائه نمیدهد، اما روش آن، پشتیبانی از بازرسی ساده کد است. برای استفاده از Debugger میتوانید کلمه کلیدی ‘inspect’ را قبل از نام فایل جاوا اسکریپت در ترمینال اضافه کنید.
تا اینجا دیدیم که بخشهای اصلی NodeJS چیست و چه ابزارهایی در آن برای استفاده وجود دارد.
Node.js Express چیست؟
حالا که به طور کامل بررسی کردیم که NodeJS چیست میتوانیم با فریمورک Express آشنا شویم. Express یک فریمورک Node.js است که بسیار منعطف بوده و مجموعه گستردهای از قابلیتهای توسعه وب اپلیکیشنها و برنامههای موبایل را ارائه میدهد. Node.js Express به مدیریت سرور و مسیرها کمک میکند. برخی از مهمترین ویژگیهای فریمورک Express عبارتاند از:
- استفاده برای طراحی وب اپلیکیشنهای تک صفحه (single-page)، چند صفحه (multi-page) و ترکیبی
- فراهم کردن امکان راهاندازی میانافزارهایی برای پاسخ به درخواستهای HTTP
- تعریف یک جدول مسیریابی برای انجام اقدامات مختلف بر اساس HTTP و URL
- فراهم کردن امکان ارائه پویا صفحات HTML بر اساس ارسال آرگومانها به الگوها
برای درک بهتر این چارچوب، مثال زیر را برای توسعه یک برنامه ساده “Hello World” بررسی کنید.
موارد استفاده یا عدم استفاده از Node.JS
حالا که میدانیم بخشهای Node.JS چیست، میتوانیم بررسی کنیم که در چه مواقعی میتوان از این پلتفرم استفاده کرد. مهمترین موارد استفاده از Node.JS در مواقع زیر است:
- مواقعی که تعداد خیلی کمی از چرخههای CPU توسط کد سمت سرور استفاده شود.
- زمانی که روند non-blocking انجام شده و کارها یا الگوریتمهای سنگینی که نیاز به چرخه CPU زیاد داشته باشد، وجود ندارد.
- چنانچه قبلاً از جاوا اسکریپت استفاده کرده و نوشتن کدهای تکرشتهای مانند جاوا اسکریپت سمت کلاینت برایتان راحت است.
گاهی نیز به دلایل زیر بهتر است از Node.JS استفاده نشود.
- از آنجایی که JS یک برنامه بسیار سنگین برای CPU است، بهتر است در مواقعی که به پردازش و محاسبات سنگین نیاز است، از آن استفاده نکنید. در Node.JS از یک CPU واحد و یک مدل I/O غیر مسدودکننده (non-blocking) مبتنی بر رویداد استفاده شده و به همین دلیل، درخواست ورودی توسط تمام فعالیتهای پردازش شدید CPU مسدود میشود.
- در صورت استفاده همزمان از Node.JS با برنامه ابتدایی مبتنی بر CRUD (مخفف ایجاد، خواندن، آپدیت و حذف کردن) یا HTML، نمیتوان انتظار چندانی از آن داشت. اگرچه Node.JS به مقیاسپذیری بیشتر آن کمک میکند، اما نمیتوان انتظار داشت که تنها به واسطه استفاده از Node.JS انتظار انتقال حجم بالایی از ترافیک را داشت. بنابراین زمانی که دادهها به طور مستقیم توسط سرور ارائه میشود، نیازی به استفاده از Node.JS نیست.
- برای پروژههایی از نوع دسترسی به پایگاهداده رابطهای، استفاده از Node.JS ایده خوبی نیست. در مقایسه با ابزارهای فریمورکهای دیگر، ابزارهای پایگاهداده رابطهای Node.JS آنقدر قوی، قابلاعتماد و کاربردی نیستند.
محبوبیت Node.js و کاربردهای رایج آن
همانطور که گفتیم، Node.JS جزو پلتفرمهای بسیار پرکاربرد است و توانسته توجه کسبوکارهای زیادی را به خود جلب کند. حالا که میدانیم Node.JS چیست و چه ویژگیهایی دارد، میتوان دریافت که چرا این پلتفرم تا این اندازه پرکاربرد است. از آنجایی که Node.JS تطبیقپذیری، انعطاف و پشتیبانی گستردهای را ارائه میکند، درک محبوبیت آن سخت نیست. شاید برایتان جالب باشد که بدانید برخی از معروفترین کسبوکارها و سازمانهای بزرگ و شناخته شده در سراسر دنیا، از جمله ناسا، سرویس حملونقل اوبر، سیستم پرداختها Pay Pal، سرویس اشتراک و پخش فیلم نتفلیکس و… ازجمله مهمترین شرکتهایی هستند که از Node.JS استفاده میکنند.
جمعبندی
در این مطلب به طور کامل دیدیم که Node.JS چیست و چه ویژگیها و کاربردهایی دارد. به زبان ساده، Node.JS محیطی است که به برنامهنویسان اجازه میدهد تا کدها جاوا اسکریپت را در سمت سرور اجرا کنند. این پلتفرم مبتنی بر موتور V8 گوگل کروم ساخته شده و محیطی عالی برای برنامه نویسی جاوا اسکریپت ایجاد میکند. این پلتفرم در سال ۲۰۰۹ ساخته شده و از آن زمان تاکنون، نسخههای متعددی از آن منتشر شده که ویژگی و قابلیتهای متنوعی را ارائه میدهد.