Node.js یک محیط Runtime جاوااسکریپت است. این به نظر خوب میآید، اما به چه معناست؟ دقیقا چگونه کار میکند؟ این محیط شامل هر چیزی است، که شما برای اجرای یک برنامه نوشته شده در JavaScript نیاز دارید.
Node.js وقتی به وجود آمد که توسعه دهندگان اصیل JavaScript، آن را از چیزی که فقط میتوانید در مرورگر اجرا کنید، به چیزی که میتوانید بر روی یک دستگاه به عنوان یک برنامه مستقل اجرا کنید، گسترش دادند. حال میتوانید کارهای بیشتر نسبت به تعاملی کردن وبسایتها با استفاده از JavaScript انجام دهید.
در حال حاضر JavaScript قدرت انجام کارهایی را دارد که دیگر زبانهای اسکریپتنویسی مانند Python ندارند.
هم JavaScript مرورگر شما و هم Node.js بر روی موتور runtime جاوااسکریپت V8 اجرا میشوند. این موتور کد JavaScript شما را میگیرد و آن را به یک کد ماشین (Machine Code) سریعتر تبدیل میکند. کد ماشین، یک کد سطح پایین است که کامپیوتر میتواند بدون نیاز به تفسیر آن، اجرایش کند.
چرا Node.js؟
در اینجا تعریفی را مشاهده میکنید که در بر روی وبسایت اصلی Node.js وجود دارد:
«Node.js یک runtime جاوااسکریپت است که بر پایه موتور جاوااسکریپت V8 کروم ساخته شده است.
Node.js از یک مدل رانده شده توسط رویداد و بدون مسدود کردن I/O استفاده میکند، که باعث میشوند سبک و موثر باشد.
اکوسیستم پکیج Node.js، یعنی npm، بزرگترین اکوسیستم کتابخانههای اوپن سورس موجود است.»
ما به بخش اول این تعریف، یعنی « Node.js یک runtime جاوااسکریپت است که بر پایه موتور جاوااسکریپت V8 کروم ساخته شده است.» رسیدگی کردیم. حال بیایید دو بخش دیگر را نیز درک کرده، و ببینیم که چرا Node.js اینقدر معروف است.
I/O به input / output (ورودی / خروجی) اشاره دارد. این اصطلاح میتواند هر چیزی از خواندن / نوشتن فایلهای محلی گرفته تا فرستادن درخواستهای HTTP به یک API باشد. I/O زمان میبرد و از این رو دیگر عملکردها را مسدود میکند. موقعیتی را تصور کنید که در آن از یک دیتابیس Backend برای جزئیات کاربر ۱ و کاربر ۲ درخواست میکنیم، و سپس آنها را بر روی صفحه / کنسول چاپ میکنیم. پاسخ برای این درخواست زمان میبرد، اما هر دو درخواستهای داده کاربر میتوانند به صورت مستقل و در یک زمان انجام شوند.
مسدود کردن I/O
در متد مسدود کردن، درخواست دادههای کاربر ۲ تا وقتی که دادههای کاربر ۱ به صفحه برسند، آغاز نمیشود.
اگر این یک وب سرور بود، باید برای هر کاربر جدید، یک thread جدید شروع میکردیم. اما جاوااسکریپت به صورت single-thread کار میکند. پس این باعث میشود JavaScript برای عملیاتهای چند threadای مناسب نباشد.
بخش بدون مسدود کردن I/O، در اینجا به میان میآید.
بدون مسدود کردن I/O
در سمت دیگر و هنگام استفاده از یک درخواست بدون مسدود کردن، میتوانید یک درخواست داده را برای کاربر ۲، بدون منتظر ماندن برای پاسخ کاربر ۱ آغاز کنید. همچنین میتوانید هر دو درخواست را به صورت موازی آغاز کنید.
حلقه رویداد JavaScript
در اینجا یک توضیح قدم به قدم از نحوه کار حلقه رویداد JavaScript را میبینید:
- main() را به call stack منتقل کن.
- console.log() را به call stack منتقل کن. سپس این سریعا اجرا شده، و نمایش داده میشود.
- setTimeout(2000) را به call stack منتقل کن. setTimeout(2000) یک API نود است. هر زمان که آن را فراخوانی میکنیم، جفت callback رویداد را نیز ثبت میکنیم. این رویداد ۲۰۰۰ میلی ثانیه صبر میکند، و سپس تابع callback را اجرا میکند.
- پس از ثبت در APIها، set.Timeout(2000) از cell stack بیرون میآید.
- حال set.Timeout(0) دوم به همین صورت ثبت میشود. در اینجا ما دو API نود داریم که منتظر اجرا شدن هستند.
- سپس بدون صبر کردن، set.Timeout(0) به صف callback منتقل میشود و همین اتفاق برای set.Timeout(2000) نیز میافتد.
- در صف callback، توابع منتظر میمانند تا call stack خالی شود؛ زیرا فقط یک بیانیه در آن واحد میتواند اجرا شود. حلقه رویداد به این مسئله رسیدگی میکند.
- آخرین console.log() اجرا میشود، و main() از call stack بیرون میآید.
- حلقه رویداد میبیند که call stack خالی است، ولی صف callback خالی نیست. پس callbackها را به برای اجرا شدن به call stack منتقل میکند.
npm
اینها کتابخانههایی هستند که توسط جامعه شگفتانگیز ساخته شدهاند و اکثر مشکلات عمومی را حل میکنند. nom (node package manager) پکیجهایی را دارد که میتوانید در برنامه خود استفاده کنید، تا روند توسعه خود را سریعتر و موثرتر کنید.
Require
Require سه کار را انجام میدهد:
- ماژولهایی مانند سیستم فایل و HTTP که با نودجیاس bundle شدهاند را از اِیپیآی Node.js بارگذاری میکند.
- کتابخانههای ثالث مانند Express و Mongoloose که از npm نصب میکنید را بارگذاری میکند.
- شما را قادر میسازد تا فایلهای خود را require کرده، و پروژه خود را ماژولار کنید.
Require یک تابع است، که یک پارامتر به نام path را دریافت کرده، و module.exports را بر میگرداند.
ماژولهای Node
یک ماژول Node، یک بلوک کد با قابلیت استفاده مجدد است، که وجودش کد دیگری را تحت تاثیر قرار نمیدهد.
میتوانید ماژولهای شخصی خود را بنویسید و از آنها در برنامههای مختلف استفاده کنید. Node.js مجموعهای از ماژولهای داخلی دارد که میتوانید بدون هیچگونه فرایند نصب استفاده کنید.
توربو شارژ V8 با بهرهگیری از C++ برای JavaScript
V8 یک موتور runtime اوپن سورس، نوشته شده در C++ است. V8 اسکریپتی به نام ECMAScript را به کار میگیرد. ECMAScript توسط سازمان Ecma International ساخته شد تا JavaScript را استاندارد سازی کند.
V8 میتواند به صورت مستقل اجرا شود، یا میتواند در برنامههای C++ شما پیادهسازی شود. این ابزار قابلیت این را دارد که کد C++ خود را بنویسید، و آن را در JavaScript به کار بگیرید.
اساسا V8 شما را قادر میسازد تا امکاناتی را با پیادهسازیاش به کد C++ خود اضافه کنید، تا کد C++ شما بیش از آنچه استاندارد ECMAScript مشخص میکند را درک کند.
رویدادها
اتفاقی که در برنامه ما افتاده است و میتوانیم نسبت به آن پاسخ دهیم. دو نوع رویداد در Node وجود دارند.
- رویدادهای سیستم: هسته C++ از کتابخانهای به نام libuv. (برای مثال: «خواندن یک فایل تمام شد.»)
- رویدادهای سفارشی: هسته JavaScript.
نوشتن «Hello World» در Node.js
این یک کار رایج در برنامهنویسی است. برای انجام این کار در Node.js، فایلی به نام app.js بسازید و این کد را در آن قرار دهید:
console.log("Hello World!");
ترمینال Node خود را باز کرده، شاخه مربوطه را به جایی که فایل را در آن ذخیره کردهاید تغییر دهید و دستور node app.js را اجرا کنید.
و به همین راحتی، این کار را در Node.js به اتمام رساندید.
دیدگاه و پرسش
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید