اجازه دهید کمی به عقب باز گردیم، زمانیکه توسعهدهندگان از قابلیتهای استانداردی که جاوااسکریپت در اختیارشان قرار میداد راضی نبودند و به دنبال زیرساخت گسترشپذیر و انعطافپذیری بودند. Node.JS زمانی پدید آمد که توسعهدهندگان قدیمی جاوااسکریپت تصمیم گرفتند، قابلیتهای این زبان اسکریپتنویسی را به فراتر از مرورگرهای اینترنتی گسترش دهند تا کاربران بتوانند آنرا به عنوان یک برنامه مستقل روی ماشینهای دلخواه اجرا کنند. بهطوری که این امکان فراهم شود تا کدها به غیر از مرورگر کاربر در سمت سرور اجرا شوند. به بیان سادهتر، به کمک جاوااسکریپت بتوان ظاهر و منطق خدمات وبمحور را کنار هم ایجاد کرد و دیگر برای برنامهنویسی سمت سرور به سراغ زبانهایی نظیر روبی و پیاچپی نرفت. یکی از محیطهای زیرساختی قدرتمند که اجازه میدهد کدهای جاوااسکریپتی را سمت سرور اجرا کرد Node.JS است. Node.JS یک محیط زمان اجرای جاوااسکریپت است.Node.JS هر آن چیزی که برای اجرای یک برنامه نوشته شده به زبان جاوااسکریپت نیاز است را دارد. امروزه، توسعهدهندگان میتوانند کارهایی به مراتب بیشتر از ساخت وبسایتهای تعاملی با جاوااسکریپت انجام دهند. در حال حاضر، جاوااسکریپت قادر به انجام کارهایی است که سایر زبانهای اسکریپتنویسی نظیر پایتون قادر به انجام آنها نیستند.
Node.JS چیست؟
Node.JS یک محیط زمان اجرای جاوااسکریپتی است که بر پایه موتور جاوااسکریپت کروم نسخه هشت ساخته شده است. Node.js بر مبنای پارادایم رویدادمحور و بدون مسدود کردن ارتباطات ورودی و خروجی (I/O) کار میکند تا کدهایی سبکوزن با عملکرد مناسب نوشته شوند. توسعهدهندگان میتوانند با استفاده از Node.JS جاوااسکریپت را به جای آنکه در مرورگر اجرا شود در محیط سرور اجرا کنند. در نتیجه این امکان فراهم است تا برنامههای کاربردی تحت شبکه گسترشپذیر و بزرگ را نوشت. نکته مهمی که در ارتباط با Node.JS باید به آن دقت کنید این است که Node.JS یک چهارچوب نیست، زیرا چهارچوب به مجموعهای از کتابخانهها و استانداردها اشاره دارد که کار با یک زبان خاص را ساده میکنند و مانع انجام کارهای تکراری میشوند.
چهارچوبهای قدرتمندی برای جاوااسکریپت ساخته شدهاند که از آن جمله میتوان به آنگولار، ریاکت، Vue.Js و نمونههای مشابه اشاره کرد. چهارچوبها با هدف دستیابی به عملکرد بهتر و امنیت بیشتر و کاهش هزینهها استفاده میشوند، اما زمان اجرا و محیط زمان اجرا چه مفاهیمی هستند؟ در حالت کلی، زمان اجرا (run-time) برنامهای در وضعیت اجرایی است و محیط زمان اجرا وضعیتی در ماشین مقصد است که میتواند دربرگیرنده کتابخانههای نرمافزاری، متغیرهای محیطی و موارد دیگری باشد که برای ارائه سرویس به پردازههای اجرایی روی یک سامانه به آنها نیاز است. سامانه پشتیبانی زمان اجرا بستهای است که بهطور کلی به همراه خود برنامه اجرایی ایجاد میشود و فرآیند برقراری ارتباط میان پردازه و محیط زمان اجرا را ساده میکند. بر مبنای این تعریف متوجه میشویم که چهارچوب یک پله عقبتر از محیط زمان اجرا است و در نتیجه Node.JS یک چهارچوب نیست و به معنای واقعی کلمه یک محیط زمان اجرا است. Node.JS محدود به برنامههای وبمحور نیست و میتوان از آن در ساخت زیرکنترلرها، REST APIها، ارسال پیام کوتاه و موارد این چنینی استفاده کرد. همچنین به این نکته مهم توجه داشته باشید که npm اکوسیستم بستههای Node.JS یکی از بزرگترین اکوسیستمهای کتابخانههای متنبازی است که برای یک زیرساخت زمان اجرا ارائه شده است.
اکنون که تا حدودی با عملکرد Node.JS، محیط زمان اجرای جاوااسکریپت آشنا شدیم، بهتر است به سراغ بررسی بخشهای دیگر این اکوسیستم برویم. همانگونه که اشاره کردیم Node.JS از یک مدل رویدادمحور و غیرمسدودکننده I/O استفاده میکند، اما این حرف به چه معنا است؟ در اکوسیستم نودجیاس، ورودی/خروجی میتواند هر نوع فرآیندی از خواندن/نوشتن فایلهای محلی تا ساخت یک درخواست HTTP با استفاده از یک واسط برنامهنویسی کاربردی را شامل شود. بهطور سنتی، عملیات ورودی/خروجی زمانبر هستند و گاهی اوقات بر عملکرد سایر فرآیندها سایه افکنده و باعث به تعلیق (Suspend) درآمدن آنها میشوند. بهطور مثال، فرض کنید از یک پایگاه داده در کدهای بکاند درخواست میکنیم جزییات حسابکاربری user1 و user2 را ارسال کند و قصد داریم این اطلاعات را روی صفحهنمایش یا کنسول نشان دهیم. رسیدگی به چنین درخواستهایی زمانبر است و علاوه بر این ممکن است هر دو درخواست به شکل مستقل از هم و بهطور همزمان ارسال شوند. در این حالت بانکاطلاعاتی مجبور است به هر دو محاوره رسیدگی کند که فرآیند زمانبری است (شکل 1).
شکل 1
مسدودسازی عملیات ورودی/خروجی، راهکاری غیرمنعطف
در مکانیزم مسدودسازی، درخواست واکشی دادههای User2 از بانک اطلاعاتی تا زمانی که دادههای User1 روی صفحهنمایش نشان داده نشدهاند ارسال نمیشود.
در این حالت، اگر با یک سرور وبسایت در تعامل باشیم، باید نخ تازهای برای هر کاربر جدید ایجاد کنیم، اما جاوااسکریپت تکریسمانی است. درست است که مفهوم تکریسمانی از مفاهیم بنیادین جاوااسکریپت نیست، اما حلقه رویداد آن تکریسمانی است. بنابراین جاوااسکریپت برای اجرای وظایف چندریسمانی گزینه مناسبی نیست.
عدم مسدودسازی عملیات ورودی/خروجی
با استفاده از یک درخواست غیرمسدودکننده میتوانیم بدون انتظار برای دریافت دادههای کاربر user1، درخواست داده برای user2 را ارسال کنیم. در این حالت هر دو درخواست به شکل موازی اجرا میشوند. رویکرد عدم مسدودسازی عملیات ورودی/خروجی نیاز به چندنرخی را برطرف میکند، زیرا سرور میتواند چند درخواست را به شکل همزمان مدیریت کند. برای درک راحتتر این موضوع بهتر است به طرز کار حلقه رویداد جاوااسکریپت نگاهی داشته باشیم. شکل 2 طرز کار این حلقه را نشان میدهد. مراحل اجرای قطعه کد نشان داده شده در شکل دو به شرح زیر است:
1. تابع main() به پشته بازگشتی (Call Stack) ارسال (push) میشود.
2. console.log() به پشته فراخوانی ارسال میشود و در ادامه شروع به اجرا میکند و خارج (pop) میشود.
3. setTimeout(2000) به پشته ارسال میشود. تابع فوق یک واسط برنامهنویسی کاربردی برای نود است. زمانیکه آنرا فراخوانی میکنیم یک جفت رویداد بازگشتی را ثبت میکنیم. رویداد به مدت 2000 میلیثانیه منتظر میماند و در ادامه تابع بازگشتی (Callback) اجرا میشود.
4. پس از ثبت آن در واسطهای برنامهنویسی کاربردی، SetTimeout(2000) از پشته فراخوانی خارج میشود.
5. اکنون SeTimeout(0) به پشته ارسال میشود. در این زمان دو واسط برنامهنویسی کاربردی برای نود داریم که منتظر اجرا هستند.
6. پس از اینکه مدت زمان صفر ثانیه سپری شد، setTimeout(0) به صف تابع بازگشتی منتقل میشود و همان اتفاقی که برای تابع setTimeout(2000) افتاد تکرار میشود.
7. در صف تابع callback، توابع صبر میکنند تا پشته خالی شود، زیرا در هر لحظه تنها یک دستور میتواند اجرا شود. اجرای این فرآیند بر عهده حلقه رویداد است.
8. دستور آخر console.log() اجرا میشود و main() از پشته فراخوانی خارج میشود.
9. حلقه رویداد متوجه میشود که پشته فراخوانی خالی است، اما صف callback خالی نیست. بنابراین بر مبنای منطق First In-First Out این بازگشتیها برای اجرا به پشته فراخوانی انتقال پیدا میکنند.
شکل 2
NPM
کتابخانههایی وجود دارند که جامعه بزرگی از توسعهدهندگان در ساخت آن مشارکت داشتهاند. نرمافزار مدیریت بسته Node (npm) سرنام
Node Package Manager، بستههایی دارد که میتوان در برنامههای کاربردی از آن استفاده کرد و فرآیند توسعه برنامههای کاربردی وبمحور را سریعتر و کارآمدتر کرد. NPM میتواند بستههای محلی که متعلق به پروژه خاصی هستند یا از طریق ابزارهای جاوااسکریپت نصب میشوند را مدیریت کند. بهطور مثال، در ارتباط با مدیریت بستههای محلی به کار گرفته شده در یک پروژه، NPM میتواند با یک دستور از طریق فایل Package.json تمام ملزومات موردنیاز را نصب کند. بستههای مختلفی در NPM وجود دارند که هر یک قابلیتهای خاصی را ارائه میکنند، بااینحال، برخی از آنها شهرت بیشتری دارند. بهطور مثال، Express برجستهترین نمونه از چهارچوبهای Node.js است. یکی دیگر از مجموعههای بزرگ موجود در مخزن NPM ابزارهای کاربردی توسعه جاوااسکریپت Browserify ،Bower ، مدیریت بسته مرورگر، Grunt ،JavaScript task runner و سیستم استریمینگ Gulp است. یک مجموعه مهم برای توسعهدهندگان در Node.js کلاینتهای بانکاطلاعاتی است که شامل بیش از 4000 ماژول از جمله Redis ،Mongoose ،Firebase و PostgreSQL میشود.
چرا باید از Node.JS استفاده کنیم؟
Node.JS به دلیل قابلیتهای کاربردی زیادی که ارائه میکند برای توسعه برنامههای وبمحور مختلف ایدهآل است. عملکرد و گسترشپذیری فاکتورهایی نیستند که بتوان از کنار آنها به سادگی گذشت. Node.JS سریع است. اگر به دنبال راهاندازی کسبوکار نوپایی هستید که قرار است پیشرفت کند و در نظر دارید برنامه کاربردی خود را به سرعت بزرگ کنید تا بتواند به محاورههای کاربران سایت پاسخ دهد، باید به فکر بهکارگیری زیرساختی گسترشپذیر باشید. Node.JS با ارائه چنین قابلیتی به نیاز شما پاسخ میدهد. Node.JS برای استفاده در کاربردهای مرتبط با Restful API ایدهآل است. Node.JS میتواند هزاران اتصال API همزمان را بهتر از پیاچپی مدیریت کند. علاوه بر این، Node.Js در ارتباط با ساخت برنامههای زیر عملکرد خوبی دارد:
ساخت برنامههای تکصفحهای: برنامه تکصفحهای (SPA) سرنام Single-Page App به برنامههایی گفته میشود که تمام بخشهای برنامه در یک صفحه پیادهسازی میشود. از برنامههای تکصفحهای عمدتا برای ساخت شبکههای اجتماعی، سرویسهای پیامرسان، سایتهای اشتراک ویدیویی و موارد این چنینی استفاده میشود. با توجه به اینکه نود جیاس از برنامهنویسی غیرمتقارن به خوبی پشتیبانی میکند برای ساخت برنامههای تک صفحهای عملکرد ایدهآلی دارد.
ساخت برنامههای بلادرنگ
برنامه بلادرنگ (RTA) سرنام Real-Time App به برنامههایی نظیر برنامههای تعاملی، ابزارهای مدیریت پروژه و برنامههای ارائه شده در ارتباط با کنفرانسهای ویدویی اشاره دارد که به شکل لحظهای تغییر میکنند. اسلک، Google Sheets، Spreadsheets از این مدل برنامهها هستند. نودجیاس در ارتباط با این مدل برنامهها نیز عملکرد خوبی دارد.
ساخت اتاقهای گفتوگو
یکی از شناخته شدهترین برنامههای حساس به زمان پیامرسانها و اتاقهای گفتوگو هستند. نود جیاس برای پیادهسازی چنین برنامههایی بهترین انتخاب است. اگر پروژهای در ارتباط با ساخت یک اتاق گفتوگو یا پیامرسانی به شما محول شده، باید به موارد زیادی دقت کنید که از آن جمله میتوان به ترافیک زیاد کاربران، روان بودن محصول، سرعت بالا در ارسال پیامها و موارد این چنینی اشاره کرد. توسعهدهندگان میتوانند با استفاده از نودجیاس و در تعامل با یک چهارچوب جاوااسکریپتی نظیر Express.js در سمت سرور این مدل برنامهها را پیادهسازی کنند.
ساخت بازیهای آنلاین مبتنی بر مرورگر
امروزه بازیهای آنلاین رواج پیدا کردهاند و سود خوبی عاید توسعهدهندگان میکنند. این برنامهها در حالت ساده و اولیه که قابلیتهای گرافیکی زیادی نیاز ندارد، پهنای باند زیادی را مصرف نمیکنند، اما در مقابل به کاربران اجازه انجام بازیهای دو یا سه بعدی آنلاین را میدهند. توسعهدهندگان میتوانند با ترکیب فناوریهای HTML5، کتابخانهها و ابزارهای جاوااسکریپتی نظیر Express.JS یا Socket.io این مدل بازیها را پیادهسازی کنند.
معماری زیربنایی Node.JS
نودجیاس، موتور Google V8 JavaScript، یک حلقه تکرسیمانی غیرمسدودکننده و یک واسط برنامهنویسی کاربردی ورودی/خروجی سطح پایین را با یکدیگر ترکیب میکند. قطعه کد نشان داده شده در شکل 3 الگوی پایه یک سرور HTTP را نشان میدهد که توابع فلش ES6 برای فراخوانیها را استفاده میکند. در اینجا، تمام فراخوانیها غیرهمزمان و غیرمسدود شده هستند. توابع فراخوانی نیز به رویدادها پاسخ میدهند. تابع فراخوانی CreateServer یک رویداد درخواست کلاینت را مدیریت و پاسخی را ارسال میکند. تابع Listen به مدیریت رویداد Listening میپردازد. این امکان فراهم است تا V8 را دانلود و در هر مکانی از آن استفاده کرد.
شکل 3
Node.JS همین قابلیت را در ارتباط با وبسرورها ارائه میکند. در یک پشته سرور رایج به شکل LAMP یک وبسرور آپاچی یا Nginx وجود دارد که پیاچپی را اجرا میکند. هر اتصال جدید به سرور، ریسمان (Thread) جدیدی را ایجاد میکند که ممکن است خیلی زود عملکرد سرور را کند یا بهطور کامل مختل کند. در چنین شرایطی تنها راه سرویسدهی به کاربران اضافه کردن سرورهای بیشتر است که یک استراتژی گسترشپذیر به شمار نمیرود. این مشکل در ارتباط با Node.Js وجود ندارد، زیرا هیچ وبسرور آپاچی نیست که به اتصالهای ورودی گوش دهد و کدهای وضعیت HTTP را بازگرداند. در اینجا توسعهدهنده باید معماری هسته سرور را مدیریت کند. خوشبختانه ماژولهایی برای ساده کردن این فرآیند ساخته شدهاند. شاید در ابتدای کار این فرآیند پیچیده باشد، اما در مقابل عملکرد برنامههای کاربردی وبمحور را به شکل محسوسی بهبود میدهد. همچنین به این نکته دقت کنید که جاوااسکریپت یک زبان رویدادمحور است. بنابراین هر اتفاقی که روی سرور رخ دهد یک رویداد غیرمسدودکننده را آغاز میکند. هر اتصال جدید یک رویداد به شمار میرود. علاوه بر این، دریافت دادهها از یک فرم بارگذاری محتوا باعث به وجود آمدن رخداد دریافت دادهها (Data-Received) میشود. درخواست دادهها از بانکهای اطلاعاتی نیز یک رخداد است. این جملات بیانگر این موضوع هستند که یک سایت Node.Js هیچگاه قفل نمیشود و میتواند از دهها هزار کاربر همزمان پشتیبانی کند. به بیان دقیقتر، Node.Js نقش سروری نظیر آپاچی را بازی میکند و کد برنامهای که روی آن اجرا میشود را تفسیر میکند.
ماژولها
توسعهدهندگان میتوانند ماژولها یا کتابخانههای مختلفی که در دسترس قرار دارند را روی Node.JS نصب کنند تا ویژگیها و عملکردی بیشتری برای آن تعریف کنند. از جمله این کتابخانهها میتوان به انبار داده، پشتیبانی از فایل ZIP، ورود با فیسبوک یا درگاههای پرداخت اشاره کرد. یکی از مهمترین مفاهیم بنیادین Node.JS توابع غیرهمگام است. توابع فوق این امکان را فراهم میآورند تا تمامی کارها در پسزمینه انجام شود. در بیشتر زبانهای اسکریپتنویسی سمت سرور، برنامه باید صبر کند تا تابع به پایان برسد تا بتواند به سراغ تابع بعدی برود.
با اینحال در Node.JS این امکان فراهم است تا تابعی تعریف کرد که وقتی بخشهای دیگر به کار خود ادامه میدهند اجرا شود. به این ویژگی چندریسمانی میگوییم.
کتابخانه Node.JS
همانگونه که در سمت چپ شکل4 مشاهده میکنید، Node.JS دسترسی به انواع مختلفی از قابلیتها را از طریق کتابخانههای کاربردی ارائه میکند. در سمت راست شکل مشاهده میکنید که ماژول HTTP که قبلا از آن استفاده کردهایم، در برگیرنده هر دو کلاس کلاینت و سرور است. قابلیت HTTPS نیز در یک ماژول جداگانه از TLS یا SSL استفاده میکند. یکی از بزرگترین مشکلات حلقه رویدادهای تکریسمانی، عدم گسترشپذیری عمودی است، زیرا این حلقه رویداد تنها از یک هسته پردازنده مرکزی استفاده میکند، در حالی که پردازندههای امروزی چندین هسته دارند و سرورها نیز از چند پردازنده مرکزی استفاده میکنند. یک مکانیزم تکریسمانی این قابلیت را ندارد تا از مزایای هستههای مختلف در یک سرور استفاده کند. Node.JS قادر است با توابعی نظیر Popen() و بهکارگیری Child_process.spawn() و متدهای دیگر، پردازش زیردستی را اجرا کند. برای ساخت سرورهای گسترشپذیر ماژول Cluster حتا از ماژول پردازش زیردستی (Child) هم عملکرد بهتری دارند. متد Cluster.fork() پردازشهای کاری که پورتهای والد سرور را بهاشتراک میگذارند، اجرا میکند.
شکل 4
کلام آخر
Node.JS یک محیط اجرای چندسکویی مبتنی بر موتور جاوااسکریپت است که برای سرورها و برنامههای کاربرد در نظر گرفته شده و در یک حلقه رخدادهای تکریسمانی غیرمسدودکننده ساخته شده است. Node.JS با ارائه اکوسیستمی بالغ بر نیم میلیون بسته حق انتخاب زیادی در اختیار توسعهدهندگان قرار میدهد
ماهنامه شبکه را از کجا تهیه کنیم؟
ماهنامه شبکه را میتوانید از کتابخانههای عمومی سراسر کشور و نیز از دکههای روزنامهفروشی تهیه نمائید.
ثبت اشتراک نسخه کاغذی ماهنامه شبکه
ثبت اشتراک نسخه آنلاین
کتاب الکترونیک +Network راهنمای شبکهها
- برای دانلود تنها کتاب کامل ترجمه فارسی +Network اینجا کلیک کنید.
کتاب الکترونیک دوره مقدماتی آموزش پایتون
- اگر قصد یادگیری برنامهنویسی را دارید ولی هیچ پیشزمینهای ندارید اینجا کلیک کنید.
نظر شما چیست؟