اگر به فکر انجام توسعه Back-end با استفاده از جاوا اسکریپت هستید، عبارت Node.js را خواهید شنید. Node اغلب با توسعه وب سرورهای قدرتمند همراه است.
اما Node.js دقیقا چیست؟ آیا این یک فریمورک جاوا اسکریپت درست مانند Angular است؟ آیا این یک زبان برنامه نویسی است؟ آیا این کتابخانه جاوا اسکریپت است؟ آیا این یک اصطلاح چتر برای گروهی از فناوری ها است؟ یا فقط یک کلمه دیگر برای جاوا اسکریپت است؟
در این مقاله، به دنیای Node.js می پردازیم و یاد می گیریم که چیست، چرا ایجاد شده است و برای چه مواردی استفاده می شود. این یک آموزش مبتنی بر پروژه نیست - هدف آن معرفی مبتدیان با Node و نحوه کار آن است.
در اینجا موضوعاتی وجود دارد که به آنها خواهیم پرداخت:
تاریخچه Node.js
Node.js چیست؟
Node.js چگونه کار می کند؟
ماژول ها در Node.js
Node.js منتظر است
اگر یادگیری در مورد ابزارهای نرم افزاری و نحوه کار آنها چیزی است که از آن لذت می برید، پس از خواندن این مقاله لذت خواهید برد. در این یادداشت، بیایید شروع کنیم.
تاریخچه Node.js
برندن ایچ که برای نت اسکیپ کار می کرد، جاوا اسکریپت را در سال ۱۹۹۵ اختراع کرد. اما این یک زبان برنامه نویسی بود که فقط می توانست روی یک مرورگر اجرا شود.
صفحات وب در ابتدا فقط اطلاعات ثابت را نمایش می دادند. اختراع جاوا اسکریپت نیاز به رفتار تعاملی بیشتر در صفحات وب را پر کرد. با این اختراع، توسعه دهندگان می توانند صفحات وب پویاتری بسازند.
پس از آنکه برندن ایچ جاوا اسکریپت را اختراع کرد، شرکت ها تلاش کردند تا از این زبان برای اجرای سرورهای وب نیز استفاده کنند ( اسکریپت نویسی سمت سرور ). این تلاشها شامل Livewire Netscape و صفحات سرور فعال مایکروسافت بود.
اما این هرگز راهی برای توسعه سرورهای وب نشد، حتی اگر جاوا اسکریپت همچنان در مرورگر مورد استفاده قرار گیرد.
در سال ۲۰۰۸، گوگل یک مرورگر وب جدید به نام کروم را معرفی کرد. این مرورگر زمانی که منتشر شد انقلابی در دنیای مرور اینترنت ایجاد کرد. این یک مرورگر بهینه شده است که جاوا اسکریپت را سریع اجرا می کند و تجربه کاربر را در وب بهبود بخشیده است.
دلیل اینکه گوگل کروم توانست کد جاوا اسکریپت را به سرعت اجرا کند این بود که یک موتور جاوا اسکریپت به نام V8 در داخل کروم کار می کرد. آن موتور مسئول پذیرش کد جاوا اسکریپت، بهینه سازی کد و سپس اجرای آن بر روی کامپیوتر بود.
موتور راه حل مناسبی برای جاوا اسکریپت سمت کلاینت بود. گوگل کروم به مرورگر وب پیشرو تبدیل شد.
در سال ۲۰۰۹، یک مهندس نرمافزار به نام رایان دال از روش محبوبی که سرورهای بکاند در آن زمان اجرا میشدند انتقاد کرد. محبوب ترین نرم افزار برای ساخت سرورهای وب سرور HTTP Apache بود. دال استدلال می کرد که محدود است، زیرا نمی تواند تعداد زیادی از اتصالات کاربر بلادرنگ (۱۰۰۰۰+) را به طور موثر اداره کند.
این یکی از دلایل اصلی بود که رایان دال Node.js را توسعه داد ، ابزاری که خودش ساخته بود. Node.js از موتور V8 گوگل برای درک و اجرای کد جاوا اسکریپت در خارج از مرورگر استفاده کرد. این برنامه ای بود که هدفش اجرای وب سرورها بود.
Node.js یک جایگزین عالی برای سرور سنتی Apache HTTP بود و به آرامی در بین جامعه توسعه دهندگان مقبولیت یافت.
امروزه بسیاری از سازمان های بزرگ مانند نتفلیکس، ناسا، لینکدین، پی پال و بسیاری دیگر از Node.js استفاده می کنند. این شرکت ها از قابلیت های Node.js برای ایجاد برنامه های کاربردی قوی برای کاربران خود استفاده می کنند.
همچنین، در جدیدترین نظرسنجی توسعهدهندگان StackOverflow در زمان نگارش این مقاله، Node.js به عنوان محبوبترین فناوری در دسته «فریمورکها و فناوری وب» رتبهبندی شد. این نشان می دهد که Node.js در حال حاضر چقدر محبوب است.

این مقاله به طور عمیق به تحلیل مواردی که Node.js را متمایز می کند و نحوه عملکرد آن می پردازد. اما قبل از آن، باید دقیقاً تعریف کنیم که چیست.
Node.js چیست؟

از وب سایت رسمی Node.js ، بیان می کند که:
Node.js یک محیط زمان اجرا جاوا اسکریپت متن باز و چند پلتفرمی است.
برای اینکه بتوانیم Node.js را تعریف کنیم، باید تعریف را به بخش هایی تقسیم کنیم. اصطلاحاتی که تعریف می کنیم عبارتند از:
متن باز
کراس پلت فرم
محیط زمان اجرا
متن باز به چه معناست؟
منبع باز معمولاً برای توصیف نرم افزاری استفاده می شود که عموم می توانند کد منبع آن را تحلیل و ویرایش کنند. این به این معنی است که هر کسی می تواند کدی را که باعث می شود برنامه به روشی که انجام می دهد تحلیل کند.
مزیت این امر این است که کاربران برنامه به آن و قابلیت های آن بیشتر می فهمند. همچنین، اگر فردی اشکالی را تشخیص دهد، میتواند کمک کند و اشکال را برطرف کند.
میتوانید کد منبع Node را در GitHub بیابید، محبوبترین وبسایت برای نمایش کد منبع باز. Node.js همچنین مشارکت کنندگان زیادی دارد - افرادی که ویژگی ها را اضافه می کنند و باگ ها را برطرف می کنند - در GitHub. همه به کد منبع Node.js دسترسی دارند و حتی می توانند در صورت تمایل نسخه سفارشی شده خود را از برنامه بسازند.
کراس پلتفرم به چه معناست؟
اگر برنامه ای چند پلتفرمی باشد، به این معنی است که برنامه به یک سیستم عامل یا معماری سخت افزاری محدود نمی شود.
یک برنامه کراس پلتفرم می تواند بر روی چندین پلتفرم اجرا شود. Node.js روی ویندوز، لینوکس، یونیکس و MacOS در میان سایر پلتفرم ها اجرا می شود. توسعه دهندگان می توانند از Node.js در بسیاری از سیستم عامل ها استفاده کنند.
محیط اجرا چیست؟
محیط زمان اجرا یک زبان برنامه نویسی به هر محیطی گفته می شود که کاربر بتواند کدهای نوشته شده به آن زبان را اجرا کند. آن محیط تمام ابزارها و منابع لازم برای اجرای کد را فراهم می کند. Node.js یک محیط زمان اجرا جاوا اسکریپت است.
به غیر از Node.js، نمونه دیگری از محیط اجرای جاوا اسکریپت، مرورگر وب است. یک مرورگر معمولاً تمام منابع لازم برای اجرای کد جاوا اسکریپت سمت کلاینت را دارد.
در مرورگر، ما می توانیم از جاوا اسکریپت برای تعامل با عناصر نشانه گذاری و تغییر سبک استفاده کنیم. مرورگر به سرعت کد را اجرا می کند، زیرا یک محیط زمان اجرا است.
از سه عبارت تعریف شده در بالا، می توانید ببینید که Node.js یک چارچوب جاوا اسکریپتی مانند Angular نیست. Node.js یک زبان برنامه نویسی نیست، یک کتابخانه جاوا اسکریپت نیست، و نه نامی برای گروهی از فناوری ها است. همچنین نام دیگری برای جاوا اسکریپت نیست.
Node.js یک برنامه نرم افزاری است که می تواند کد جاوا اسکریپت را اجرا کند. به بیان درست تر، Node.js یک محیط زمان اجرا جاوا اسکریپت است. این محیطی است که برای امکان استفاده از کد جاوا اسکریپت برای اسکریپت نویسی سمت سرور ایجاد شده است.
Node.js چگونه کار می کند؟
Node.js بیشتر با C/C++ نوشته شده بود. Node.js به عنوان برنامه ای که قرار است سرورهای وب را اجرا کند، باید دائماً با سیستم عامل دستگاه تعامل داشته باشد.
ساخت Node.js با زبان سطح پایینی مانند C، دسترسی نرم افزار به منابع سیستم عامل و استفاده از آنها برای اجرای دستورالعمل ها را آسان می کند.
اما پیچیدگی های بسیار بیشتری در نحوه کار Node.js وجود دارد. Node.js وب سرورهای سریع و کارآمدی را اجرا می کند، اما دقیقا چگونه این کار را انجام می دهد؟ این بخش فرآیندی را توضیح می دهد که Node.js برای دستیابی به کارایی خود استفاده می کند.
سه مؤلفه اصلی وجود دارد که باید آنها را درک کنیم تا ببینیم Node.js چگونه کار می کند. این اجزا عبارتند از:
موتور V8
لیبوو
حلقه رویداد
ما به جزئیات می پردازیم و هر یک از این مؤلفه ها و نحوه تشکیل Node.js را توضیح می دهیم.
موتور V8 چیست؟
موتور V8 موتور جاوا اسکریپت است که کد جاوا اسکریپت را در مرورگر کروم تفسیر و اجرا می کند. برخی از مرورگرهای دیگر از موتور متفاوتی استفاده می کنند، به عنوان مثال، فایرفاکس از SpiderMonkey و Safari از JavaScriptCore استفاده می کند . بدون موتور جاوا اسکریپت، کامپیوتر نمی تواند جاوا اسکریپت را بفهمد.
موتور V8 شامل پشته حافظه و پشته تماس است. آنها بلوک های سازنده موتور V8 هستند. آنها به مدیریت اجرای کد جاوا اسکریپت کمک می کنند.
پشته حافظه ذخیره اطلاعات موتور V8 است. هر زمان که متغیری ایجاد می کنیم که یک شی یا تابع را در جاوا اسکریپت نگه می دارد، موتور آن مقدار را در پشته حافظه ذخیره می کند. برای ساده نگه داشتن همه چیز، شبیه کوله پشتی است که وسایل را برای یک کوهنورد ذخیره می کند.
هر زمان که موتور در حال اجرای کد است و به هر یک از آن متغیرها برخورد می کند، مقدار واقعی را از پشته حافظه جستجو می کند - درست مانند زمانی که کوهنوردی احساس سرما می کند و می خواهد آتشی روشن کند، می تواند به دنبال فندک به کوله پشتی خود بگردد.
عمق بسیار بیشتری برای درک پشته حافظه وجود دارد. مدیریت حافظه در جاوا اسکریپت موضوعی است که توضیح آن به زمان بیشتری نیاز دارد زیرا فرآیند واقعی بسیار پیچیده است. برای کسب اطلاعات بیشتر در مورد پشته حافظه، این منبع را تحلیل کنید .
پشته تماس یکی دیگر از اجزای سازنده موتور V8 است. این یک ساختار داده است که ترتیب عملکردهایی را که باید اجرا شوند را مدیریت می کند. هر زمان که برنامه تابعی را فراخوانی می کند، تابع در پشته تماس قرار می گیرد و تنها زمانی می تواند پشته را ترک کند که موتور آن عملکرد را مدیریت کرده باشد.
جاوا اسکریپت یک زبان تک رشته ای است، به این معنی که فقط می تواند یک دستور را در یک زمان اجرا کند. از آنجایی که پشته فراخوانی شامل ترتیب دستورهایی است که باید اجرا شوند، به این معنی است که موتور جاوا اسکریپت فقط یک سفارش دارد، یک پشته تماس. در اینجا درباره تک رشته و پشته تماس بیشتر بخوانید.

لیبوو چیست؟
به غیر از موتور V8، یکی دیگر از اجزای بسیار مهم Node.js Libuv است. Libuv یک کتابخانه C است که برای انجام عملیات ورودی/خروجی (I/O) استفاده می شود.
عملیات ورودی/خروجی با ارسال درخواست ها به کامپیوتر و دریافت پاسخ ها ارتباط دارد. این عملیات شامل خواندن و نوشتن فایل ها، ایجاد درخواست های شبکه و غیره است.

از وب سایت رسمی Libuv، آنها بیان می کنند که:
Libuv یک کتابخانه پشتیبانی چند پلتفرمی با تمرکز بر ورودی/خروجی ناهمزمان است.
این بدان معناست که Libuv چند پلتفرمی است (می تواند بر روی هر سیستم عاملی اجرا شود) و بر روی ورودی/خروجی ناهمزمان تمرکز دارد.
کامپیوتر معمولاً برای پردازش دستورالعملهای ورودی/خروجی زمان میبرد، اما Libuv – کتابخانهای که Node.js برای ارتباط با رایانه از آن استفاده میکند – بر روی ورودی/خروجی ناهمزمان متمرکز است. می تواند بیش از یک عملیات ورودی/خروجی را همزمان انجام دهد.
این همان چیزی است که باعث میشود Node.js دستورالعملهای ورودی/خروجی را بهرغم تک رشتهای بودن، به نحو احسن پردازش کند. همه اینها به خاطر لیبوو است. Libuv می داند که چگونه درخواست ها را به صورت ناهمزمان مدیریت کند، در نتیجه تاخیر را به حداقل می رساند. اما موتور جاوا اسکریپت دقیقاً چگونه از Libuv استفاده می کند؟
هر زمان که اسکریپتی را به Node.js ارسال می کنیم، موتور کد را تجزیه می کند و شروع به پردازش می کند. پشته تماس توابع فراخوانی شده را نگه می دارد و برنامه را پیگیری می کند. اگر موتور V8 با یک عملیات I/O مواجه شود، آن عملیات را به Libuv منتقل می کند. سپس Libuv عملیات I/O را اجرا می کند.
توجه داشته باشید که Libuv یک کتابخانه C است. چگونه از کد جاوا اسکریپت برای اجرای دستورات C استفاده کنیم؟ اتصالاتی وجود دارد که توابع جاوا اسکریپت را به پیاده سازی واقعی آنها در Libuv متصل می کند. این اتصالات استفاده از کد جاوا اسکریپت را برای دستورالعمل های ورودی/خروجی ممکن می سازد.
Node.js از Libuv برای اجرای واقعی استفاده می کند اما رابط های برنامه نویسی برنامه (API) را در معرض نمایش قرار می دهد. پس ، اکنون میتوانیم از یک Node.js API (که شبیه یک تابع جاوا اسکریپت است) برای شروع عملیات I/O استفاده کنیم.
نکته جالب توجه این است که درست است که جاوا اسکریپت یک زبان تک رشته ای است، اما Libuv - کتابخانه سطح پایین Node.js از آن استفاده می کند - می تواند هنگام اجرای دستورالعمل ها در سیستم عامل از یک Thread Pool (چند رشته) استفاده کند. .
اکنون، هنگام استفاده از Node.js لازم نیست نگران این رشته ها باشید. Libuv می داند که چگونه آنها را به طور موثر مدیریت کند. شما فقط باید از API های ارائه شده Node.js برای نوشتن دستورالعمل ها استفاده کنید.

Libuv در ابتدا برای Node.js ایجاد شد، اما زبان های برنامه نویسی مختلف اکنون برای آن پیوندهایی دارند. جولیا و لوویت (محیط زمان اجرا مبتنی بر Lua) پیوندهایی را درست مانند Node.js دارند، اما زبانهای دیگر کتابخانههایی دارند که این پیوندها را ارائه میکنند. به عنوان مثال می توان به uvloop در پایتون اشاره کرد.
حلقه رویداد چیست؟
حلقه رویداد در Node.js بخش بسیار مهمی از فرآیند است. از نام، می توانیم ببینیم که یک حلقه است. با شروع اجرای برنامه Node.js، حلقه شروع به اجرا می کند. در این بخش تحلیل می کنیم که حلقه رویداد چه می کند.
وقتی برنامه جاوا اسکریپت خود را اجرا می کنیم که حاوی کدهای ناهمزمان است (مانند دستورالعمل های I/O یا اقدامات مبتنی بر تایمر)، Node.js آنها را با استفاده از Node.js API مدیریت می کند. توابع ناهمزمان معمولاً دستورالعمل هایی دارند که باید پس از پایان پردازش تابع اجرا شوند. این دستورالعمل ها در یک Callback Queue قرار می گیرند.
Callback Queue با رویکرد First In First Out (FIFO) کار می کند. این بدان معناست که اولین دستورالعملی که وارد صف می شود اولین دستوری است که فراخوانی می شود.
همانطور که حلقه رویداد اجرا می شود، تحلیل می کند که آیا پشته تماس خالی است. اگر پشته تماس خالی نباشد، به روند جاری اجازه می دهد تا ادامه یابد. اما اگر پشته تماس خالی باشد، اولین دستورالعمل در صف برگشت به موتور جاوا اسکریپت را ارسال می کند. سپس موتور آن دستور (عملکرد) را روی پشته تماس قرار می دهد و آن را اجرا می کند. این بسیار شبیه نحوه عملکرد حلقه رویداد در مرورگر است.
پس ، حلقه رویداد با استفاده از موتور جاوا اسکریپت V8 در Node.js، فراخوانیها را از دستورالعملهای ناهمزمان اجرا میکند. و این یک حلقه است، به این معنی که هر بار که اجرا میشود، پشته تماس را تحلیل میکند تا بداند آیا اصلیترین callback را حذف میکند و آن را به موتور جاوا اسکریپت میفرستد.

گفته می شود که Node.js دارای معماری رویداد محور است. این بدان معناست که Node.js بر اساس گوش دادن به رویدادها و واکنش سریع به آنها در هنگام وقوع ساخته شده است. این رویدادها می توانند رویدادهای تایمر، رویدادهای شبکه و غیره باشند.
Node.js با استفاده از یک حلقه رویداد برای بارگیری تماسهای رویداد به موتور پس از اینکه چیزی باعث ایجاد یک رویداد شد، به آن رویدادها پاسخ میدهد. به همین دلیل است که Node.js برای انتقال بلادرنگ داده در برنامه ها عالی است.
ماژول ها در Node.js
بسیاری از قابلیتهای Node.js در ماژولهایی که با نرمافزار ارائه میشوند قرار دارند. این ماژول ها به منظور تقسیم بلوک های سازنده برنامه ها به تکه های قابل مدیریت مانند بلوک های لگو هستند. با وجود این، ما فقط باید ماژول هایی را که برای برنامه های خود نیاز داریم وارد کنیم.
به عنوان مثال، قطعه کد زیر یک ماژول داخلی به نام fs
را وارد می کند.
const fs = require('node:fs')
اما راه های دیگری نیز وجود دارد که می توانیم از ماژول ها در Node.js استفاده کنیم. به غیر از ماژولهای داخلی، میتوانیم از ماژولها (یا بستههای) دیگر توسعهدهندگان نیز استفاده کنیم.
Node Package Manager (NPM) یک نرم افزار کاربردی است که همراه با Node.js می باشد. تمام ماژول های شخص ثالث موجود در Node.js را مدیریت می کند. هر زمان که به یک بسته شخص ثالث نیاز داشتید، آن را از NPM با استفاده از دستور npm install
نصب می کنید.

برای وارد کردن ماژولی که از NPM نصب کرده اید چیزی شبیه به این است:
const newModule = require('newModule')
Node.js به دنبال آینده است
Node.js در حال حاضر جامعه بزرگی از توسعه دهندگان دارد. هزاران مشارکت کننده در GitHub دارد و برخی از بزرگترین شرکت های امروزی از آن استفاده می کنند. اما آینده Node.js چگونه است؟
Node.js از زمانی که در سال ۲۰۰۹ به وجود آمد به خوبی تکامل یافته است. در ابتدا برای توسعه Back-end ساخته شده بود، اما اکنون می تواند کارهای بیشتری انجام دهد. می توانید از Node.js برای توسعه برنامه های دسکتاپ، برنامه های کاربردی وب جلویی، برنامه های کاربردی تلفن همراه و ابزارهای خط فرمان استفاده کنید. توسعه دهندگان به استفاده از آن برای بیشتر و بیشتر این برنامه ها ادامه خواهند داد.
رایان دال - مخترع Node.js - در سال ۲۰۱۸ یک JavaScript Runtime جدید به نام Deno معرفی کرد. او این Runtime را که به صورت مشترک ایجاد کرده بود در یک سخنرانی با عنوان "10 چیزی که در مورد Node.js پشیمان هستم" رونمایی کرد.
Deno یک محیط زمان اجرا جاوا اسکریپت است که بر اساس موتور V8 گوگل کروم است اما به زبان Rust نوشته شده است. Deno نه تنها یک محیط Runtime برای جاوا اسکریپت بلکه TypeScript است.
رایان دال Deno را ایجاد کرد زیرا تصمیم گرفت در مورد طرح اولیه Node.js تصمیمات اشتباهی گرفته است. او می خواست تصمیمات معماری بهتری برای محیط اجرای JavaScript برای سرورهای وب اتخاذ کند. نتیجه دنو بود.

اما Deno هنوز شاهد پذیرش گسترده ای در جامعه توسعه دهندگان نیست. این هنوز یک فناوری نسبتاً جدید است و برای به دست آوردن جایگاه به زمان بیشتری نیاز دارد.
همچنین، بنیاد OpenJS که سازمانی است که به طور فعال مدیریت، توسعه و نگهداری Node.js را بر عهده دارد، برخی از اشکالات و کارایی نهایی Node.js را رفع کرده است. پروژههای بیشتری بر روی معماری Node.js ساخته میشوند، و احتمالاً در آینده قابل پیشبینی ادامه خواهد یافت.
نتیجه
در این مقاله، شما چیزهای زیادی یاد گرفته اید و اکنون می توانید با اطمینان به این سوال پاسخ دهید که Node.js دقیقا چیست؟
ما با مرور تاریخچه Node.js شروع کردیم، سپس Node.js را به درستی تعریف کردیم. پس از آن، نحوه عملکرد Node.js را توضیح دادیم و اجزایی مانند V8 Engine، Libuv و Event Loop را توضیح دادیم.
پس از آن، ما در مورد ماژول ها در Node.js و NPM صحبت کردیم. در نهایت، ما به آنچه در آینده میتواند برای Node.js باشد نگاه کردیم و به این نتیجه رسیدیم که احتمالاً برنامههای کاربردی بیشتری را تقویت میکند.
اگر می خواهید یاد بگیرید که چگونه از Node.js برای ساخت برنامه ها استفاده کنید، freeCodeCamp یک لیست پخش کامل از آموزش های اختصاص داده شده به آن دارد. منابع فراوانی برای یادگیری این فناوری در اینترنت وجود دارد، و موارد بیشتری در راه است.
در ساخت برنامه بعدی خود موفق باشید و دفعه بعد شما را می بینیم.