آشنایی با زبان برنامه نویسی تحت وب node.js
Node.js چیست؟ چگونه به وجود آمد؟
در سال ۲۰۰۹ شخصی با نام Ryan Dahl که متولد کالیفرنیای آمریکاست، Node js را معرفی کرد. اما داستان خلق شدن نود جی اس چیست؟ آقای رایان دال ابتدا خود از زبان Ruby برای برنامه نویسی استفاده می کرد. اما با مشاهده نوار پیشرفتی که در سایت Flickr وجود داشت و بدرستی کار نمی کرد او را به این فکر انداخت تا بتواند با اتصال این نوار پیشرفت با سرور بتواند میزان دقیق پیشرفت کار را از سرور به صورت لحظه ای دریافت و بر روی نوار پیشرفت به نمایش گذارد. به این منظور رایان توسعه node js را آغاز کرد و آن را معرفی کرد.
Node js پلتفرم سمت سرور مبتنی بر موتور V8 جاوا اسکریپت گوگل کروم است. آقای رایان با خلق Node.js ثابت کرد که جاوا اسکریپت قدرتمند ترین از این حرف هاست و با آن میتوان به راحتی برنامه های جاوا اسکریپتی را سمت سرور اجرا کرد. همچنین نود جی اس برای پیاده سازی برنامه های بزرگ و پر مصرف بسیار مناسب است و بهترین عملکرد را دارد.
Node.js یک محیط با منبع آزاد و زمان اجرا متقابل است که برای توسعه برنامه های وب، سمت سرور استفاده می شود. برنامه های Node.js به زبان جاوا اسکریپت نوشته شده اند و می توان آنها را با طیف گسترده ای از سیستم عامل ها اجرا کرد. Node.js مبتنی بر معماری رویداد محور و ورودی / خروجی API غیر مسدود) non-blocking Input/Output API (است که به منظور بهینه سازی بازدهی برنامه های کاربردی و مقیاس پذیری برنامه های وب در زمان واقعی طراحی شده است.
برنامه وب مدرن در طی سالیان طولانی با معرفی بسیاری از فریم ورک های محبوب مانند bootstrap ، Angular JS و غیره ، محبوب واقع شده است و همه این چهارچوب ها بر اساس JavaScript ساخته شده اند.
اما وقتی نوبت به توسعه برنامه های مبتنی بر سرور رسید ، به نوعی از درجه اعتبار ساقط شد و اینجاست که Node.js وارد صحنه شد. Node.js همچنین بر اساس چارچوب JavaScript است ، اما برای توسعه برنامه های مبتنی بر سرور استفاده می شود. در حالی که کل آموزش را می گذرانیم ، با جزئیات به Node.js می پردازیم و چگونگی استفاده از آن برای توسعه برنامه های مبتنی بر سرور می توانیم استفاده کنیم.
در یک دوره زمانی طولانی ، چارچوب موجود برای توسعه وب ،همگی براساس یک مدل بدون قاعده بود. یک مدل بدون قاعده در جایی است که داده های تولید شده در یک جلسه (مانند اطلاعات مربوط به تنظیمات کاربر و وقایعی که رخ داده اند) برای استفاده در جلسه بعدی با آن کاربر حفظ نمی شوند. برای حفظ اطلاعات هر جلسه بین درخواست های یک کاربر باید کار زیادی انجام شود. اما با Node.js ، سرانجام راهی وجود دارد که برنامه های وب بتوانند اتصالات دو طرفه را در زمان واقعی(Real Time) داشته باشند ، جایی که مشتری و سرور می توانند ارتباط برقرار کنند و به آنها امکان تبادل آزاد داده ها را می دهند.
روش کار Node js
nodejs (نود جی اس) از مدل io استفاده می کند. مدل i/o یک انتخاب عالی برای پیاده سازی برنامه های Real time است. این مدل در Node js به ما این امکان را می دهد تا برنامه هایی که دارای ورودی/خروجی بالایی هستند سرعت بهتری را تجربه کنیم و تبادل اطلاعات با سرعت بالایی انجام می گیرد. برنامه های Real time برنامه هایی هستند که تبادل اطلاعات در آنها با سرعت بالا و لحظه ای صورت می گیرد. از مهمترین برنامه های Real time میتوان شبکه های اجتماعی و ابزارهای چت را نام برد. امروزه به علت سرعت پردازش بالای اطلاعات توسط Node js و پاسخگویی به تعداد بالایی از درخواست ها در لحظه و همچنین راحتی پیاده سازی برنامه های Real time به علت وجود کتابخانه های خوبی مانند Socket.io بسیاری از برنامه نویسان و سایت ها به خصوص استارتاپ های بزرگ به Node js کوچ می کنند.
آیا Node.js فریمورک است؟
فریمورک به مجموعه ای از کتابخانه ها و ابزار ها گفته می شود که کار برنامه نویس را آسان کرده و از زیاد و دوباره نویسی کدها جلوگیری میکند. اما در ارتباط با نود جی اس اینگونه نیست و چیزی فراتر از یک فریمورک است! جاوا اسکریپت دارای فریمورک های بسیاری قوی چون React js ، Angular و Vue.js است که در پیاده سازی وب اپلیکیشن ها بسیار قدرتمند عمل می کنند.
اما Node js در واقع یک run-time environment یا محیط اجرایی مبتنی بر جاوا اسکریپت است و کاربردهای آن بسیار بیشتر از یک فریمورک است. ما از Node js علاوه بر توسعه برنامه های وب میتوانیم در Rest APi ها، رباتیک، میکروکنترلرها و … استفاده کنیم.
آشنایی با مهم ترین ویژگی های Node js
بازدهی و سرعت بالا Node js
Node js همانطور که گفتیم از موتور V8 استفاده می کند اما نکته ای باعث افزایش سرعت و باردهی نود می شود استفاده از C++ در کنار موتور V8 است. نود جی است و C++ همیشه و مرتب آپدیت شده و مشکلات امنیتی آن رفع می شود. در Node js از فرمت JSON برای تبادل اطلاعات استفاده می شود که تاثیر چشم گیری در سرعت و عملکر آن دارد. اصلا مهم ترین دلیل محبوبیت بالای Node js سرعت اجرا آن است.
یک بار بنویس همجا اجرا کن (Node js کراس پلتفرم است)
اگر شما میتوانید برنامه تحت وب با Node js و جاوا اسکریپت بنویسید پس با کمک فریمورک هایی مانند Electron.js قادر خواهید بود بدون هیچگونه دانشی در ارتباط با زبان های مانند C# یا Object C که برای ساخت برنامه های Native استفاده می شوند، به راحتی برنامه های تحت دسکتاپ بنویسید و از همان کدهای توسعه تحت وب استفاده کنید.
رابطه خوب Node js با میکروسرویس ها
معمولا تمام پروژه ها در ابتدا کار ساده هستند و با روش های متداول پیاده سازی و برنامه نویسی می شوند. اما با گذشت زمان و افزایش کاربران پروژه، برای توسعه امکانات و ماژول های جدید و همچنین نگهداری کد برنامه در اسکیل بزرگ ممکن است تیم توسعه دهنده با مشکل و چالش های مختلفی روبرو شوند. یکی از بهترین روش های مدیریت و توسعه پروژه های عظیم استفاده از میکروسرویس است.
در میکروسرویس ها یک پروژه بزرگ به بخش های کوچک تبدیل شده که هر بخش می تواند توسط یک تیم مجزا و زبان برنامه نویسی مجزا مدیریت شود. این کار باعث افزایش سرعت توسعه و رفع خطا و نگهداری کد می شود. Node js در کار با میکروسرویس ها بسیار عالی عمل کرده و سرعت بالایی را در اختیار ما قرار می دهد.
npm فراموش نشود
nmp یک package manager قدرتمند است که Node js از آن استفاده می کند. ما میتوانیم با استفاده از npm بسته های نوشته شده با زبان جاوا اسکریپت را به راحتی در Node js نصب کرده و از آنها استفاده کنیم.
امروزه بسیاری از فریمورک ها به خصوص فریمورک ها و ابزار های جاوا اسکریپتی از npm استفاده می کنند.
با Node js چه می توان ساخت (کاربردهای Node js)
ساخت برنامه های SPA (تک صفحه ای)
یکی از مهمترین ویژگی های Node js برنامه نویسی asynchronous (نامتقارن) است که بسیار مناسب ساخت برنامه های SPA است. در برنامه های تک صفحه ای تمام بخش ها در یک صفحه پیاده می شود. معمولا از فرمیورک هایی مانند React.js و Angular یا Vue.js برای ساخت چنین برنامه هایی استفاده می شود.
ساخت برنامه های Real time
Node js به لطف وجود ابزار هایی مانند Socket.io انتخاب اول برای ساخت و پیاده سازی برنامه های Real time به شمار میاد. برنامه های Real time برنامه هایی هستند که دارای ورودی/خروجی بالایی در لحظه هستند.
ساخت برنامه های چت و بازی آنلاین
چت روم ها یکی از نمونه های برنامه های Real time هستند. چت روم ها دارای ویژگی هایی مانند سرعت بالای ارسال پیام، امنیت، ترافیک بالا و سبک بودن هستند که با زبان Node js و فریمورک قدترمند آن یعنی EXPRESS.js به همراه دیتابیس MongoDB به راحتی قادر خواهید بود بهترین برنامه های چت را بسازید.
حالا چقدر عالی میشه که در کنار این برنامه چت بازی دو بعدی هم ارائه کنید تا کاربران به بازی بپردازند. با استفاده از Node.js و ابزارهایی مانند Socket.io به راحتی هرچه تمام میتوان بازی های دو بعدی در سمت سرور پیاده سازی کرد و با استفاده از HTML و CSS بهترین رابط کاربری و محیط بازی را ساخت.
ویژگی های Node.js
بیایید نگاهی به برخی از ویژگیهای اصلی Node.js بیندازیم
۱- مبتنی بر رویداد های ناهمزمان است و به رسیدگی درخواست های همزمان کمک می کند – این احتمالاً مهمترین نقطه فروش Node.js است. این ویژگی اساساً بدین معنی است که اگر یک درخواست برای برخی از عملیات ورودی / خروجی توسط نود دریافت شود ، عملیات را در پس زمینه انجام داده و با پردازش سایر درخواست ها ادامه می دهد.
var fs = require('fs');
fs.readFile("Sample.txt",function(error,data)
{
console.log("Reading Data completed");
});
- قطعه کد بالا به خواندن پرونده ای به نامtxt نگاهی می اندازد. در سایر زبانهای برنامه نویسی ، خط بعدی پردازش فقط هنگامی اتفاق می افتد که کل پرونده خوانده شود.
- اما در موردjs بخش مهمی از کد که باید آن را اعلام کند ، اعلان فراخوانی تابع (“تابع (خطا ، داده)”) است. این به عنوان یک تابع برگشتی شناخته می شود.
- بنابراین آنچه در اینجا اتفاق می افتد این است که عملیات خواندن پرونده در پس زمینه( background )شروع می شود. و پردازش دیگر، می تواند همزمان هنگام خواندن( read )پرونده اتفاق بیفتد. پس از اتمام کار خواندن پرونده ، تابع ناشناس فراخوانی می شود و متن “خواندن داده ها به پایان رسید” به کنسول لوگ نوشته می شود.
۲- نود از موتور V8 JavaScript Runtime استفاده می کند ، همان موردی است که توسط Google Chrome استفاده می شود. گره روی موتور جاوا اسکریپت بسته ای دارد که باعث می شود کار موتور زمان اجرا بسیار سریع تر شود و از این رو پردازش درخواست ها در نود نیز سریعتر می شود.
۳- رسیدگی به درخواست های همزمان – یکی دیگر از قابلیت های کلیدی Node امکان انجام اتصالات همزمان با یک سربار بسیار کم در یک فرآیند واحد است.
۴- کتابخانه Node.js از JavaScript استفاده می کند – این یکی دیگر از جنبه های مهم توسعه در Node.js است. بخش عمده ای از جامعه درحال توسعه در حال حاضر به خوبی از جاوا اسکریپت آگاهی دارند و از این رو توسعه در Node.js برای توسعه دهنده ای که جاوا اسکریپت را می شناسند آسان تر می شود.
۵- یک انجمن فعال و پر جنب و جوش برای چارچوب Node.js وجود دارد. به دلیل جامعه فعال ، همیشه به روزرسانی های کلیدی وجود دارد که در اختیار این فریم ورک قرار گرفته است. این کمک می کند تا چارچوب ان همیشه با آخرین روند توسعه وب به روز باشد.
چه کسانی از Node.js استفاده می کنند
Node.js توسط بسیاری از شرکتهای بزرگ استفاده می شود. در زیر لیستی از تعدادی از آنها آورده شده است.
- پی پال – بسیاری از سایت های درون پی پال نیز انتقال بهjs. را آغاز کرده اند.
- LinkedIn – LinkedIn با استفاده ازjs به سرورهای تلفن همراه خود ، که به iPhone ، Android و محصولات وب تلفن همراه هستند قدرت می دهد.
- موزیلاjs را برای پشتیبانی از API های مرورگر پیاده سازی کرده است که دارای نیم میلیارد نصب است.
- eBay میزبان سرویس HTTP API در js است.
چه زمانی باید از Node.js استفاده کنیم
Node.js در اپلیکیشن های جریان یا زمان واقعی مبتنی بر رویداد بهترین استفاده را دارد.
- برنامه های چت
- سرورهای بازی – سرورهای سریع و کارآمد که نیاز به پردازش هزاران درخواست در یک زمان دارند ، پس این یک چارچوب ایده آل است.
- محیط اجباری خوب – این برای محیط هایی که اسناد را مدیریت می کنند خوب است. در یک محیط مدیریت اسناد ، شما دارای چندین نفر خواهید بود که اسناد خود را ارسال کرده و با بررسی و چک کردن اسناد ، تغییرات مداوم را انجام می دهید. بنابراین Node.js برای این محیط ها مناسب است زیرا حلقه رویداد در Node.js می تواند باعث شود هر زمانی، اسناد در یک محیط مدیریت شده تغییر کند.
- سرورهای تبلیغاتی – مجدداً در اینجا می توانید هزاران درخواست برای جلب تبلیغات از سرور مرکزی داشته باشید و Node.js می تواند یک چارچوب ایده آل برای رسیدگی به این امر باشد.
- سرورهای جریان – یکی دیگر از سناریو های ایده آل برای استفاده ازNode.js برای سرورهای جریان چندرسانه ای است که در آن مشتری درخواست کرده است تا محتوای مختلف چندرسانه ای را از این سرور بیرون بکشد.
Node.js زمانی خوب است که به سطح بالایی از همزمانی نیاز دارید اما مقدار کمتری از زمان اختصاصی CPU را دارید. مهمتر از همه ، از آنجا که Node.js بر روی جاوا اسکریپت ساخته شده است ، برای ساخت برنامه های سمت مشتری که بر اساس همان چارچوب جاوا اسکریپت ساخته شده ، مناسب است.
چه زمانی از Node.js استفاده نکنید
Node.js را می توان برای بسیاری از برنامه ها با اهداف مختلف استفاده کرد. تنها سناریویی که نباید از آن استفاده شود مکان هایی است که زمان پردازش طولانی در آن وجود دارد ، که توسط برنامه مورد نیاز است. گره به صورت تک رشته ای ساخته شده است. اگر یک برنامه کاربردی برای انجام برخی از محاسبات طولانی مدت، در پس زمینه لازم باشد ، دیگر نمی تواند درخواست های دیگری را پردازش کند. همانطور که در بالا گفته شد ، Node.js بهترین استفاده ان در جایی است که پردازش، به زمان CPU کمتری نیاز دارد.
Node.js یک محیط «زمان اجرا» (Runtime) برای زبان برنامهنویسی جاوا اسکریپت است. محیط زمان اجرای Node.js شامل هر موردی است که برای اجرای برنامههای نوشته شده به زبان جاوا اسکریپت لازم است.
Node.js زمانی متولد شد که توسعهدهندگان اصلی جاوا اسکریپت آن را از چیزی که میتوانست روی مرورگر اجرا شود، به حالتی بسط دادند که بتواند به صورت یک اپلیکیشن مستقل روی رایانه اجرا شود. اینک ما میتوانیم کارهای بسیار بیشتری با جاوا اسکریپت انجام دهیم و هدفمان صرفاً ایجاد تعاملپذیری در وبسایتها نیست.
جاوا اسکریپت در حال حاضر ظرفیت انجام کارهایی را یافته است که زبانهای اسکریپتنویسی دیگر مانند پایتون نیز میتوانند انجام دهند. هم جاوا اسکریپت مرورگر و هم Node.js روی موتور زمان اجرای V8 اجرا میشوند. این موتور کد جاوا اسکریپت را گرفته و آن را به کد سریع برای ماشین تبدیل میکند. کد ماشین کد سطح پایینی است که رایانه میتواند بدون نیاز به تفسیر کردن اجرا کند.
چرا باید از Node.js استفاده کرد؟
چه چیزی این فریم ورک را بسیار مشهور می کند؟ با گذشت سالها ، بیشتر برنامه ها بر اساس یک چارچوب درخواست -پاسخ بدون قاعده انجام شده است. در این نوع برنامه ها ، توسعه دهنده باید اطمینان حاصل می کرد که کاربر در حالی که با سیستم کار می کرد ، از قرار دادن کد مناسب استفاده کرده است. اما با برنامه های وب Node.js ، اکنون می توانید در زمان واقعی ((Real Time کار کنید و ارتباطی دو طرفه برقرار کنید. وضعیت حفظ می شود و مشتری یا سرور می توانند ارتباط را شروع کنند.
تعریف رسمی ارائه شده از سوی وبسایت Node.js چنین است:
Node.js یک محیط زمان اجرای جاوا اسکریپت است که بر مبنای موتور جاوا اسکریپت V8 کروم ساخته شده است.
Node.js از مدل رویداد-محور و غیر مسدودکننده I/O بهره میگیرد که آن را سبک و کارآمد ساخته است. اکوسیستم بسته Node.js یعنی npm بزرگترین اکوسیستم کتابخانههای متن-باز در دنیا محسوب میشود.
توضیح دادیم که Node.js یک محیط زمان اجرای جاوا اسکریپت است. در ادامه به بررسی بخشهای دیگر تعریف فوق میپردازیم تا دلیل محبوبیت روزافزون آن را بهتر درک کنیم.
منظور از I/O در تعریف رسمی Node.js همان «ورودی/خروجی» (Input/Output) است. این ورودی/خروجی میتواند هر چیزی از خواندن/نوشتن فایلهای محلی تا ایجاد یک درخواست HTTP به یک API باشد. عملیات I/O زمانبر است و از این رو موجب مسدود شدن کارکردهای دیگر میشود.
برای نمونه تصور کنید ما از یک پایگاه داده در بکاند درخواست میکنیم که جزییات کاربر user1 و user2 را ارسال کند و سپس آنها را روی صفحه یا کنسول نمایش میدهیم. پاسخ دادن به این درخواست ما زمانی طول میکشد؛ اما هر دو درخواست دادههای کاربر میتوانند به صورت مستقل از هم و به طور همزمان اجرا شوند.
مسدودسازی I/O
در روش مسدودسازی، درخواست دادههای user2 تا زمانی که دادههای user1 روی صفحه نمایش نیافته است ارسال نخواهد شد.
اگر این یک سرور وبسایت باشد، باید یک نخ تازه برای هر کاربر جدید آغاز کنیم. اما جاوا اسکریپت «تکنخی» (single-threaded) است. البته مفهوم تکنخی جزو ماهیت بنیادی جاوا اسکریپت نیست؛ اما حلقه رویداد آن تکنخی است. این موضوع را در ادامه بیشتر بررسی میکنیم. از این رو جاوا اسکریپت برای اجرای وظایف «چندنخی» (multi-threaded) چندان مناسب نیست.
عدم مسدودسازی I/O
از سوی دیگر، با استفاده از یک درخواست غیر مسدودکننده میتوانیم بدون نیاز به منتظر شدن برای دریافت دادههای کاربر user1، یک درخواست داده برای user2 ارسال کنیم. در واقع هر دو درخواست به صورت موازی آغاز میشوند.
این رویکرد عدم مسدودسازی I/O نیاز به چندنخی را حذف میکند، زیرا سرور میتواند چندین درخواست را به صورت همزمان مدیریت کند. در ادامه به توضیح گام به گام مختصری در مورد طرز کار حلقه رویداد جاوا اسکریپت میپردازیم.
- ()main به «پشته فراخوانی» (Call Stack) «پوش» (push) میشود.
- ()console.log به پشته فراخوانی push میشود و سپس شروع به اجرا کرده و pop میشود.
- (setTimeout(2000 به پشته push میشود. (setTimeout(2000 یک API برای Node است. زمانی که آن را فراخوانی میکنیم یک جفت رویداد-callback ثبت میکنیم. رویداد به مدت ۲۰۰۰ میلیثانیه منتظر میماند و سپس تابع callback اجرا میشود.
- پس از ثبت کردن آن در API–ها، (setTimeout(2000 از پشته فراخوانی pop میشود.
- اینک (setTimeout(0 به ترتیبی ثبت میشود. در این زمان دو API برای Node داریم که منتظر اجرا هستند.
- پس از این که به مدت ۰ ثانیه منتظر ماندیم، (setTimeout(0 به صف callback منتقل میشود و همان اتفاقی که برای (setTimeout(2000 افتاد تکرار میشود.
- در صف callback، تابعها منتظر میمانند تا پشته فراخوانی خالی شود؛ چون هر زمان تنها یک گزاره میتواند اجرا شود. اجرای این کار بر عهده حلقه رویداد است.
- دستور آخر ()console.log اجرا میشود و ()main از پشته فراخوانی pop میشود.
- حلقه رویداد میبیند که پشته فراخوانی خالی شده است و صف callback خالی نیست. بنابراین (با ترتیب FIFO) این callback-ها برای اجرا به پشته فراخوانی منتقل میشوند.
NPM
کتابخانههایی وجود دارند که از سوی جامعه بزرگی از توسعهدهندگان تولید شدهاند. این جامعه به حل اغلب مسائل عمومی پرداخته است. npm که اختصاری برای «نرمافزار مدیریت بسته Node» یعنی (Node Package Manager) است بستههایی دارد که میتوان در اپلیکیشنها مورد استفاده قرار داد و بدین ترتیب فرایند توسعه اپلیکیشن را سریعتر و کارآمدتر ساخت.
Require
Require سه کار را انجام میدهد:
- ماژولهایی مانند سیستم فایل و HTML را که با Node.js بستهبندی شدهاند از API مربوط به Node.js بارگذاری میکند.
- کتابخانههای شخص ثالث مانند Express و Mongoose را که از npm نصب میشوند بارگذاری میکند.
- امکان require کردن فایلهای خودتان را فراهم میسازد و بدین ترتیب امکان ماژولهسازی پروژه را ایجاد میکند.
Require یک تابع است و پارامتری به نام path میپذیرد و مقدار module.exports را بازگشت میدهد.
ماژولهای Node
یک ماژول Node به بلوک با قابلیت استفاده مجدد گفته میشود که وجود آن به صورت تصادفی روی کدهای دیگر تأثیر نمیگذارد. هرکسی میتواند ماژولهای خاص خود را بنویسد و در اپلیکیشنهای مختلف مورد استفاده قرار دهد. Node.js مجموعهای از ماژولهای داخلی دارد که میتوان بدون نیاز به نصب چیز دیگری مورد استفاده قرار داد.
V8 با بهرهگیری از ++C موجب ارتقای جاوا اسکریپت شده است
V8 یک محیط زمان اجرای اوپنسورس است که در ++C نوشته شده است. فرایند کار به صورت زیر است:
۱
|
JavaScript –> V8(C++) –> Machine Code
|
V8 اسکریپتی به نام ECMAScript را پیادهسازی کرده است. ECMAScript از سوی بنیاد بینالمللی Ecma برای استانداردسازی جاوا اسکریپت ایجاد شده است.
V8 میتواند به صورت مستقل اجرا شود و یا در یک اپلیکیشن ++C جاسازی شود. V8 دارای قلابهایی است که امکان نوشتن کد ++C را به ما میدهد که میتواند متعاقباً در اختیار جاوا اسکریپت قرار گیرد.
این وضعیت اساساً به ما امکان میدهد که با جاسازی V8 در کد ++C ویژگیهایی به جاوا اسکریپت اضافه کنیم به طوری که کد ++C قابلیت درک بیشتری از آن چه ECMAScript تعیین کرده است داشته باشد.
دقت کنید که به جز V8 که از سوی کروم عرضه شده موتورهای زمان اجرای زیادی برای جاوا اسکریپت وجود دارند که شامل SpiderMonkey از سوی فایرفاکس، Chakra از سوی مایکروسافت و غیره میشود.
رویدادها
رویداد چیزی است که در اپلیکیشن رخ میدهد و میتوان به آن پاسخ داد. دو نوع رویداد در Node.js وجود دارند.
- رویدادهای سیستمی: که از هسته ++C از یک کتابخانه به نام libuv ناشی میشوند، مانند اعلام پایان یافتن دانلود یک فایل.
- رویدادهای سفارشی: هسته جاوا اسکریپت.
نوشتن برنامه Hello World در Node.js
بالاخره هیچ راهنمایی در مورد یک زبان برنامهنویسی بدون معرفی روش نوشتن Hello World کامل محسوب نمیشود. یک فایل به نام app.js ایجاد کنید و کد زیر را در آن قرار دهید:
console.log(“Hello World!”);
ترمینال Node خود را باز کنید، دایرکتوری خود را به پوشهای که فایل در آن ذخیره شده تغییر دهید و دستور زیر را اجرا کنید:
node app.js
بدین ترتیب موفق شدهایم نخستین برنامه خود را در Node.js بنویسیم.
Node.js (نودجیاس) چیست؟
Node.js یک محیط سمت سرور برای اجرای کدهای JavaScript است؛ اما سؤال اینجا است که این گزاره به چه معنا است و اساساً چنین محیط اجرایی چگونه کار میکند؟
Node Run-time Environment (محیط اجرای نُود) همه قابلیتهایی را شامل میشود که یک دولوپر جاوااسکریپت برای اجرای اسکریپتهای خود نَه در سمت فرانتاند، بلکه در سمت بکاند (سرور) به آنها نیارمند است. در حقیقت، Node.js در نتیجهٔ تلاشهای دولوپرهای زبان جاوااسکریپت برای توسعۀ محیطی به وجود آمد که دولوپرها بتوانند کدهای جاوااسکریپت خود را علاوه بر داخل مرورگر، در سمت سرور نیز در قالب یک اپلیکیشن مستقل اجرا کنند.
در واقع، با وجود چنین قابلیتی دولوپرها میتوانند علاوه بر طراحی وبسایتهای تعاملی با زبان #جاوااسکریپت، برای توسعهٔ سایر اپلیکیشنها نیز از این زبان استفاده کنند به طوری که پس از ظهور نودجیاس، کاربردهای این زبان به اندازهٔ سایر زبانهای اسکریپتی همچون پایتون افزایش یافته است.
همچنین هر دو محیط اجرای جاوااسکریپت (هم مرورگر و هم محیط سمت سرور) روی موتور جاوااسکریپت تحت عنوان V8 اجرا میشوند. در حقیقت، این موتور کدهای جاوااسکریپت را گرفته و آنها را به یک اسکریپتی قابلفهم برای ماشین تبدیل میکند (کد قابلفهم برای ماشین یک کد اصطلاحاً Low Level یا سطح پایین است که کامپیوتر میتواند بدون تفسیر، خیلی سریع آن را اجرا کند.)
Node.js چیست؟
بر اساس تعریف ارائهشده در وبسایت رسمی Node.js:
نودجیاس یک محیط اجرای جاوااسکریپتی است که روی موتور اجرای کد جاوااسکریپتِ مرورگر کروم تحت عنوان V8 ساخته شده است.
V8 یک موتور اپنسورس برای اجرای کدهای جاوااسکریپت است که با زبان ++C نوشته شده است و همانطور که پیش از این نیز ذکر شد، این موتور کدهای جاوااسکریپتی را میگیرد و به یک کد قابلفهم برای ماشین تبدیل میکند. در واقع، V8 همچون توربینی با بهکارگیری زبان ++C موجب افزایش کارایی در خروجی کد جاوااسکریپت میشود.
همچنین V8 استانداردی تحت عنوان ECMAScript را پیادهسازی میکند که توسط سازمان بینالمللی Ecma و به منظور استانداردسازی زبان جاوااسکریپت ساخته شد. این موتور توانایی اجرایی کدها به صورت مستقل را دارا است و میتواند در سایر اپلیکیشنهای نوشته شده با ++C نیز اِمبدد شود. به عبارت دیگر، دولوپرها میتوانند کد خود را به زبان ++C بنویسند و این در حالی است که امکان اجرای آن در محیط اجرای کدهای جاوااسکریپت و همچنین نوشتن کد به زبان جاوااسکریپت نیز برای ایشان فراهم است که این مسئله موجب میشود تا دولوپرها با اِمبدد کردن موتور V8 در کد نوشته شده با زبان سیپلاسپلاس خود، فیچرهایی را به زبان جاوااسکریپت بیفزایند تا این کد قابلیتهای بیشتری نسبت به سایر استانداردهای مشخصشده در ECMAScript را داشته باشد.
به غیر از تعریف فوق، تعاریف و تفاسیر دیگری نیز برای نودجیاس ارائه شدهاند که در ادامه به معرفی تعریف جامعتری از این محیط میپردازیم:
نودجیاس از مُدلی پیروی میکند که مبتنی بر رویداد (Event-driven) بوده و همچنین این مدل فرآیندهای ورودی و خروجی (I/O) را اصلاً بلاک نمیکند به طوری که استفاده از چنین مدلی موجب سَبکی و کارآمدی محیط اجرای نودجیاس شده است.
تعریف اول از نودجیاس را در ابتدای مقاله مورد بحث قرار دادیم؛ حال به بررسی تعریف دوم خواهیم پرداخت تا دریابیم که چرا نودجیاس محبوب شده است.
درآمدی بر Blocking I/O و Non-blocking I/O
I/O به درخواستهای ورودی و خروجی از یک سیستم اشاره دارد و فرآیندهای گوناگونی را شامل میشود که از آن جمله میتوان به فرآیندهای به اصطلاح Read یا Write (به ترتیب به معنی خواندن و نوشتن) روی یکسری فایل سیستمی یا ارسال یک ریکوئست (درخواست) از نوع HTTP به یک API را نام برد. معمولاً چنین ریکوئستهایی زمانبَر هستند، لذا سیستم در هنگام دریافت درخواستهایی از جنس I/O، فانکشنهای دیگر را بلاک (مسدود) میکند تا بتواند در کمترین زمان ممکن پاسخ مناسب را به این درخواستها بدهد. برای درک بهتر این موضوع، سناریوی فرضی زیر را در نظر بگیرید:
یک درخواست از طرف سیستم به دیتابیس ارسال شده است تا اطلاعات کاربر شماره یک و همچنین کاربر شماره دو را دریافت کرده و آنها را در یک صفحه یا در کنسول چاپ کند. پاسخ به این ریکوئست کمی زمانبَر است اما هر دو درخواست برای چاپ دیتای کاربران میتوانند به صورت مستقل از هم و همزمان انجام شوند.
حال فرض کنید که ارسال ریکوئست و دریافت ریسپانس (پاسخ) از دیتابیس بر طبق فرآیند Blocking I/O (مسدود کردن ورودی/خروجی) انجام میشد؛ در این روش پاسخ به ریکوئستی که برای دریافت دیتای کاربر دوم ارسال شده داده نمیشود مگر زمانی که کار ریکوئست اول (دریافت دیتای کاربر قبلی) به اتمام رسیده باشد که این اصلاً خوب نیست!
اگر چنین ریکوئستی به یک وبسرور ارسال شود، بایستی به ازای هر ریکوئست برای دریافت دیتای مربوط به هر کاربر، یک به اصطلاح Thread جدید ایجاد شود اما زبان جاوااسکریپت یک زبان به اصطلاح Single-threaded (تَک تِرِدی) است؛ بنابراین برای تَسکهایی که درخواست به یک وب سرور ارسال میشود و نیاز به اجرا به صورت به اصطلاح Multi-threaded (چند تِرِدی) دارند، زیاد مناسب نخواهد بود (لازم به ذکر است که زبان جاوااسکریپت کاملاً تکتِردی نبوده اما دارای یک Event Loop است که به صورت تَک تِرِدی اجرا میشود که در ادامۀ مقاله، این مورد را بیشتر توضیح میدهیم.)
با در نظر گرفتن این شرایط، سؤالی که پیش میآید این است که در زبان جاوااسکریپت درخواستهای همزمان چگونه اجرا میشوند؟ در پاسخ به این سؤال فرآیندی را معرفی خواهیم کرد که به روش Non-blocking I/O (مسدود نکردن درخواستهای ورودی/خروجی) اجرا شده و برای انجام درخواستهای همزمان بسیار کارآمد است.
برای مثال، با بهکارگیری فرآیندهایی که در آن یکی از چند درخواست همزمان بلاک نمیشوند، سیستم میتواند یک ریکوئست را برای دریافت دیتای مربوط به کاربر شماره دو آغاز کند، بدون اینکه منتظر دریافت پاسخ مربوط به دیتای کاربر شماره یک بماند. در واقع، سیستم هر دو درخواست را به صورت موازی اجرا میکند و در کوتاهترین زمان ممکن پاسخ را به کاربران ارسال میکند که در این صورت دیگر نیازی به اجرای تَسکها به صورت چند تِردی نیست چرا که سرور میتواند چندین درخواست را به صورت همزمان هَندل کند.
درآمدی بر Event Loop در جاوااسکریپت
هر آنچه در اپلیکیشن اتفاق میافتد و دولوپر میتواند به آن پاسخ دهد را اصطلاحاً Event میگویند. به طور کلی دو نوع ایونت (رویداد) در پلتفرم نودجیاس وجود دارد که عبارتند از:
– ایونتهای سیستمی: اینگونه ایونتها در هستهٔ ++C و در نتیجۀ فراخوانی یک لایبرری تحت عنوان libuv اتفاق میافتد (به عنوان مثال، میتوان به پایان رسیدن فرآیند Read یک فایل را مثال زد.)
– ایونتهای سفارشی شده: این دست رویدادها در هستۀ جاوااسکریپت اتفاق میافتند.
حال پس از آشنایی با مفهوم Event (رویداد)، در ادامه قصد داریم به تشریح گامبهگام نحوۀ اجرای Event Loop (حلقهای از رویدادها) در جاوااسکریپت بپردازیم.
همانطور که در تصویر فوق مشخص است، ابتدا تابعی تحت عنوان ()main وارد Call Stack (پشتهای به منظور فراخوانی و اجرای توابع) میشود و در ادامه دستور ()console.log وارد Call Stack شده و فوراً اجرا میشود و از پشته نیز خارج میشود. در این مرحله، تابع (setTimeout(2000 وارد پشته میشود (تابع (setTimeout(2000 یک ایپیآی برای نودجیاس است و وقتی آن را فراخوانی میکنیم یک جفت Event-Callback را رجیستر میکنیم که در آن ایونتی به مدت ۲۰۰۰ میلیثانیه منتظر مانده و سپس مجدداً تابع Callback فراخوانی میشود.) پس از رجیستر کردن جفت Event-Callback، تابع (setTimeout(2000 از اِستک (پُشته) خارج میشود.
در مرحلهٔ بعد، تابع (setTimeout(0 به همین شیوه رجیستر میشود؛ حال دو ایپیآی Node داریم که منتظر اجرا هستند. تابع (setTimeout(0 بدون منتظر ماندن به Callback Queue (صف فراخوانی مجدد تابع) منتقل میشود و پس از ۲۰۰۰ ثانیه نیز تابع (setTimeout(2000 به صف Callback منتقل میشود. در صف Callback، این تابع صبر میکند تا پشته فراخوانی تابع خالی شود، زیرا تنها یک دستور میتواند در یک زمان اجرا شود و این در حالی است که فراخوانی توابع برای اجرا توسط Event Loop هندل میشود و در نهایت هم دستور ()console.log اجرا میشود و تابع ()main از پشته فراخوانی توابع خارج میشود.
در آنچه توضیح دادیم، Event Loop، که وظیفۀ هندل کردن توابع را بر عهده داشت، میبیند که پشته توابع خالی شده است اما صف Callback خالی نیست؛ بنابراین این حلقه توابعی را که برای اجرای مجدد فراخوانی شدهاند، بر اساس قانون FIFO از این پشته خارج کرده و وارد Call Stack میکند تا به ترتیب اجرا شوند (FIFO مخفف واژگان First In, First Out است و در ساختمان داده بدان معنا است که آنچه در ابتدا وارد پشته شود، ابتدا نیز خارج یا اجرا میگردد.)
درآمدی بر پَکیج مَنجر NPM
NPM که مخفف واژگان Node Package Manager است، پَکیج مَنجر نودجیاس حاوی مجموعهای از لایبرریهایی است که با مشارکت کامیونیتی بزرگی از دولوپرهای جاوااسکریپت توسعه یافته است و پاسخی به نیازهای بسیاری از مسائل دولوپرها است.
آشنایی با ماژولهای پلتفرم Node.js
یک ماژول در نُود بلوکی از کد با قابلیت استفادهٔ مجدد است و اجرای این بلوک از کد بر روی کدهای دیگر تأثیر نمیگذارد. همچنین دولوپرها میتواند ماژولهای خود را نوشته و از آنها در برنامههای مختلف استفاده کنند و این در حالی است که خودِ پلتفرم نودجیاس نیز متشکل از مجموعۀ ماژولهای مختلفی است که دولوپرها میتوانند بدون نصب، آنها را مورد استفاده قرار دهند.
آشنایی با نحوۀ نوشتن Hello World در Node.js
برای این منظور، ابتدا یک فایل با نامی دلخواه همچون app.js ساخته و کد زیر را داخل آن مینویسیم:
console.log("Hello World!");
ترمینالِ سیستمعاملی که نُود رویش نصب است را باز کرده و دایرکتوری آن را به مسیری که فایل app.js در آن ذخیره شده، تغییر دهید. حال دستور زیر را اجرا کنید:
$ node app.js
بدین ترتیب، برنامهٔ سادهٔ Hello World در محیط نودیجیاس اجرا میشود!
درآمدی بر MEAN Stack
به طور کلی، هر زبان برنامهنویسی دارای فناوریهای وابسته به خود به منظور توسعهٔ سریعتر اپلیکیشنها است که از آن جمله میتوان به پکیجها، لایبرریها، فریمورکها و … برای هر زبان و محیط توسعهای اشاره کرد و این در حالی است که Node.js هم از این قاعده مستثنی نیست.
MEAN سرواژهای از حرف اول نام فناوریهای AngularJS، Express، MongoBD و NodeJS است؛ دقیقاً چیزی همچون اِستک LAMP که پکیجی از محیط توسعه (Linux)، وبسرور (Apache)، دیتابیس (MySQL) و زبان برنامهنویسی (PHP) است. در توضیح اِستک MEAN به نظر میرسد که به اندازهٔ کافی در مورد NodeJS تاکنون صحبت کردهایم و بهتر است بپردازیم به سه مورد دیگر که عبارتند از:
آشنایی با فریمورک Express
Express یک فریمورک سَبک است که برای توسعهٔ وب اپلیکیشن با استفاده از نُود به کار میرود. به عنوان نمونه سورسکد نوشته شده با این فریمورک داریم:
const express = require('express')
const app = express()
app.get('/', (req, res) => res.send('Hello World!'))
app.listen(3000, () => console.log('Example app listening on port 3000!'))
آشنایی با فریمورک AngularJS
AngularJS یک فریمورک جاوااسکریپتی است که توسط کمپانی گوگل عرضه شده است که فیچرهای قابلتوجهی منجمله Two-way Data Binding در اختیار دولوپرها میگذارد و به نوعی میتوان گفت که سولوشن خوبی برای توسعهٔ فرانتاند است. به عنوان نمونه سورسکد نوشته شده با این فریمورک داریم:
angular.module('todoApp', [])
.controller('TodoListController', function() {
var todoList = this;
todoList.todos = [
{text:'learn AngularJS', done:true},
{text:'build an AngularJS app', done:false}];
todoList.addTodo = function() {
todoList.todos.push({text:todoList.todoText, done:false});
todoList.todoText = '';
};
todoList.remaining = function() {
var count = 0;
angular.forEach(todoList.todos, function(todo) {
count += todo.done ? 0 : 1;
});
return count;
};
todoList.archive = function() {
var oldTodos = todoList.todos;
todoList.todos = [];
angular.forEach(oldTodos, function(todo) {
if (!todo.done) todoList.todos.push(todo);
});
};
});
آشنایی با دیتابیس MongoDB
MongoDB یک دیتابیس از نوع NoSQL است که دیتا را به صورت فرمت جیسون ذخیره میسازد (در همین راستا، میتوانید به مقالهٔ درآمدی بر انواع مختلف دیتابیسهای NoSQL مراجعه نمایید.) به عنوان نمونه سورسکد نوشته شده با نودجیاس برای ارتباط با این دیتابیس داریم:
const MongoClient = require('mongodb').MongoClient;
const assert = require('assert');
// Connection URL
const url = 'mongodb://localhost:27017';
// Database Name
const dbName = 'myproject';
// Use connect method to connect to the server
MongoClient.connect(url, function(err, client) {
assert.equal(null, err);
console.log("Connected successfully to server");
const db = client.db(dbName);
client.close();
});
حال نوبت به نظرات شما میرسد. آیا تاکنون تجربهٔ کدنویسی در محیط Node.js را داشتهاید و در مقایسه با دیگر زبانهای سمت سرور همچون پایتون، گو و غیره، به نظر شما چه آیندهای در انتظار این فناوری است؟ نظرات، دیدگاهها و تجربیات خود را با دیگر کاربران به اشتراک بگذارید.
سلام و عرض ادب. من در nodejs تازه کار هستم. یک برنامه رو از جایی پیدا کردم که مربوط به ارتباط تصویری هست و با node نوشته شده. برنامه به صورت کامل روی لوکال سیستم اجرا میشه و خطایی نداره. ولی وقتی اون رو تو هاست آپلود می کنم خطا میده. نمی دونم مشکل از کجاست و کسی هم نتونسته بفهمه. امکانش هست راهنمایی بفرمایید؟
https://bestxmix.com/test11/broadcast.html
این لینک رو ملاحظه بفرمائید و خطای کنسول رو مشاهده کنید. ممنون میشم اگه کمک کنید