Node.js چیست و چه نقشی در توسعه وب دارد؟ – به زبان ساده


جاوا اسکریپت صرفاً یک زبان سمت کلاینت است که در مرورگر اجرا میشود. البته این وضعیت تا قبل از معرفی Node.js بود؛ چون با معرفی این مفهوم جدید اینک جاوا اسکریپت میتواند روی سرور نیز اجرا شود؛ اما Node.js چیزی بسیار بزرگتر از جاوا اسکریپت صرف است. اگر به بحث برنامه نویسی وب یا همان توسعه وب علاقهمند هستید، میبایست به Node و موجی که در جامعه برنامه نویسان ایجاد کرده است، توجه داشته باشید.
Node.js چیست؟
Node.js رابطی برای «محیط زمان اجرای» جاوا اسکریپت، V8 محسوب میشود. V8 مفسر بسیار سریع جاوا اسکریپت است که در مرورگر کروم اجرا میشود. همان طور که میدانید، شما میتوانید V8 را دانلود کنید و در هر کجا که دوست دارید، مورد استفاده قرار دهید. Node.js همین کار را در مورد وبسرورها انجام داده است. در نهایت باید گفت که جاوا اسکریپت یک زبان برنامهنویسی است و هیچ نشانهای در دست نیست که بتوان از آن به عنوان یک سرور و همچنین در مرورگر کاربران استفاده کرد.
در یک استک سرور متداول به صورت LAMP یک وبسرور آپاچی یا NginX وجود دارد که PHP را اجرا میکند. هر اتصال جدید به سرور باعث میشود یک ترد جدید باز شود و این احتمال وجود دارد که خیلی زود عملکرد سرور کند شده یا به کلی از کار بیفتد. تنها راه خدمترسانی به کاربران بیشتر اضافه کردن سرورهای بیشتر است. در واقع مقیاسپذیری در این سناریو تعریف چندانی ندارد. اما Node.js چنین وضعیتی ندارد. دیگر هیچ وبسرور آپاچی وجود ندارد که به اتصالهای ورودی گوش دهد و کدهای وضعیت HTTP را بازگرداند. شما باید معماری هسته سرور را خودتان مدیریت کنید. خوشبختانه ماژولهایی برای آسانتر ساختن این کار عرضه شدهاند؛ اما این فرایند همچنان در آغاز ممکن است پیچیده به نظر برسد. با این حال نتیجه کار اپلیکیشنهای وب با عملکرد بالا است.
جاوا اسکریپت یک زبان رویداد-محور است. از این رو هر چیزی که روی سرور رخ میدهد، یک رویداد غیر مسدودکننده را آغاز میکند. هر اتصال جدید یک رویداد محسوب میشود، همچنین دریافت دادهها از یک فرم آپلود باعث ایجاد رویداد دریافت داده (data-received) میشود؛ درخواست دادهها از فایلهای پایگاه داده نیز یک رویداد است. در عمل این وضعیت بدان معنی است که یک سایت Node.js هرگز قفل نمیشود و میتواند از دهها هزار کاربر همزمان پشتیبانی کند. در واقع Node.js نقش سروری مانند آپاچی را ایفا میکند و کد برنامهای را که روی آن اجرا میشود تفسیر میکند.
ماژولها
همانند آپاچی ماژولها یا کتابخانههای مختلفی وجود دارد که میتوانند روی Node.js نصب شوند تا ویژگیها و کارکردهای بیشتری برای آن ایجاد کنند. از جمله این کتابخانهها میتوان به انبار داده (data store)، پشتیبانی از فایل ZIP، ورود با فیسبوک یا درگاههای پرداخت اشاره کرد.
البته این ماژولها به اندازه تعداد موجود برای پیاچپی نیستند؛ اما Node.js هنوز در مراحل اولیه توسعه است و جامعهای قدرتمند در پشت آن قرار دارد. یکی از مفاهیم اساسی Node.js توابع ناهمگام هستند. با استفاده از این توابع همه چیز در پسزمینه اجرا میشود. در اغلب زبانهای اسکریپتنویسی سمت سرور، برنامه باید صبر کند هر تابع به پایان برسد تا بتواند به تابع بعدی برود. اما در Node.js میتوان توابعی تعریف کرد که وقتی بخشهای دیگر به کار خود ادامه میدهند، به اجرا بپردازد. این موضوعی پیچیده است که در این نوشته قصد نداریم بر روی آن متمرکز شویم؛ اما اینها خصوصیاتی هستند که Node.js را تعریف میکنند و از این رو آشنایی با آنها حائز اهمیت است.
توضیح ویژگیهای Node.js تا این جا کافی است. در ادامه یک مثال ساده از سرور HTTP ارائه میکنیم که برخی از این مفاهیم را به طور اجمالی برای شما توضیح دهد.
var http = require("http"); http.createServer(function (request, response) { response.writeHead(200, { 'Content-Type': 'text/plain' }); response.write('Hello World!'); response.end(); }).listen(8080); console.log("Server running!");
اگر بخواهیم کد فوق را تجزیه کنیم، ابتدا یک ماژول http در پروژه معرفی شده است. سپس یک سرور ایجاد شده و یک تابع ناشناس به صورت یک پارامتر ارسال شده است. این تابع هر بار که اتصال جدید ایجاد شود فراخوانی میشود. این تابع دو آرگومان میگیرد: request و response. آرگومان request شامل پارامترهایی از سوی کاربر است و response مواردی هستند که به کاربر باز میگردند. سپس از شیء response برای نوشتن هدر و بازگشت آن به کاربر به صورت کد HTTP 200 و نوع محتوا با نوشتن پیام «Hello World!» استفاده میکنیم و به این ترتیب پاسخ را خاتمه میدهیم.
در نهایت به سرور میگوییم که به پورت 8080 برای اتصالهای ورودی گوش کند و پیام کوتاهی در کنسول نمایش دهد. اگر میخواهید این مثال را خودتان بررسی کنید کد فوق را در فایلی به نام test.js ذخیره کنید، برنامه نصب Node.js را دانلود کنید و در خط فرمان دستور زیر را وارد نمایید:
node test.js
یک مرورگر را باز کنید و به آدرس localhost:8080 بروید تا اپلیکیشن خود را ببینید. اینک تا حدودی با روش کلی کارکرد تابعهای ناهمگام آشنا شدید و مدلهای رویداد-محور را نیز شناختید. اگر در جاوا اسکریپت مبتدی هستید، مفهوم ارسال تابعها به صورت آرگومان به تابع دیگر ممکن است برایتان تا حدی عجیب باشد.
چرا باید از Node.js استفاده کنیم؟
دلیل اول برای توصیه Node.js عملکرد و مقیاسپذیری آن است. Node.js سریع است. اگر شما مشغول راهاندازی یک استارتاپ هستید که میخواهید پیشرفتهای بزرگی داشته باشید و از طرفی میخواهید مطمئن باشید که میتواند اپلیکیشن خود را به سرعت بزرگ کنید تا بتوانید به کاربران زیاد سایت خود پاسخ دهید، این مسئله کاملاً حائز اهمیت خواهد بود. Node.js برای استفاده در کاربردهای API Restful نیز کاملاً عالی است. این API یک سرویس وب است که چند پارامتر ورودی میگیرد و دادههای اندکی را پس میدهد. بدین ترتیب امکان دستکاری ساده دادهها بدون محاسبات زیاد وجود خواهد داشت.
Node.js میتواند هزاران اتصال API همزمان را در حالتی که پیاچپی از کار میافتد مدیریت کند. مزیتهای عملکردی و مقیاسپذیری همراه با دانش قبلی اکثر برنامه نویسان از جاوا اسکریپت باعث میشود که لزوم یادگیری زبان جدیدی مانند PHP چندان حس نشود. همچنین آموختن یک مفهوم جدید و تا حدودی بکر نیز هیجان است. اغلب افراد از این که چیز تازهای آمده است و هنوز آن را نیاموختهاند افسوس میخورند.
معایب
Node.js نیز مانند هر فناوری جدید دیگری در ابتدا با دشواریهایی در پیادهسازی همراه است. اگر از یک هاستینگ وب اشتراکی استفاده میکنید، نمیتوانید یک اپلیکیشن Node.js را روی این پلن توزیع کنید و انتظار داشته باشید که کار کند. VPS و سرورهای اختصاصی، گزینههای بهتری بدین منظور محسوب میشوند. میتوانید Node.js را روی آنها نصب کنید. گزینه بهتر، استفاده از سرویسهای مقیاسپذیر مانند Heroku است که توسعه دادن سایت روی آن کاملاً رایگان است. در واقع تنها زمانی لازم است پول بپردازید که به منابع بیشتری نیاز داشته باشید.
از طرف دیگر نصب Node.js روی ویندوز، مک یا لینوکس به صورت محلی آسان است و میتوانید بیدرنگ شروع به برنامهنویسی بکنید. کافی است Node.js را دانلود کنید. همچنین باید اشاره کرد که Node.js صرفاً یک جایگزین برای آپاچی محسوب نمیشود، چون اپلیکیشنهای موجود با آن کار نمیکنند و باید تقریباً همه چیز را از صفر شروع کنید. البته Node.js کتابخانههای زیادی دارند که امکانات متنوعی را ارائه میدهند. عیب مهم دیگر Node.js این است که در طی فرایند توسعه تغییرات زیادی مییابد. در واقع اگر به مستندات آن نگاه کنید یک شاخص پایداری وجود دارد که نشان میدهد، استفاده از هر ویژگی در حال حاضر تا چه حد ریسک دارد.
توسعهدهندگان وب همیشه به دنبال هیجان هستند. Node.js با ارائه سرویسهای وب باز و مبادله داده، کار خلق اپلیکیشنهای فوقالعاده را از هر زمان دیگری آسانتر کرده است. پس اگر میخواهید پیشرفت کنید و اپلیکیشنی مانند توییتر بسازید، احتمالاً میتوانید از Node.js بهرههای زیادی بگیرید.
اگر این نوشته مورد توجهتان قرار گرفته است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- وب هوک (WebHook) چیست ؟ — به زبان ساده
- درس مهندسی اینترنت — مفاهیم پایه به زبان ساده | منابع، کتاب و فیلم آموزشی
- سرور TCP مبتنی بر Node.js با استفاده از PM2 و Nginx — راهنمای ساخت اپلیکیشن از صفر تا صد
- مجموعه آموزشهای مهندسی نرم افزار
- مجموعه آموزش های پروژه محور برنامه نویسی
- Node.js و وب هوک های گیت هاب — راهنمای به روز رسانی پروژه ها از راه دور
- Node.js و ابزارها و تکنیکها برای ساخت سرورهای قدرتمند و سریع
==