آموزش Node.js رایگان – راهنمای جامع مبتدیان پروژه محور
در این مقاله به صورت پروژه محور با آموزش Node.js با بررسی معماری ابتدایی، ماژولهای مختلف و پیادهسازی پروژه محور Node.js و Express.js در خدمت شما هستیم.
اگر تا به حال اسم Node.js را شنیده باشید، پس احتمالا میدانید که یکی از معروفترین و قدرتمندترین فریمورکهای JavaScript است. Node.js از زمان انتشار، حضور قدرتمندی در بازار IT داشته و حتی با معرفی فریمورکهای جدید و پویای JS مانند Angular، React، Meteor به نظر نمیرسد که چیزی از محبوبیت Node.js کم شده باشد.
فکر میکنید چرا؟
به کمک این آموزش Node.js ، تصویری جامع از آن برای شما ارائه خواهم کرد. بنابراین آماده شوید تا شما هم به جمع طرفداران Node.js اضافه شوید.
برنامه نویسی Node.js چیست؟
Node.js فریمورکی است که بر پایهی موتور جاواسکریپت V8 گوگل کروم توسعه یافته است و مستقیما جاواسکریپت را در کد اختصاصی ماشین کامپایل میکند. Node.js فریمورکی کمحجم است که برای ایجاد وب اپلیکیشنهای سمت سرور استفاده میشود و API جاواسکریپت را برای ارائهی قابلیتهای سمت سروری معمول توسعه میدهد.
از Node.js معمولا برای توسعهی اپلیکیشنهای با مقیاس بزرگ، به خصوص سایتهای جریان ویدئویی(video streaming sites)، اپلیکیشنهای تک صفحهای (single-page applications) و دیگر اپلیکیشنهای وب استفاده میشود. Node.js از یک مدل I/O رویداد محور و مسدود نشونده (non-blocking) استفاده میکند و همین امر باعث میشود برای اجرای برنامههای مبتنی بر داده و بلادرنگ (Real-Time) بسیار مناسب باشد.
Node.js نیز مانند هر زبان برنامهنویسی دیگری از پکیجها و ماژولهایی استفاده میکند. آنها کتابخانههایی هستند که حاوی توابع مختلف هستند و از طریق npm یا مدیریت پکیج node package manager وارد کدها میشوند و در برنامهها به کار میروند. برخی از ویژگیهای مهم که Node.js را تعریف میکنند عبارتند از:
ویژگی های Node.js:
1. متن باز بودن open-source
Node.js یک فریمورک تحت لایسنس MIT و متنباز است که توسط انجمنی بسیار وسیع پشتیبانی میشود. این انجمن کاملا فعال است که برای افزودن توانمندیهای جدید به اپلیکیشنهای Node.js مشارکت دارند.
2. ساده و آسان بودن
از آنجایی که Node.js بر پایهی موتور جاواسکریپت V8 گوگل کروم ساخته شده، کتابخانهی آن قابلیت اجرای سریع کدها را داراست.
3. ناهمزمانی (Asynchronous)
تمام کتابخانههای Node.js ناهمزمان هستند، بدین معنا که سرورهای مبتنی بر Node.js برای فرستادن پاسخ و حرکت به سمت API بعدی هرگز منتظر یک API نمیمانند.
4. مقیاسپذیری بالا
مکانیزم رویداد باعث میشود که Node.js بسیار مقیاسپذیر باشد و سرور به صورت مسدود نشونده پاسخها را ارسال کند.
5. تک موضوعی بودن Single-Treaded
Node.js از حلقه رویددادها استفاده میکند که باعث میشود تا مدلهای تک موضوعی را دنبال کند. این امر امکان مدیریت چندین درخواست توسط یک برنامه را فراهم میکند.
6. عدم وجود بافرینگ
یکی از قابلیتهای اصلی Node.js این است که هیچ دادهای را بافر نمیکند.
7. چندسکویی بودن Cross-Platform
Node.js میتواند به آسانی ایجاد شده و بر روی پلتفرمهای مختلفی مانند ویندوز، مکنتاش و لینوکس پیادهسازی شود.
اکنون اجازه دهید پیش رفته و ببینیم چگونه یک کد واقعی بر روی مرورگر اجرایی میشود. اما پیش از آن، باید Node.js را دانلود و بر روی کامپیوتر خود نصب کنید.
پس اکنون خودآموز Node.js را ادامه داده و دربارهی مهمترین اجزاء Node.js یعنی npm توضیحاتی میدهیم.
NPM (مدیریت پکیج Node)
NPM مخخف عبارت Node Package Manager است و همانطور که از نامش پیداست مدیریت پکیجی برای پکیجها و ماژولهای Node.js است. از ورژن 0.6.0 به بعد، npm به صورت پیشفرض به نصب node اضافه شده است. این کار شما را از دردسرهای نصب npm به صورت مجزا نجات میدهد.
به طور کلی، NPM به دو روش مفید واقع میشود:
1. انبارههای آنلاینی را برای پکیجها و ماژولهای Node.js فراهم و از آنها پشتیبانی میکند که میتوانند به آسانی دانلود شده و در پروژهها استفاده شوند. میتوانید آنها را در npmjs.com پیدا کنید.
2. برنامهی کمکی خط فرمان (Command line) را به منظور نصب پکیجهای مختلف Node.js، مدیریت ورژنهای Node.js و ارتباط بین پکیجها فراهم میآورد.
اما اکنون، حتما این سوال برایتان پیش آمده است که این ماژولها دقیقا چه هستند و چگونه به ما در ساخت اپلیکیشنهای Node.js کمک میکنند. در بخش بعدی این خودآموز، اطلاعات کاملی دربارهی ماژولهای Node.js ارائه خواهم کرد.
ماژولهای Node.js
در Node.js، ماژول عبارت است از عملکردهای مختلفی که در فایلهای JS دستهبندی شدهاند. این ماژولها بافت و شرایط منحصر به فردی دارند، بنابراین وارد حوزهی دیگر انواع ماژولها نمیشوند و در آنها دخالتی ندارند.
این ماژولها استفادهی مجدد از کدها را ممکن میسازند و سهولت کاربرد را افزایش میدهند. Node.js اصولا سه نوع ماژول را در اختیار ما قرار میدهد:
1. ماژولهای هستهای (Core Modules)
2. ماژولهای محلی (Local Module)
3. ماژولهای طرف سوم (Third-Party Module)
ماژولهای هستهای
از آنجا که Node.js فریمورکی کاملا کمحجم است، ماژولهای هستهای حداقل عملکردها را در خود جای میدهند. این ماژولها اغلب زمانی که Node شروع به اجرا میکند لود میشوند. تمام کاری که باید انجام دهید این است که این ماژولهای هستهای را برای استفاده در کدهای خود وارد کنید.
در جدول زیر چند ماژول هستهای پراهمیت آورده شده است.
ماژول هستهای | توضیحات |
http | شامل کلاسها، متدها و رویدادهایی است که نیازمند ایجاد سرورHTTP در Node.js هستند |
url | شامل متدهایی برای تفکیکپذیری URL و تجزیه در Node |
querystring | شامل متدهایی برای کار با رشتهی جستجو (query string) در Node |
path | شامل متدهایی برای کار با مسیرهای فایل |
fs | شامل کلاسها، متدها و رویدادهایی برای کار با I/O فایل |
util | شامل توابع کمکی که میتوانند برای برنامهنویسان سودمند باشند |
میتوانید با استفاده از کد زیر، ماژول هستهای خود را لود کنید:
- var module = require("module_name");
اکنون بیایید ببینیم ماژولهای محلی چه هستند.
ماژولهای محلی Node.JS
ماژولهای محلی Node.js، ماژولهایی سفارشی هستند که توسط کاربر یا توسعهدهنده به صورت محلی در اپلیکیشن ایجاد میشوند. این ماژولها عملکردهای متنوعی را در بر میگیرند که در فایلها و فولدرهای مجزا دستهبندی شدهاند. این فایلها و فولدرها میتوانند به آسانی با استفاده از NPM در انجمن Node.js توزیع شوند.
این ماژولها به روشی مشابه به ماژولهای هستهای بارگذاری میشوند. در مثال کاربردی زیر روش انجام این کار را میبینید.
ایجاد فایل ماژولهای محلی یا سفارشی:
- var detail ={name:function(name){console.log("Name: "+ name);},domain:function(domain){console.log("Domain: "+ domain);}};module.exports= detail;
فراخوانی فایل ماژول در فایل اصلی اپلیکیشن
- var myLogModule = require("./Local_module.js");myLogModule.name("Edureka");myLogModule.domain("Education");
اکنون با استفاده از دستور زیر میتوانید این فایلها را اجرا کنید:
- node application.js
اکنون ببینیم ماژولهای خارجی چه هستند.
ماژولهای خارجی (External Modules)
ماژولهای خارجی یا طرف سوم را تنها با دانلود آنها از طریق NPM میتوان به کار برد. این ماژولها اغلب توسط دیگر توسعهدهندگان توسعه مییابند و استفاده از آنها رایگان است. Express، react، gulp، mongoose و mocha از بهترین ماژولهای اکسترنال هستند.
لود کردن ماژولهای طرف سوم به صورت سراسری
- npm install --g <module_name>
فراخوانی فایل ماژول در فایل اصلی اپلیکیشن:
- npm install --save <module_name>
فایل JSON
فایل package.json در Node.js قلب اپلیکیشن است. این فایل، فایل مانیفستی است که فرادادههای پروژه را در بر دارد. بنابراین، آشنایی و کار با این فایل برای توسعهی موفقیت آمیز پروژهی Node حائز اهمیت است.
فایل package.json اغلب از فرادادههای اپلیکیشن تشکیل شده است که به دو دستهی زیر تقسیم میشود:
1. تعیین ویژگیهای فراداده: این دسته شامل ویژگیهایی مانند نام پروژه، نسخهی فعلی ماژول، لایسنس، نوسیندهی پروژه، توضیحات پروژه و … است.
2. نوشتن به طور مستقیم داخل فایل: شما میتوانید به صورت مستقیم اطلاعات ضروری را داخل فایل package.json وارد کرده و آن را به پروژهی خود فراخوانی کنید.
تا کنون با اجزاء مختلف اپلیکیشن Node.js آشنا شدهاید. در بخش بعدی آموزش، برخی از اصول Node.js را معرفی خواهم کرد تا بتوانیم با آمادگی بیشتری پیش برویم.
برای یادگیری بیشتر میتوانید آموزش کامل کار با ساختار JSON در برنامه نویسی اندروید را مشاهده نمایید.
اصول Node.js
از آنجایی که Node.js یک فریمورک جاواسکریپت است، از ساختار جاواسکریپت استفاده میکند. اکنون، شما را با چند اصل Node.js آشنا خواهم کرد:
انواع داده
مانند هر زبان برنامهنویسی دیگری، Node.js نیز شامل انواع دادهها است که به دو نوع دادهی primitive و non-primitive تقسیم میشود.
انواع دادهی primitive عبارتند از:
1. رشته (String)
2. عدد (Number)
3. بولین (Boolean)
4. تهی (Null)
5. تعریف نشده (Undefined)
انواع دادهی non-primitive عبارتند از:
1. شی (Object)
2. داده (Data)
3. آرایه (Array)
متغیرها
متغیر نهادی است که از مقادیری نگهداری میکند که ممکن است در طی اجرای برنامه تغییر کنند. برای ایجاد یک متغیر در Node.js، باید از کلمهی کلیدی var استفاده کنید. مجبور نیستید یک نوع داده به آن اختصاص دهید، چون کامپایلر آن را به صورت اتوماتیک انتخاب میکند.
ساختار کلی
- var varName = value;
عملگرها
Node.js از عملگرهای زیر پشتیبانی میکند:
نوع عملگر | عملگرها |
محاسباتی | +, -, *, %, ++, — |
تخصیص | =, +=, -=, *=, /=, %= |
شرطی | =? |
مقایسه | ==, ===, !=, !==, >, >=, <, <= |
منطقی | &&, ||, ! |
بیتی | &, |, ^, ~, <<, >>, >>> |
توابع
توابع در Node.js قطعه کدی هستند که یک اسم دارند و برای دسترسی به عمل خاصی نوشته میشوند. برای ایجاد آن باید از کلمهی کلیدی function استفاده کنید. به طور کلی، تابع یک فرآیند دو مرحلهای است. مرحلهی اول تعریف کردن تابع است و مرحلهی دوم فراخوانی آن است. ساختار کلی تعریف و فراخوانی یک تابع در مثال زیر دیده میشود:
مثال:
- //Defining a functionfunction display_Name(firstName, lastName) {alert("Hello " + firstName + " " + lastName);}//Invoking the functiondisplay_Name("Park", "Jimin");
اشیاء (Objects)
شی یک نوع دادهی non-primitive است که میتواند تحت شرایط خصوصیات و متدها، از چند مقدار نگهداری کند. اشیاء در Node.js نهادهایی مستقل هستند چرا که هیچ مفهومی به نام کلاس وجود ندارد. دو روش برای ایجاد یک شی وجود دارد:
1. استفاده از لفظ Object
2. استفاده از سازندهی شی
مثال:
- // object with properties and methodvar employee = {//propertiesfirstName: "Minho",lastName: "Choi",age: 35,salary:50000,//methodgetFullName: function () {return this.firstName + " " + this.lastName}};
سیستم فایل (File System)
برای دستیابی به سیستم فیزیکی فایل، Node.js از ماژول fs استفاده میکند که تمام عملیات همزمان و غیرهمزمان فایل I/O را نگهداری میکند. این ماژول با استفاده از دستور زیر وارد برنامه میشود:
- var fs = require("fs");
برخی از کاربردهای کلی ماژول File System عبارتند از:
- خواندن فایلها
1. fs.readFile()
- var http = require("http");var fs = require("fs");http.createServer(function(req, res){fs.readFile("script.txt",function(err, data){res.writeHead(200,{"Content-Type":"text/html"});res.write(data);res.end();});}).listen(8080);
- ساختن فایلها
1. appendFile()
2. open()
3. writeFile()
- آپدیت کردن فایلها
1. fs.appendFile()
2. fs.writeFile()
- پاک کردن فایلها
1. fs.unlink()
- تغییر نام فایلها
1. fs.rename()
بنابراین با کمک این دستورها میتوانید تا حدود زیادی تمام عملیات موردنیاز را بر روی فایلهای خود اجرا کنید. اکنون یک قدم به جلو حرکت کرده تا ببینیم رویدادها چه هستند و چگونه در Node.js اجرا میشوند.
رویدادها (Events)
همانطور که پیشتر اشاره شد، اپلیکیشنهای Node.js تک موضوعی و رویداد محور هستند. Node.js به دلیل داده محور بودن از همزمانی پشتیبانی میکند و این امر باعث میشود تا از مفاهیمی مانند رویدادها و فراخوانی برگشتی (callback) استفاده کند. فراخوانی عملیاتهای غیرهمزمان به Node.js کمک میکند تا همزمانی را در اپلیکیشن حفظ کند.
اساسا، در یک اپلیکیشن Node.js، حلقهای اصلی وجود دارد که منتظر رویدادها میماند و به آنها گوش میکند و هر زمان که رویدادی کامل شود، آن حلقه فورا یک فراخوان برگشتی را آغاز میکند.
شکل زیر نحوهی اجرا شدن رویدادها در Node.js را نشان میدهد.
نکتهای که در این قسمت باید در نظر داشته باشید این است که علیرغم اینکه رویدادها بسیار مشابه عملیات فراخوانی برگشتی هستند اما تفاوتی در کارکرد آنها وجود دارد. زمانی که یک عملیات غیرهمزمان نتایج را بازمیگرداند، فراخوانهای برگشتی خوانده میشوند.
از طرف دیگر رویدادی که به طور کامل اجرا شده بر روی الگوی ناظر کار میکند. در Node.js، متدهایی که به رویدادها گوش میکنند ناظر (observer) نام دارند.
درست از لحظهای که یک رویداد راهاندازی میشود، عملیات شنونده آن نیز به صورت خودکار اجرا میشود. ماژولهای Event و کلاس EventEmitter، چندین رویداد تعبیهشده را فراهم میآورند که برای مقید کردن رویداد به شنونده رویداد به کار میروند. ساختار کلی آن از این قرار است: