نود.جی‌اس

تاریخچه

نود. جی‌اس در ابتدا در سال ۲۰۰۹ توسط رایان دال (به انگلیسی: Ryan Dahl) نوشته شد. ۱۳ سال قبل از آن نیز اولین محیط توسعهٔ جاوااسکریپت در سمت سرور با نام LiveWire Pro Web توسط نت‌اسکیپ معرفی شده بود. نسخهٔ اولیهٔ نود. جی‌اس تنها از سیستم‌عامل لینوکس و مک‌اواس پشتیبانی می‌کرد. توسعه و نگهداری نود. جی‌اس توسط رایان دال صورت می‌گرفت و سپس نیز توسط شرکت جویِنت حمایت شد.
مشاهدهٔ نوار پیشرفت بارگذاری فایل در سایت فلیکر توسط رایال دال، الهام بخش ایدهٔ ساخت نود. جی‌اس شد. در آن موقع حین بارگذاری فایل در سایت فلیکر، مرورگر وب نمی‌توانست تشخیص دهد که چه میزان از فایل بارگذاری شده و بنابراین برای نمایش روند پیشرفت بارگذاری، مرورگر مجبور بود به وب سرور درخواست دهد. رایان دال مشتاق راه ساده‌تری برای این‌کار بود.
رایان دال در سال ۲۰۰۹ به انتقاد از ضعفِ محبوب‌ترین سرور وب جهان یعنی آپاچی در زمینهٔ رسیدگی به تعداد زیادی کانکشن (تا ۱۰٬۰۰۰ کانکشن یا بیش‌تر) پرداخت و همچنین انتقاداتی را به متداول‌ترین روش کدنویسی یعنی برنامه‌نویسی ترتیبی (به انگلیسی: Sequential Programming) وارد کرد. در برنامه‌نویسی ترتیبی در مواجهه با کانکشن‌های هم‌زمان یا کل فرایند برنامه موقتاً متوقف می‌شود یا بالاجبار مقداری زیادی از حافظهٔ اصلی به پشتهٔ فراخوانی اختصاص می‌یابد.
رایان دال پروژهٔ نود. جی‌اس را در ۸ نوامبر سال ۲۰۰۹، در افتتاحیهٔ همایش JSCond در اروپا به همگان معرفی کرد. نود. جی‌اس تشکیل شده بود از موتور جاوااسکریپت وی۸ (به انگلیسی: V8 Javascript engine) گوگل به همراه یک حلقهٔ رخداد (به انگلیسی: Event loop) و نیز یک رابط برنامه‌نویسی کاربردی سطح پایین برای ورودی/خروجی. ارائهٔ پروژه توسط رایال دال در همایش JSConf با تشویق ایستاده حاضرین روبرو شد.
در ژانویه ۲۰۱۰، سامانه مدیریت بسته ان‌پی‌ام (به انگلیسی: npm) برای نود. جی‌اس معرفی شد. ان‌پی‌ام فرایند انتشار و به اشتراک‌گذاری کد منبعِ کتابخانه‌های نود. جی‌اس را آسان می‌کند و طراحی شده تا کار نصب، بروزرسانی و حذف کتابخانه‌های نرم‌افزاری را سهولت ببخشد.
در ژوئن ۲۰۱۱، مایکروسافت و جویِنت با همکاری یکدیگر کار پیاده‌سازیِ نسخهٔ بومی نود. جی‌اس برای ویندوز را شروع کردند. اولین نسخهٔ نود. جی‌اس که از سیستم‌عامل ویندوز پشتیبانی می‌کرد در ژولای ۲۰۱۱ منتشر شد.
در ژانویه ۲۰۱۲، رایان دال از مدیریت پروژه کناره‌گیری کرد و آن را به ایزاک اِشلوتر (به انگلیسی: Isaac Schlueter) که همکار او و نیز به وجود آورندهٔ ان‌پی‌ام نیز بود، واگذار کرد. در ژانویه ۲۰۱۴ اشلوتر نیز اعلام کرد که تیموتی جِی فُنتِین (به انگلیسی: Timothy J. Fontaine) پروژه را رهبری خواهد کرد.
در دسامبر ۲۰۱۴ فدور اینداتنی (به انگلیسی: Fedor Indutny) انشعابی از نود. جی‌اس را با نام آی‌او. جی‌اس (به انگلیسی: io.js) شروع کرد. به خاطر اختلاف داخلی اعضای پروژه بر سر نظارت شرکت جویِنت روی پروژه، آی‌او. جی‌اس به عنوان یک پروژهٔ جایگزین برای نود. جی‌اس با سیاست «حاکمیت [متن] باز» به همراه یک کمیتهٔ فنی جداگانه به وجود آمد. برخلاف نود. جی‌اس پدیدآورندگان آی‌او. جی‌اس تصمیم گرفتند تا نسخهٔ موتور وی۸ استفاده شده در پروژه، همواره بروز و مطابق آخرین نسخهٔ آن باشد.
در فوریهٔ ۲۰۱۵، قصد ایجاد بنیادی بی‌طرف با نام بنیاد نود. جی‌اس اعلام شد. سپس در ژوئن همان سال، کمیته‌های هر دو پروژه رأی موافق به همکاری با یکدیگر تحت بنیاد نود. جی‌اس دادند.
در سپتامبر ۲۰۱۵، نسخهٔ ۰٫۱۲ نود. جی‌اس با نسخهٔ ۳٫۳ آی‌او. جی‌اس ادغام شد و تحت نام نود (به انگلیسی: Node) با ورژن ۴٫۰ منتشر شد. این ادغام ویژگی‌های استاندارد ES6 موجود در موتور وی۸ و همچنین چرخهٔ انتشار با پشتیبانی بلندمدت (به انگلیسی: Long-term support release cycle) را به نود. جی‌اس اضافه کرد. از سال ۲۰۱۶ به بعد، وب‌سایت آی‌او. جی‌اس در پیامی به بازدیدکنندگان پیشنهاد می‌کند تا در نتیجهٔ ادغام دو پروژه و همچنین به خاطر عدم انتشار نسخهٔ جدیدی از آی‌او. جی‌اس، دوباره به استفاده از نود. جی‌اس بازگردند.

مرور

نود. جی‌اس امکان ساخت وب سرورها و ابزارهای شبکه را با استفاده از زبان جاوااسکریپت و مجموعه‌ای از پیمانه‌ها (به انگلیسی: Modules) که قابلیت‌های پایه‌ای را عرضه می‌کنند، در اختیار استفاده‌کننده قرار می‌دهد. پیمانه‌ها برای فعالیت‌های مختلفی از جمله کار با ورودی/خروجی سیستم فایل، شبکه (DNS، HTTP, TCP، TLS/SSL یا UDP)، داده‌های دودویی، توابع رمزنگاری، جریان‌های داده (به انگلیسی: Data streams) و … استفاده می‌شوند. رابط برنامه‌نویسی کاربردی‌ای (API) که پیمانه‌های نود. جی‌اس از آن استفاده می‌کنند به نحوی طراحی شده تا پیچیدگی نوشتن برنامه‌های کاربردی سمت سرور را کاهش دهد.
برنامه‌های کاربردی نوشته شده با نود. جی‌اس می‌توانند در سیستم‌عامل‌های لینوکس، مک‌اواس، مایکروسافت ویندوز، NonStop و سرورهای یونیکس اجرا شوند. برنامه‌های کاربردی نود. جی‌اس را با کافی‌اسکریپت (می‌تواند به جای جاوااسکریپت استفاده شود)، زبان برنامه‌نویسی دارت، تایپ‌اسکریپت (یا هر شکل دیگر از جاوااسکریپت با وابستگی زیاد به نوع) یا هر زبان دیگری که قابل ترجمه به جاوااسکریپت باشد، می‌توان نوشت.
نود. جی‌اس در وهلهٔ اول برای نوشتن برنامه‌های تحت شبکه مانند سرورهای وب استفاده می‌شود. بزرگترین تفاوت میان نود. جی‌اس و پی‌اچ‌پی (به انگلیسی: PHP) در این است که برخلاف پی‌اچ‌پی که در آن بیشتر توابع تا تمام شدن کار مسدود می‌شوند (به این معنا که دستورها تنها زمانی اجرا می‌شوند که دستورهای قبلی انجام شده باشند)، توابع در نود. جی‌اس به گونه‌ای طراحی شده‌اند تا ناهمگام باشند و در نتیجه مسدود نشوند (به این معنا که دستورهای همروند یا حتی به صورت موازی قابل اجرا هستند و برای اعلام موفقیت یا شکست در اجرا از بازخوان‌ها (به انگلیسی: Callbacks) استفاده می‌کنند).

معماری پلت‌فرم

نود. جی‌اس امکان برنامه‌نویسی رویداد محور را به سرورهای وب عرضه می‌کند که در نتیجه امکان توسعهٔ وب سرورهای سریع در جاوااسکریپت فراهم می‌شود. با نود. جی‌اس توسعه‌دهندگان قابلیت توسعهٔ سرورهایی با مقیاس‌پذیری بالا را بدون نیاز به ریسه‌ها (به انگلیسی: Threads) و تنها با استفاده از مدل ساده شدهٔ برنامه‌نویسی رویداد محور و استفاده از بازخوان‌ها دارند. نود. جی‌اس پُلی است میان راحتی استفاده از یک زبان برنامه‌نویسی اسکریپتی (مثل جاوااسکریپت) و قدرت برنامه‌نویسی شبکه‌ای در یونیکس.
از آنجا که موتور جاوااسکریپت وی۸ گوگل به صورت متن باز و تحت پروانهٔ بی‌اس‌دی منتشر شده بود و فوق‌العاده سریع بود و نیز توانایی فوق‌العاده‌ای در تکنولوژی‌های پایهٔ اینترنت مثل HTTP, DNS و TCP داشت، نود. جی‌اس نیز بر مبنای آن نوشته شد. همچنین به خاطر شناخته شده بودن جاوااسکریپت، نود. جی‌اس به سرعت برای اجتماع توسعه‌دهنگان وب قابل استفاده بود.

پشتیبانی از صنعت

هزاران کتابخانهٔ متن‌باز برای نود. جی‌اس وجود دارد که بیشتر آن‌ها در سایت ان‌پی‌ام میزبانی می‌شوند. جامعهٔ توسعه‌دهندگان نود. جی‌اس دو لیست پست‌سپاری (به انگلیسی: Mailing list) و یک کانال آی‌آرسی با نام nodejs# در فری‌نود دارد. چندین کنفرانس توسعه‌دهندگان و رویداد وجود دارد که از جامعهٔ نود. جی‌اس پشتیبانی می‌کنند؛ مثل NodeConf, Node interactive و Node Summit و نیز تعدادی رویداد ناحیه‌ای.
جامعهٔ متن‌باز برای تسریع روند توسعهٔ برنامه‌های کاربردی چندین چارچوب نرم‌افزاری تحت وب توسعه داده‌است. این چارچوب‌های نرم‌افزاری شامل کانکت (به انگلیسی: Connect)، اکسپرس جی‌اس (به انگلیسی: Express.js)، ساکت آی‌او (به انگلیسی: Socket.IO)، کوآ جی‌اس (به انگلیسی: Koa.js)، هپی جی‌اس (به انگلیسی: Hapi.js)، سیلز جی‌اس (به انگلیسی: Sails.js)، میتیور (به انگلیسی: Meteor)، دربی (به انگلیسی: Derby) و بسیاری دیگر می‌شوند.
محیط‌های مدرن یک‌پارچهٔ توسعه نرم‌افزار (به انگلیسی: Modern IDEs) امکانات مختلفی از جمله ویرایش و اشکال زدایی (به انگلیسی: Debugging) را مخصوص نود. جی‌اس ارائه می‌کنند.

جزئیات فنی

نود. جی‌اس یک محیط اجرایی جاوااسکریپت است که درخواست‌های ورودی را در یک حلقه موسوم به حلقهٔ رخداد، پردازش می‌کند.

چند نخی

نود. جی‌اس تنها روی یک نخ (ریسه) اجرا می‌شود و با استفاده از ورودی/خروجی ناهمگام (مسدود نشدنی) امکان پشتیبانی از ده‌ها هزار ارتباط هم‌زمان را بدون صرف هزینهٔ تعویض زمینه (به انگلیسی: Context switching) فراهم می‌کند. این نوع طراحی که در آن یک نخ (ریسه) بین تمام درخواست‌ها مشترک است به خاطر ساخت برنامه‌های کاربردی با همزمانی بسیار بالا، استفاده شده‌است که در آن هر تابعی که کار ورودی/خروجی انجام می‌دهد باید از بازخوانی (به انگلیسی: Callback) استفاده کند. نود. جی‌اس برای پیاده‌سازی حلقهٔ رخداد تک نخی، از کتابخانهٔ libuv استفاده می‌کند که این کتابخانه برای انجام عملیات ورودی/خروجی ناهمگام (مسدود نشدنی) از یک مخزن نخ (به انگلیسی: Thread pool) با اندازهٔ ثابت بهره می‌گیرد.
یک عیب روش تک نخی این است که اجازهٔ مقیاس‌پذیری عمودی (به انگلیسی: vertical scaling) را با استفاده از افزایش تعداد هسته‌های پردازنده بدون استفاده از پیمانه‌های اضافی، مثل کلاستر (به انگلیسی: Cluster) یا StrongLoop Process Manager یا pm2 نمی‌دهد. اگرچه توسعه‌دهندگان می‌توانند تعداد پیش‌فرض نخ‌ها در مخزن نخ کتابخانهٔ libuv را افزایش دهند؛ این نخ‌ها معمولاً توسط سیستم عامل سرور بین هسته‌های مختلف توزیع می‌شوند.
اجرای هم‌زمان کارها در نود. جی‌اس توسط یک مخزن نخ صورت می‌گیرد. فراخوانی توابع در نخ اصلی، وظایف (به انگلیسی: task) را داخل یک صف وظایف قرار می‌دهد که بین نخ‌های مخزن نخ به اشتراک گذاشته شده‌است؛ سپس نخ‌ها وظایف را از این صف برمی‌دارند و آن‌ها را اجرا می‌کنند. در بطن ماجرا، عملکردهای مسدود نشدنی سیستم، مثل کار با شبکه، به سوکت‌های مسدود نشدنی سمت هستهٔ سیستم عامل ترجمه می‌شوند درحالی که عملکردهای مسدود شدنی سیستم، مثل ورودی/خروجی فایل، به شکل مسدود شدنی داخل نخ خود اجرا می‌شوند. یک نخ در مخزن نخ، اتمام وظیفهٔ خود را به اطلاع نخ اصلی می‌رساند که متعاقباً نخ اصلی نیز بازخوان متناظر با وظیفه را بیدار و اجرا می‌کند. از آنجایی که بازخوان‌ها به‌طور ترتیبی در نخ اصلی اجرا می‌شوند، محاسبات طولانی و دیگر وظایف وابسته به پردازش‌گر (به انگلیسی: CPU-bound)، تمام حلقهٔ رخداد را تا زمانی که کارشان به پایان برسد مسدود خواهند کرد.

وی۸

