واقعا Node.js چیه؟!

همه جا این رو می‌خونیم که Node.js یک محیط اجرایی برای زبان جاوااسکریپت هست، خوب!؟ ایول! ولی این دقیقا یعنی چی؟ مگه قرار نبود جاوااسکریپت توی مرورگر اجرا بشه؟ پس فاز چیه؟

ببینید محیط اجراییه Node.js فضا و تمام اون چیز‌هایی که نیازه که کد‌های نوشته شده جاوااسکریپت اجرا بشه رو داره. مثلا به این شکل نگاه کنید:

اگر جاوا بلد باشید، خوب متوجه می‌شید که این یه تقلید ساده‌ هستش
اگر جاوا بلد باشید، خوب متوجه می‌شید که این یه تقلید ساده‌ هستش


در واقع Node.js از اونجایی اومد که برنامه نویس‌های جاوااسکریپت تصمیم گرفتن که فرای این باشن که فقط خلق مسائل خارق العاده توی مرورگر کنن.

جاوااسکریپت هم توانایی و پتانسیل این رو داشت که مثل زبان‌های اسکریپتیه دیگه مثلا پایتون باشه و بتونه توی محیط غیر از مرورگر کار کنه.

همونطور که توی عکس بالا می‌بینید، نشون دادم که موتور اصلی Node.js در واقع V8 هست، توی مرورگر هم همینه،‌ اونجا هم V8 داره کار می‌کنه. این سوال در ذهن همه تداعی میشه که موتور چیه؟

V8 Engine :D
V8 Engine :D

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

چرا Node.js ؟

خود سایت Node.js اینطور بیان می‌کنه که:

محیط Node.js بر اساس موتور V8 کروم ساخته شده.

محیط Node.js از یک مدل رویداد محور و non-blocking I/O استفاده می‌کنه که این Node.js رو سبک و کارآمد می‌کنه.

محیط Node.js اکوسیستمی برای پکیج‌هاش داره به نامه npm که بزرگ‌ترین اکوسیستم کتابخانه‌های متن باز در دنیاست.


در مورد اولی صحبت کرده بودم، بهتره که در مورد دومی که مهمترینش هم هست یکم بیشتر توضیح بدم.

منظور از I/O همون Input/Output هست. می‌تونه هر چیزی باشه، از خوندن/نوشتن توی فایل باشه تا ارسال درخواست‌های HTTP به یک API.

این یعنی I/O برای اجرا زمان می‌بره و این یعنی بقیهء کارها الافش می‌شن، یجورایی بقیه رو نگه می‌داره تا کار خودش انجام بشه.

خیلی کوتاه توضیح بدم، جاوااسکریپت ساختار non-blocking I/O داره و برای انجام کارهایی که به زمان نیاز داره، الباقی کارها رو الاف خودش نمی‌کنه، به طبع Node.js هم این خاصیت رو داره پس دیگه نیاز شما رو به داشتن multi-threading از بین می‌بره، چون دیگه سرور شما این توانایی رو داره که درخواست‌های زیادی رو همزمان جواب بده.

خوب توجه کنید، شما باید خیلی خیلی خوب متوجه بشید که حلقه رویدادهای جاوااسکریپت چطوری کار می‌کنه، اصطلاح اصلیش رو بگم، باید بدونید event loop جاوااسکریپت چطوری کار می‌کنه، به شکل زیر توجه کنید:

چرخه رویدادهای جاوااسکریپت
چرخه رویدادهای جاوااسکریپت

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

  1. تابع main به استک اضافه میشه.
  2. تابع console.log('Starting app') به استک اضافه میشه. اجرا میشه و از استک میاد بیرون.
  3. تابع setTimeout(2000) به استک اضافه میشه. setTimeout(2000) از API های Node.js هست. زمانی که صداش می‌زنیم تا اجراش کنیم در واقع اون رو توی لیست Node APIs ثبت می‌کنیم. اون صبر می‌کنه به اندازه زمانی که بهش دادیم که اینجا ۲۰۰۰ میلی ثانیه هست و بعد تابع callback خودش رو به صف اضافه می‌کنه.
  4. بعد از اینکه توی Node APIs ثبت شد، خود setTimeout(2000) از استک میاد بیرون.
  5. حالا می‌رسیم به setTimeout(0) که اون هم مثل دوست اولیش باهاش برخورد میشه. در لیست Node APIs ثبت می‌کنیم و از استک میاد بیرون.
  6. این دو عزیز صبر می‌کنن که زمانشون تمام بشه، بعد هر کدوم تابع‌های callback مربوط به خودشون رو توی صف قرار می‌دن. طبیعی هست که هر کسی زودتر، تابع callback اون هم توی صف جلوتره، اینجا setTimeout دومی چون زمانش صفر بود، callback ش زودتر میره توی صف و ۲۰۰۰ میلی ثانیه یا به عبارتی ۲ ثانیه بعد setTimeout اولی callback ش رو می‌فرسته توی صف و میشه نفر دوم صف.
  7. اینجا event loop مراقب هست که اول استک خالی بشه و بعد به ترتیب توابع داخل صف رو اجرا کنه.
  8. آخرین تابع یعنی console.log('Finishing up') هم به استک اضافه میشه، اجرا میشه و از استک خارج میشه و بعد اون هم main خارج میشه.
  9. حالا استک خالیه و event loop صف رو تک به تک شروع به اجرا می‌کنه. اولی تابع console.log('Second setTimeout') و بعدش هم console.log('Inside of callback') و تمام.
  10. اینطوری میشه که شما خروجی کدی که توی عکس هست رو اینطوری می‌بینید:
"Starting app"
"Finishing up"
"Second setTimeout"
"Inside of callback"

در مورد مساله سومی هم باید بگم که کتابخانه‌های زیاد و عالی‌ای در npm یا همون Node Package Manager وجود داره که خیلی‌ از گره‌ها رو باز کرده و از این به بعد هم می‌کنه و سرعت و کارآمدی برنامه نویسی شما رو بیشتر می‌کنه.

چطوری یه کد ساده توی Node.js بزنیم؟

کاری نداره بخدا، برای این کار نیازه که Node.js رو نصب کرده باشی که می‌تونی بری توی سایتش و نسبت به سیستم عاملتون فایلش رو دانلود کنید و نصب و تمام.

این از اولش. بعدش هرجا که دلتون خواست، یه فایل بسازید مثلا example.js و توش یه کد خیلی خیلی ساده جاوااسکریپت بنویسید. مثلا بنویسید:

console.log('Hello World!');

خوب حالا محیط کامندیتون رو باز کنید، توی ویندوز مثلا cmd یا power shell و توی لینوکس و مک هم terminal و با اون به مکانی برید که فایل example.js داخلش وجود داره. حالا تایپ کنید:

node example.js

و خروجی رو همونجا می‌تونید ببینید. دیدید؟ خیلی ساده، همین الآن شما یه Node.js کار شدید. البته که راه زیادی در پیش دارید. برای نوشتن یه برنامه کامل با زلم زیمبوهای خاص خودش خیلی چیز‌ها نیازه. آشنایی با API ها و فریمورک‌ها و هزار‌ان چیز دیگه که من پیشنهاد می‌کنم به منابع انگلیسی زبان مراجعه کنید. برای شروع پیشنهاد من کورس زیر هست:

Lynda Node.js Essential Training


امیدوارم این مقاله به کارتون بیاد. شاد و موفق باشید.