دولوپر فرانتاند - علاقمند به جاوااسکریپ (تایپاسکریپت)، ریاکت، ریاکتنیتیو - فرانتاند دولوپر سابق دیجیکالا، دیجیکالامگ، شیپور و سیبچه
واقعا Node.js چیه؟!
همه جا این رو میخونیم که Node.js
یک محیط اجرایی برای زبان جاوااسکریپت
هست، خوب!؟ ایول! ولی این دقیقا یعنی چی؟ مگه قرار نبود جاوااسکریپت
توی مرورگر اجرا بشه؟ پس فاز چیه؟
ببینید محیط اجراییه Node.js
فضا و تمام اون چیزهایی که نیازه که کدهای نوشته شده جاوااسکریپت
اجرا بشه رو داره. مثلا به این شکل نگاه کنید:
در واقع Node.js
از اونجایی اومد که برنامه نویسهای جاوااسکریپت
تصمیم گرفتن که فرای این باشن که فقط خلق مسائل خارق العاده توی مرورگر کنن.
جاوااسکریپت
هم توانایی و پتانسیل این رو داشت که مثل زبانهای اسکریپتیه دیگه مثلا پایتون
باشه و بتونه توی محیط غیر از مرورگر کار کنه.
همونطور که توی عکس بالا میبینید، نشون دادم که موتور اصلی Node.js
در واقع V8
هست، توی مرورگر هم همینه، اونجا هم V8
داره کار میکنه. این سوال در ذهن همه تداعی میشه که موتور چیه؟
موتور 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
جاوااسکریپت
چطوری کار میکنه، به شکل زیر توجه کنید:
مرحله به مرحله میخوام توضیح بدم که قشنگ متوجه بشید داستان چیه:
- تابع
main
به استک اضافه میشه. - تابع
console.log('Starting app')
به استک اضافه میشه. اجرا میشه و از استک میاد بیرون. - تابع
setTimeout(2000)
به استک اضافه میشه.setTimeout(2000)
ازAPI
هایNode.js
هست. زمانی که صداش میزنیم تا اجراش کنیم در واقع اون رو توی لیستNode APIs
ثبت میکنیم. اون صبر میکنه به اندازه زمانی که بهش دادیم که اینجا ۲۰۰۰ میلی ثانیه هست و بعد تابعcallback
خودش رو به صف اضافه میکنه. - بعد از اینکه توی
Node APIs
ثبت شد، خودsetTimeout(2000)
از استک میاد بیرون. - حالا میرسیم به
setTimeout(0)
که اون هم مثل دوست اولیش باهاش برخورد میشه. در لیستNode APIs
ثبت میکنیم و از استک میاد بیرون. - این دو عزیز صبر میکنن که زمانشون تمام بشه، بعد هر کدوم تابعهای
callback
مربوط به خودشون رو توی صف قرار میدن. طبیعی هست که هر کسی زودتر، تابعcallback
اون هم توی صف جلوتره، اینجاsetTimeout
دومی چون زمانش صفر بود،callback
ش زودتر میره توی صف و ۲۰۰۰ میلی ثانیه یا به عبارتی ۲ ثانیه بعدsetTimeout
اولیcallback
ش رو میفرسته توی صف و میشه نفر دوم صف. - اینجا
event loop
مراقب هست که اول استک خالی بشه و بعد به ترتیب توابع داخل صف رو اجرا کنه. - آخرین تابع یعنی
console.log('Finishing up')
هم به استک اضافه میشه، اجرا میشه و از استک خارج میشه و بعد اون همmain
خارج میشه. - حالا استک خالیه و
event loop
صف رو تک به تک شروع به اجرا میکنه. اولی تابعconsole.log('Second setTimeout')
و بعدش همconsole.log('Inside of callback')
و تمام. - اینطوری میشه که شما خروجی کدی که توی عکس هست رو اینطوری میبینید:
"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
امیدوارم این مقاله به کارتون بیاد. شاد و موفق باشید.
مطلبی دیگر از این انتشارات
جاوا اسکریپت چه جوری کار میکنه؟ دل و روده ی V8 engine و ۵ تا نکته در مورد کد بهینه نوشتن
مطلبی دیگر از این انتشارات
انپیام(NPM) در +1500 کلمه!
مطلبی دیگر از این انتشارات
فیلتر ها در جاوا اسکریپت