وی۸ موتور اجرای جاوااسکریپتی است که برای مرورگر گوگل کروم ساخته و در سال ۲۰۰۸ توسط گوگل متن‌باز شد. وی۸ که با زبان سی‌پلاس‌پلاس نوشته شده به جای اجرای آنی کدهای جاوااسکریپت ابتدا آن‌ها را به کد ماشین کامپایل می‌کند.
نود. جی‌اس از کتابخانهٔ libuv برای رسیدگی به رخدادهای ناهمگام (به انگلیسی: asynchronous events) استفاده می‌کند. libuv یک لایهٔ انتزاعی برای شبکه و قابلیت‌های سیستم فایل است که هم در ویندوز و هم در سیستم‌های برپایهٔ پازیکس (به انگلیسی: POSIX-based)، مثل لینوکس و مک‌اواس، قابل استفاده است.
قابلیت‌های اصلی نود. جی‌اس در یک کتابخانهٔ جاوااسکریپت مستقر است. بایندینگ‌های (به انگلیسی: bindings) نود. جی‌اس (پیمانه‌هایی که با زبان سی‌پلاس‌پلاس نوشته شده‌اند و یک API به زبان جاوااسکریپت عرضه می‌کنند که می‌توان به راحتی از آن‌ها استفاده کرد)، این تکنولوژی‌های مختلف را با یکدیگر و نیز با سیستم‌عامل متصل می‌کند.

مدیریت بسته

ان‌پی‌ام (به انگلیسی: NPM) مدیر بسته‌ی از پیش نصب شده و پیش‌فرض برای سکوی نود. جی‌اس است. از ان‌پی‌ام برای نصب برنامه‌های نود. جی‌اس از مخزن ان‌پی‌ام، ساماندهی به نصب‌ها و نیز مدیریت برنامه‌های شخص ثالثِ نود. جی‌اس استفاده می‌شود. نباید ان‌پی‌ام را با دستور ()require در CommonJS اشتباه گرفت. از ان‌پی‌ام برای بارگذاری کد استفاده نمی‌شود؛ بلکه از آن برای نصب کد و مدیریت وابستگی‌های کد از طریق خط فرمان استفاده می‌شود. بسته‌هایی که در مخزن ان‌پی‌ام قرار دارند بسیار متنوع‌اند و در آن از کتابخانه‌های سادهٔ کمکی مثل Lodash تا اجراکننده‌های وظیفه مثل گرانت (به انگلیسی: Grunt) را می‌توان پیدا کرد.

حلقهٔ رخداد

نود.جی‌اس خودش را به سیستم‌عامل وصل می‌کند تا هرگاه اتصال (به انگلیسی: Connection) جدیدی ایجاد شد، سیستم‌عامل یک بازخوان را فراخوانی کند. در داخل نود.جی‌اس هر اتصال یک اختصاص هیپ (به انگلیسی: Heap) کوچک است. به‌طور سنتی، اتصال‌ها توسط پردازه‌ها یا نخ‌های سنگینِ سیستم‌عامل رسیدگی می‌شدند. نود.جی‌اس برای مقیاس‌پذیری بیشتر به جای پردازه‌ها یا نخ‌ها از یک حلقهٔ رخداد استفاده می‌کند. برعکس سرورهای رخدادگرای دیگر، نیاز نیست تا حلقهٔ رخدادِ نود.جی‌اس به‌طور صریح صدا زده شود؛ به جای آن بازخوان‌ها تعریف می‌شوند و سرور در آخر تعریف بازخوان به‌طور اتوماتیک وارد حلقهٔ رخداد می‌شود. زمانی که هیچ بازخوان دیگری موجود نباشد، نود.جی‌اس از حلقهٔ رخداد خارج می‌شود.

نمونه کد

به عنوان یک محیط اجراییِ ناهمگامِ جاوااسکریپت، نود.جی‌اس برای ساختن برنامه‌های کاربردی مقیاس‌پذیر تحت شبکه طراحی شده. در مثال «سلام، دنیا!» که در ادامه آورده شده، تعداد زیادی اتصال به صورت هم‌زمان رسیدگی می‌شوند. با برقراری هر اتصال، بازخوان صدا زده می‌شود.
const http = require('http');const hostname = '127.0.0.1';const port = 3000;const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World\n');});server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);});