سی اس اس برای شما

به بیان دیگر، Node.js هیچ زمان و منابعی را برای انتظار زمان بازگشت درخواست ورودی/ خروجی هدر نمی‎دهد. در روش قدیمی‎ ساخت وب سرورها، به‌ازای هر درخواست ورودی یا اتصال، سرور یک رشته اجرای فرمان جدید یا حتی یک چرخه پردازش جدید را ایجاد می‎کند تا به این درخواست رسیدگی و یک پاسخ را ارسال کند. در حالت مفهومی‎ این شیوه بسیار ایده‎ال به نظر می‎رسد، اما در عمل مقدار زیادی بار اضافی را تحمیل می‎کند. هرچند ایجاد این رشته‎ها به‌میزان کمتری از چرخه پردازش حافظه و توان پردازنده اصلی را مصرف می‎کند، اما همچنان می‎تواند راندمان را پایین نگه دارد. وجود تعداد زیادی از این رشته‎ها می‎تواند باعث ایجاد بار سنگین روی سیستم شده و صرف نیرو برای زمان‌بندی اجرای این رشته‎ها، زمان تأخیر را افزایش می‎دهد و باعث محدودیت‎هایی در مقیاس‌پذیری و بازده خواهد شد. Node.js با اجرای یک چرخه رویداد تک‌رشته‎ای ثبت شده در سیستم برای اداره اتصالات شیوه متفاوتی را اعمال می‎کند. هر اتصال جدید نیز باعث اجرای یک تابع فراخوانی (Callback) جاوا اسکریپت می‎شود. این تابع فراخوانی می‎تواند با فراخوانی ورودی/ خروجی non-blocking به درخواست‎ها رسیدگی کند و در مواقع لزوم می‎تواند رشته‎هایی را برای اجرا به‌صورت بلوک یا عملیات فشرده پردازشی در بین هسته‎های پردازنده ایجاد کند. Node برای هماهنگی با توابع Callback و اداره اتصالات بیشتر به حافظه کمتری نیاز دارد. در روش قدیمی‎ تولید رشته در سرور Apache HTTP، سرورهای جاوا، IIS و ASP.NET و Ruby on Rails مصرف حافظه و پردازنده بیشتر است. مشخص شده است که Node.js در کنار سرورها برای کاربردهای دسکتاپ نیز بسیار سودمند است. همچنین، به این نکته توجه داشته باشید كه کاربردهای Node صرفاً محدود به جاوا اسکریپت نمی‎شود. شما می‎توانید از هر زبانی که به جاوا اسکریپت ترنسپایل می‎شود (مثل TypeScript و CoffeeScript) نیز استفاده کنید. Node.js با موتور Google Chrome V8 JavaScript یکپارچه شده است که از ساختار کدنویسی ECMAScript 2015 (ES6) پشتیبانی می‎کند.

مطلب پیشنهادی

10 ویژگی جدید و جذاب جاوااسکریپت برای عاشقان وب

تکنیک‌های کاربردی ES6

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

در سال ۱۹۹۵، یکی از پیمان‌کاران شرکت Netscape به‌نام برندن ایچ زبان جاوا اسکریپت را ساخت تا در مرورگرهای وب اجرا شود. جاوا اسکریپت در ابتدا به‌منظور اضافه کردن قابلیت انیمیشن و سایر تغییرات Document Object Model در مرورگر ایجاد شد. بعد از مدت کوتاهی یک نسخه از جاوا اسکریپت برای Netscape Enterprise Server معرفی شد.
نام جاوا اسکریپت به‌منظور توجه بازار به آن انتخاب شد، زیرا در آن زمان زبان جاوای شرکت سان از معروفیت خاصی برخوردار بود. در واقع، زبان جاوا اسکریپت در وهله اول بر پایه طرح و ساختار مستقل بنا شده است که از لحاظ ظاهری شبیه به دستور زبان جاوا است.
در ابتدا، خیلی از برنامه‌نویسان بر این اعتقاد بودند که جاوا اسکریپت در دنیای واقعی‌ بی‎فایده است، زیرا مفسر آن کندتر از زبان‎های کامپایل شده اجرا می‎شد. اما این موضوع با تلاش‎های بسیار و تحقيقات زیاد یک جاوا اسکریپت سریع‎تر را به وجود آورد. از همه برجسته‎تر، موتور منبع باز Google Chrome V8 JavaScript است که با کامپایل هم‌زمان و بهینه‌سازی کدهای دینامیک می‎تواند در بعضی شرایط از کدهای C++ بهتر عمل کند و در اغلب موارد از پایتون برتر است. سکوی Node.js مبتنی بر جاوا اسکریپت در سال ۲۰۰۹ توسط رایان دال برای لینوکس و مک او اس و به‌عنوان یک جایگزین مقیاس‌پذیرتر نسبت به Apache HTTP Server معرفی شد. NPM نوشته شده توسط ایزاک اسکلوتر در سال ۲۰۱۰ منتشر شد. نسخه ویندوز Node.js در سال ۲۰۱۱ شروع به کار کرد. Joyent برای چند سال مالکیت، اداره و پشتیبانی از توسعه Node.js را بر عهده داشت. از سال ۲۰۱۵ پروژه Node.js به Node.js Foundation واگذار شد که تحت کنترل کمیته فنی این بنیاد قرار دارد. Node.js به‌عنوان یک پروژه همکاری با بنیاد لینوکس هم پذیرفته شده است.

 کاربردهای Node صرفاً محدود به جاوا اسکریپت نمی‎شود. شما می‎توانید از هر زبانی که به جاوا اسکریپت ترنسپایل می‎شود (مثل TypeScript و CoffeeScript) نیز استفاده کنید

معماری اصلی Node.js

در بالاترین سطح، Node.js موتور Google V8 JavaScript، یک حلقه رویداد تک‌رشته‎ای non-blocking و یک I/O API سطح پایین را با یکدیگر ترکیب کرده است. 
نمونه کد نمایش داده شده در شکل ۱ زیر الگوی پایه یک سرور HTTP را نشان می‎دهد كه از توابع فلش ES6 برای فراخوانی‎ها استفاده می‎کند(شکل ۱). ابتدای این کد با مقداردهی متغیر Hostname به Localhost  (۱۲۷٫۰٫۰٫۱) سرور را تنظیم و ماژول HTTP را بارگذاری می‎کند. متغیر پورت نیز ۳۰۰۰ تعریف شده است. سپس یک سرور و یک تابع Callback ساخته می‎شود. در این مورد یک تابع فلش وجود دارد که اجازه می‎دهد به هر درخواستی پاسخ یکسان داده شود: مقدار StatusCode برابر ۲۰۰ (موفقیت‌آمیز)، نوع محتوا متن ساده و یک متن پاسخ Hello Worldn. سرانجام این کد به سرور می‎گوید تا به Localhost در پورت ۳۰۰۰ (از طریق یک سوکت) گوش کند و در زمان آماده به کار سرور با تعریف یک فراخوانی یک لاگ پیغام در کنسول چاپ کند. اگر شما اين کد را با استفاده از فرمان node در یک ترمینال یا کنسول اجرا كنيد و بعد روی همان ماشین در مرورگر وب نشانی Localhost:3000 را وارد کنید، پیغام Hello World را در مرورگر مشاهده خواهید کرد. برای توقف سرور در پنجره ترمینال کلیدهای Control-C را فشار دهید.


شکل ۱

توجه داشته باشید تمام فراخوانی‎های انجام گرفته در این مثال ناهم‌گام و non-blocking هستند. توابع فراخوانی نیز به رویدادها پاسخ می‎دهند. تابع فراخوانی CreateServer یک رویداد درخواست کلاینت را اداره و یک پاسخ را ارسال می‎کند. تابع Listen نیز رویداد Listening را اداره می‎کند.

کتابخانه Node.js

همان ‎گونه که در قسمت سمت چپ شکل ۲ مشاهده می‎کنید، Node.js طیف وسیعی از قابلیت‎ها را در کتابخانه خود جا داده است. در بخش سمت راست شکل ۲ مشاهده می‎کنید که ماژول HTTP که ما قبل از این از آن استفاده کردیم، هر دو کلاس کلاینت و سرور را شامل می‎شود. قابلیت سرور HTTPS نیز در یک ماژول جداگانه از TLS یا SSL استفاده می‎کند. (شکل ۲)


شکل ۲ 

یک مشکل ذاتی که درباره حلقه رویدادهای تک‌رشته‎ای وجود دارد، کمبود مقیاس عمودی است. زیرا این رشته حلقه رویداد تنها از یک هسته پردازنده استفاده خواهد کرد. این در حالی است که پردازنده‎های جديد اغلب از هشت هسته برخوردار هستند و سرورهای جدید نیز اغلب از چند پردازنده مرکزی استفاده می‎کنند. یک کاربرد تک‌رشته‎ای نمی‎تواند از تمام مزایای ۲۴ هسته موجود در یک سرور استفاده کند. با کمی‎ برنامه‌نویسی بیشتر شما می‎توانید این مشکل را برطرف کنید. Node.js می‎تواند با توابعی شبیه به Popen(3) و استفاده از
Child_process.spawn() و متدهای مرتبط پردازش زیردستی را اجرا کند. برای ساخت سرورهای مقیاس‌پذیر ماژول Cluster حتی از ماژول پردازش زیردستی (Child) هم جالب توجه‎تر است. متد Cluster.fork() پردازش‎های کاری که پورت‎های والد سرور را به اشتراک می‎گذارند اجرا می‎کند.

مطلب پیشنهادی

مدیرعامل اپل: به جای زبان خارجی، زبان برنامه‌نویسی یاد بگیرید

برنامه‌نویسی یا زبان خارجه کدامیک؟

اکوسیستم پکیج Node.js

میزبان‎های ثبت NPM تقريباً نیم میلیون پکیج رایگان از کدهای قابل استفاده Node.js را در اختیار علاقه‌مندان قرار می‎دهند که بزرگ‌ترین منبع نرم‌افزاری جهان را تشکیل می‎دهد. توجه داشته باشید كه اغلب پکیج‎های NPM از چندین ماژول (برنامه‎هایی که شما از طریق عبارت Require بارگذاری می‎کنید) تشکیل شده است.
 NPM می‎تواند پکیج‎های محلی را که به یک پروژه خاص تعلق دارند و یا از طریق ابزارهای جاوا اسکریپت نصب می‎شوند را مدیریت کند. درباره مدیریت پکیج‎های محلی به کار گرفته شده در یک پروژه، NPM می‎تواند با یک دستور از طریق فایل Package.json تمام متعلقات مورد نیاز را نصب کند. درباره پروژه‎های غیرمحلی نیز NPM اغلب به اجازه دسترسی سیستم (Sudo) نیاز خواهد داشت.
شما نباید از خط فرمان NPM برای دسترسی به پکیج‎های عمومی‎ NPM استفاده کنید. سایر ابزارهای مدیریت پکیج مثل Yarn فیس‌بوک یک جایگزین سمت کلاینت را ارائه می‎کنند. همچنین، شما از طریق وب‎سایت NPM نیز می‎توانید پکیج‎ها را جست‌وجو و مشاهده کنید.
اما چرا ممکن است شما بخواهید از یک پکیج NPM استفاده کنید؟ در بسیاری موارد، نصب یک پکیج از طریق خط فرمان NPM سریع‎ترین و ساده‎ترين روش برای دسترسی به آخرین نسخه باثبات از یک ماژول است و معمولاً نسبت به دریافت منابع ذخیره و ساخت یک نصب‌کننده از این منبع به کار و زمان کمتری نیاز دارد. اگر شما به آخرین نسخه نیاز ندارید، می‎توانید شماره نسخه NPM مورد نظر خود را تعیین کنید که به‌ویژه در زمان‎هایی مفید خواهد بود که یک پکیج وابسته به پکیج دیگری است و ممکن است با یک نسخه جدیدتر سازگار نباشد.
برای مثال، چهارچوب Express که یک اپلیکیشن وب کوچک و انعطاف‌پذیر Node.js است را در نظر بگیرید که برای ساخت یک یا چند صفحه وب مجموعه‎ای قدرتمند از قابلیت‎ها را فراهم می‎کند. با وجودی که منبع ذخیره Expresscode به‌راحتی از نشانی https://github.com/expressjs/express قابل دسترس است، اما یک راه سریع برای شروع استفاده از Express نصب آن در یک دایرکتوری محلی از پیش تعیین شده از طریق فرمان npm است. برای مثال:

$ npm install express —save

گزینه —save که در حالت پیش‎فرض در NPM 5.0 و بعد از آن قرار دارد، به مدیر پکیج اجازه می‎دهد تا ماژول Express را بعد از نصب به فهرست متعلقات فایل package.json اضافه کند.
یکی دیگر از روش‎های سریع شروع به استفاده Express نصب ژنراتور اجرایی Express(1) و استفاده از آن برای ساخت اپلیکیشن محلی در یک فولدر کاری جدید است. 

$ npm install -g express-generator@4
$ express /tmp/foo && cd /tmp/foo

با انجام این کار شما می‎توانید از NPM برای نصب تمام متعلقات ضروری و شروع سرور استفاده کنید:

$ npm install
$ npm start

انتخاب یک گزینه مناسب از بین نیم میلیون پکیج در NPM کار سختی است و باید در انتخاب خود دقت زیادی داشته باشید. با وجود این، چند مجموعه شناخته شده وجود دارد که انتخاب شما را ساده‎تر می‎کند. Express قدیمی‎ترین و برجسته‎ترین نمونه از فریم ورک‎های Node.js است. یکی دیگر از مجموعه‎های بزرگ موجود در مخزن NPM ابزارهای کاربردی توسعه جاوا اسکریپت شامل Browserify ،Bower، مدیریت پکیج مرورگر، Grunt، JavaScript task runner  و سیستم استریمینگ Gulp است. سرانجام یک مجموعه مهم برای توسعه‌دهندگان در Node.js کلاینت‎های دیتابیس است که شامل بیش از ۴۰۰۰ ماژول از جمله Redis، Mongoose،Firebase  و PostgreSQL می‎شود.

جمع‎بندی
Node.js یک محیط اجرایی چندسکویی‎ بر پایه موتور جاوا اسکریپت است که برای سرور و اپلیکیشن‎ها در نظر گرفته شده است و در یک حلقه رویداد تک‌رشته‎ای non-blocking ساخته شده است، از موتور Google Chrome V8 JavaScript استفاده می‎کند و یک API  ورودی/ خروجی است. تکنیک‎های مختلفی مثل ماژول کلاستر به اپلیکیشن‎های Node.js اجازه می‎دهد تا از طریق یک هسته پردازنده مرکزی کار کنند. صرف نظر از قابلیت سازگاری با پردازنده، Node.js از اکوسیستمی‎ متشکل از نیم میلیون پکیج برخوردار است که حق انتخاب زیادی را در اختیار شما قرار می‎دهد.