به بیان دیگر، 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) پشتیبانی میکند.
تاریخچه جاوا اسکریپت
در سال 1995، یکی از پیمانکاران شرکت Netscape بهنام برندن ایچ زبان جاوا اسکریپت را ساخت تا در مرورگرهای وب اجرا شود. جاوا اسکریپت در ابتدا بهمنظور اضافه کردن قابلیت انیمیشن و سایر تغییرات Document Object Model در مرورگر ایجاد شد. بعد از مدت کوتاهی یک نسخه از جاوا اسکریپت برای Netscape Enterprise Server معرفی شد.
نام جاوا اسکریپت بهمنظور توجه بازار به آن انتخاب شد، زیرا در آن زمان زبان جاوای شرکت سان از معروفیت خاصی برخوردار بود. در واقع، زبان جاوا اسکریپت در وهله اول بر پایه طرح و ساختار مستقل بنا شده است که از لحاظ ظاهری شبیه به دستور زبان جاوا است.
در ابتدا، خیلی از برنامهنویسان بر این اعتقاد بودند که جاوا اسکریپت در دنیای واقعی بیفایده است، زیرا مفسر آن کندتر از زبانهای کامپایل شده اجرا میشد. اما این موضوع با تلاشهای بسیار و تحقيقات زیاد یک جاوا اسکریپت سریعتر را به وجود آورد. از همه برجستهتر، موتور منبع باز Google Chrome V8 JavaScript است که با کامپایل همزمان و بهینهسازی کدهای دینامیک میتواند در بعضی شرایط از کدهای C++ بهتر عمل کند و در اغلب موارد از پایتون برتر است. سکوی Node.js مبتنی بر جاوا اسکریپت در سال 2009 توسط رایان دال برای لینوکس و مک او اس و بهعنوان یک جایگزین مقیاسپذیرتر نسبت به Apache HTTP Server معرفی شد. NPM نوشته شده توسط ایزاک اسکلوتر در سال 2010 منتشر شد. نسخه ویندوز Node.js در سال 2011 شروع به کار کرد. Joyent برای چند سال مالکیت، اداره و پشتیبانی از توسعه Node.js را بر عهده داشت. از سال 2015 پروژه Node.js به Node.js Foundation واگذار شد که تحت کنترل کمیته فنی این بنیاد قرار دارد. Node.js بهعنوان یک پروژه همکاری با بنیاد لینوکس هم پذیرفته شده است.
کاربردهای Node صرفاً محدود به جاوا اسکریپت نمیشود. شما میتوانید از هر زبانی که به جاوا اسکریپت ترنسپایل میشود (مثل TypeScript و CoffeeScript) نیز استفاده کنید
معماری اصلی Node.js
در بالاترین سطح، Node.js موتور Google V8 JavaScript، یک حلقه رویداد تکرشتهای non-blocking و یک I/O API سطح پایین را با یکدیگر ترکیب کرده است.
نمونه کد نمایش داده شده در شکل 1 زیر الگوی پایه یک سرور HTTP را نشان میدهد كه از توابع فلش ES6 برای فراخوانیها استفاده میکند(شکل 1). ابتدای این کد با مقداردهی متغیر Hostname به Localhost (127.0.0.1) سرور را تنظیم و ماژول HTTP را بارگذاری میکند. متغیر پورت نیز 3000 تعریف شده است. سپس یک سرور و یک تابع Callback ساخته میشود. در این مورد یک تابع فلش وجود دارد که اجازه میدهد به هر درخواستی پاسخ یکسان داده شود: مقدار StatusCode برابر 200 (موفقیتآمیز)، نوع محتوا متن ساده و یک متن پاسخ Hello World\n. سرانجام این کد به سرور میگوید تا به Localhost در پورت 3000 (از طریق یک سوکت) گوش کند و در زمان آماده به کار سرور با تعریف یک فراخوانی یک لاگ پیغام در کنسول چاپ کند. اگر شما اين کد را با استفاده از فرمان node در یک ترمینال یا کنسول اجرا كنيد و بعد روی همان ماشین در مرورگر وب نشانی Localhost:3000 را وارد کنید، پیغام Hello World را در مرورگر مشاهده خواهید کرد. برای توقف سرور در پنجره ترمینال کلیدهای Control-C را فشار دهید.
شکل 1
توجه داشته باشید تمام فراخوانیهای انجام گرفته در این مثال ناهمگام و non-blocking هستند. توابع فراخوانی نیز به رویدادها پاسخ میدهند. تابع فراخوانی CreateServer یک رویداد درخواست کلاینت را اداره و یک پاسخ را ارسال میکند. تابع Listen نیز رویداد Listening را اداره میکند.
کتابخانه Node.js
همان گونه که در قسمت سمت چپ شکل 2 مشاهده میکنید، Node.js طیف وسیعی از قابلیتها را در کتابخانه خود جا داده است. در بخش سمت راست شکل 2 مشاهده میکنید که ماژول HTTP که ما قبل از این از آن استفاده کردیم، هر دو کلاس کلاینت و سرور را شامل میشود. قابلیت سرور HTTPS نیز در یک ماژول جداگانه از TLS یا SSL استفاده میکند. (شکل 2)
شکل 2
یک مشکل ذاتی که درباره حلقه رویدادهای تکرشتهای وجود دارد، کمبود مقیاس عمودی است. زیرا این رشته حلقه رویداد تنها از یک هسته پردازنده استفاده خواهد کرد. این در حالی است که پردازندههای جديد اغلب از هشت هسته برخوردار هستند و سرورهای جدید نیز اغلب از چند پردازنده مرکزی استفاده میکنند. یک کاربرد تکرشتهای نمیتواند از تمام مزایای 24 هسته موجود در یک سرور استفاده کند. با کمی برنامهنویسی بیشتر شما میتوانید این مشکل را برطرف کنید. 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 کلاینتهای دیتابیس است که شامل بیش از 4000 ماژول از جمله Redis، Mongoose،Firebase و PostgreSQL میشود.
جمعبندی
Node.js یک محیط اجرایی چندسکویی بر پایه موتور جاوا اسکریپت است که برای سرور و اپلیکیشنها در نظر گرفته شده است و در یک حلقه رویداد تکرشتهای non-blocking ساخته شده است، از موتور Google Chrome V8 JavaScript استفاده میکند و یک API ورودی/ خروجی است. تکنیکهای مختلفی مثل ماژول کلاستر به اپلیکیشنهای Node.js اجازه میدهد تا از طریق یک هسته پردازنده مرکزی کار کنند. صرف نظر از قابلیت سازگاری با پردازنده، Node.js از اکوسیستمی متشکل از نیم میلیون پکیج برخوردار است که حق انتخاب زیادی را در اختیار شما قرار میدهد.
ماهنامه شبکه را از کجا تهیه کنیم؟
ماهنامه شبکه را میتوانید از کتابخانههای عمومی سراسر کشور و نیز از دکههای روزنامهفروشی تهیه نمائید.
ثبت اشتراک نسخه کاغذی ماهنامه شبکه
ثبت اشتراک نسخه آنلاین
کتاب الکترونیک +Network راهنمای شبکهها
- برای دانلود تنها کتاب کامل ترجمه فارسی +Network اینجا کلیک کنید.
کتاب الکترونیک دوره مقدماتی آموزش پایتون
- اگر قصد یادگیری برنامهنویسی را دارید ولی هیچ پیشزمینهای ندارید اینجا کلیک کنید.
نظر شما چیست؟