نود جی اس (Nodejs) دقیقا چیه؟

نود جی اس دقیقا چیه ؟نود جی اس یک محیط ران تایم (runtime) برپایه جاوا اسکریپته.خب خیلی عالی ولی ران تایم یعنی چی؟ چجوری کار میکنه ؟ران تایم node شامل همه چیزایی میشه که شما برای اجرای یه برنامه ی جاوااسکریپت نیاز دارید.نود جی اس وقتی به وجود اومد که توسعه دهندگان ربان جاوااسکریپت اون رو از چیزی که فقط تو مرورگر اجرا میشد به یه زبانی تبدیل کردن که بشه اون رو بصورت یه اپلیکیشن مستفل اجرا کرد.یعنی شما الان با جاوااسکریپت کارهایی فراتر از ساختن یه وبسایت تعاملی انجام بدید.جاوااسکریپت الان قابلیت انجام کارهایی داره که زبان هایی مثل پایتون انجام میدن.جاوااسکریپت و nodejs هردوشون روی موتور ران تایم 8v اجرا میشن. این موتور کد جاوااسکریپت شما رو دریافت می کنه و اون رو به یه کد ماشینِ سریعتر تبدیل میکنه. کد ماشین یه کد سطح پایین هستش که کامپیوتر میتونه بدون تفسیر (interpret) کردن اون رو اجرا کنه.چرا نود جی اس ؟طبق تعریفی که خود وبسایت nodejs ارائه داده:نود جی اس یه ران تایم جاوااسکریپت بر پایه موتور جاوااسکریپت v8 هستش که در مروگر کروم استفاده می شه.نود جی اس از مدلِ رویداد محور(event driven) ، مسدود نکننده ی ورودی / خروجی (non blocking I/O) استفاده می کند که باعث میشه زبان کم حجم و کارآمدی بشه.اکوسیستم نود جی اس ، یا npm بزرگترین اکوسیستم اوپن سورس در جهان هستش. ما قبلا در مورد خط اول این تعریف صحبت کردیم " نود جی اس یه ران تایم جاوااسکریپت بر پایه موتور جاوااسکریپت v8 هستش که در مروگر کروم استفاده می شه ". حالا بریم درباره دو خط بعدی این تعریف بحث کنیم تا پی ببریم که چرا نود جی اس اینقد پرطرفداره.ورودی/خروجی یا IO میتونه هر چیزی از خواندن / نوشتن فایل های محلی تا ارسال یه درخواست HTTP به Api باشه.ورودی خروجی زمان می بره ، بنابراین اعمال دیگر برنامه رو مسدود میکنه.موقعیتی رو درنظر بگیرید که بخواهیم یه در خواست به دیتابیس بدیم تا اطلاعات user1 و user2 رو بدست بیاریم و اون رو نشون بدیم.پاسخ به این درخواست زمانبره ، اما هر دو درخواست می تونه همرمان و بطور مستقل از هم انجام بشه.ورودی خروجی مسدود شده (blocking I/O)در روش blocking دریافت اطلاعات user2 تا زمانی که اطلاعات user1 روی صفحه چاپ نشده باشد، شروع نمی شود. اگر این یه سرور بود مجبور می شدیم برای هر کاربر جدید یه نخ (thread) جدید شروع کنیم اما زبان جاوااسکریپت تک نخی هستش (نه دقیقا ، اما یه حلقه ی اجرای تک نخی داره که بعدا دربار توضیح میدم).پس این نشون میده که جاوااسکریپت برای اجرای وظایف چند نخی مناسب نیست. اینجاست که روش مسدود نکننده به کمک میاد.روش مسدود نکننده (non blocking I/O)از اون طرف با استفاده از درخواست مسدود نشونده می تونیم درخواست user2 رو انجام بدیم ، بدون اینکه منتظر پاسخ برای user1 باشیم . یعنی میتونیم هر دو درخواست رو بصورت موازی انجام بدیم.این روش نیاز به روش چندنخی رو برطرف می کنه چون سرور حالا می تونه چندین درخواست رو همزمان مدیریت کنه.حلقه اجرا در جاوااسکریتبه تصویر بالا توجه کنید. این کد چیکار می کنه ؟1. تابع ()main رو به پشته ی فراخوانی (call stack) اضافه می کنه2. تابع ()console.log رو به پشته فراخوانی اضافه می کنه. این کد همون لحظه اجرا میشه و از پشته خارج میشه3. تابع (setTimeout(2000 به پشته اضافه می شه.این تابع یه callback داره که 2000 میلی ثانیه یا 2 ثانیه صبر میکنه و بعد اون callback اجرا میشه4. بعد از 2000 میلی ثانیه ، تابع (setTimeout(2000 از پشته ی فراخوانی خارج میشه5. بعد از اون تابع (setTimeout(0 هم به این صورت اضافه میشه. حالا ما دوتا تابع داریم که منتظر اجرا هستن6. بعد از 0 ثانیه تابع (setTimeout(0 به صف اجرا منتقل میشه ، و همین اتفاق برای تابع (setTimeout(2000 میفته.7. در صف اجرا منتظر می مونن تا پشته فراخوانی خالی بشه.چون فقط یه برنامه میتونه تو یه لحظه اجرا بشه. این کار توسط حلقه اجرا یا event loop انجام میشه8. آخرین تابع ()console.log اجرا میشه و تابع ()main از پشته فراخوانی خارج میشه.9. حلقه ی اجرا می بینه که پشته فراخوانی خالیه و صف اجرا خالی نیست . پس callback ها رو (با ترتیب اولین ورودی – اولین خروجی) به پشته فراخوانی برای اجرا ، انتقال میده.NPMکتابخونه های زیادی توسط جامعه فوق برنامه نویسان جاوااسکریپت ساخته شدن که می تونن بیشتر مشکلات عمومی شما رو حل کنن. Npm یا Node Package Manager پکیج های زیادی داره که میتونه توسعه برنامه شما رو سریعتر و کاراتر کنن.تابع Requireاین تابع سه کار رو انجام میده :· ماژول هایی رو که با نود جی اس خام دردسترس هستن مثل سیستم فایل (file system) و HTTP رو تو برنامه تون بارگزاری می کنه· این تابع می تونه کتابخونه های منتشر شده توسط دیگر برنامه نویسان مثل Express یا Mongoose رو براتون بارگزاری کنه.این کتابخونه ها رو میتونین از npm دانلود و نصب کنین· با این تابع می تونین برنامه ها و فایل هایی که خودتون نوشتین رو بارگزاری کنید.این تابع پارامتر مسیر فایل رو می گیره و شی module.exports رو بر می گردونه.ماژول های نود جی اسماژول یه بلوک کد با قابلیت استفاده دوباره هست که وجودش روی کد های دیگر تاثیری نمی ذاره.موتور v8 جاوااسکریپت رو با بهره بردن از زبان C++ قدرتمند تر می کنهموتور V8 یه موتور ران تام اوپن سورس هستش که با زبان برنامه نویسی ++c نوشته شدهجاوا اسکریپت ---(V8(++C ---> کد ماشینموتور V8 زبان اسکریپتی به نام ECMAScript رو که توسط استاندارد ECMA-262 تعیین میشه رو فراهم می کنه.ECMAScript توسط سازمان Ecma International که استانداردهای جاوااسکریپت رو منتشر میکنه ، ساخته شده.موتور V8 میتونه بصورت مستقل اجرا بشه یا هم می تونه با برنامه ++C دیگه ادغام بشه.این موتور اصطلاحا قلاب هایی (Hook) داره که بهتون اجازه میده تا کد های ++C خودتون رو به برنامه جاوااسکریپت خودتون اضافه کنید.این ویژگی به شما اجازه میده تا بتونین قابلیت ها و ویژگی های جدیدی رو با ادغام موتور V8 به جاوااسکریپت اضافه کنید. با این کار کد C++ شما میتونه کارهای بیشتری از استانداردی که توسط استاندارد ECMAScript تعیین شده ، انجام بدید.البته اینو اضافه کنم که علاوه بر موتور V8 موتور های ران تایم دیگه ای وجود دارن. مثل SpiderMonkey که توسط تیم موزیلا و Chakra که توسط تیم مایکروسافت توسعه داده شدن.رویداد ها (Events)رویداد در واقع چیزی است که در اپلیکیشن ما رخ می ده و ما می تونیم به اون پاسخ بدیم.دو نوع رویداد در نود وجود داره.رویداد های سیستم :هسته ی C++ از ی کتابخونه که اصطلاحا libuv نامیده میشه . (برای مثال ،تمام شدن خواندن ی فایل)رویداد های سفارشی : هسته ی جاوا اسکریپتنوشتن برنامه Hello World در نود جی اسیه فایل به اسم app.js بسازید و کد زیر رو توش کپی کنید.console.log("Hello World!");ترمینال رو باز کنید و به پوشه ای که فایل رو توش ذخیره کردید، برید و دستور node app.js رو اجر کنید.خب شما الان اولین برنامه Hello World تون رو با نود جی اس نوشتین.ممنون از اینکه تا آخر این مقاله همراه من بودین. این اولین ترجمه من بود امیدوارم ازش راضی بوده باشین.لطفا نظر بدین.منبع : https://medium.freecodecamp.org/what-exactly-is-node-js-ae36e97449f5