نود جی‌اس
نود جی‌اس یا نود دات جی‌اس یک محیط اجرایی سمت سرور متن‌باز و چندسکویی برای زبان جاوااسکریپت است. از لحاظ تاریخی از جاوااسکریپت در درجهٔ اول به عنوان یک زبان اسکریپت‌نویسی سمت کاربر به این صورت استفاده می‌شد که اسکریپت‌های نوشته شده با جاوااسکریپت درون صفحات اچ‌تی‌ام‌ال جاسازی می‌شدند و سپس این اسکریپت‌ها توسط یک موتور جاوااسکریپت در مرورگر وب کاربر پردازش می‌شد. نود جی‌اس امکان استفاده از جاوااسکریپت برای نوشتن اسکریپت‌های سمت سرور را فراهم می‌کند تا بدین صورت بتوان با آن صفحات وب پویا را قبل از فرستادن آن به مرورگر کاربر تولید کرد. در نتیجه نود جی‌اس به یکی از المان‌های اصلی در پارادایم «جاوااسکریپت در همه جا» تبدیل شده‌است که در آن به جای استفاده از زبان‌های برنامه‌نویسی مختلف در نوشتن اسکریپت‌های سمت سرور، از یک زبان واحد برای توسعهٔ برنامه‌های کاربردی وب استفاده می‌شود.
اگرچه به صورت قراردادی از codice_1 به عنوان پسوند نام پرونده‌های جاوااسکریپت استفاده می‌شود اما این عبارت در نام نود جی‌اس (Node.js) اشاره به پروندهٔ خاصی ندارد و صرفاً قسمتی از نام این محصول است. معماری نرم‌افزاری نود جی‌اس یک معماری مبتنی بر رخداد است که توانایی ارتباط ورودی/خروجی ناهمگام (مسدود نشدنی) را دارد. هدف استفاده از این نوع طراحی نرم‌افزاری، بهینه‌سازی توان عملیاتی و مقیاس‌پذیری در برنامه‌های کاربردی وبی که عملیات ورودی/خروجی زیادی دارند و همچنین برنامه‌های کاربردی وب بلادرنگ (برنامه‌های ارتباط بلادرنگ مانند اتاق گفتگو یا بازی‌های تحت مرورگر) است.
پروژهٔ توسعهٔ توزیع‌شدهی نود جی‌اس تحت نظارت بنیاد اپن‌جی‌اس (OpenJS Foundation قرار دارد که جزئی از برنامهٔ پروژه‌های جمعی بنیاد لینوکس نیز می‌باشد.
شرکت‌های استفاده‌کننده از نود جی‌اس شامل شرکت‌هایی مثل آی‌بی‌ام، لینکداین، مایکروسافت، نت‌فلیکس، پی‌پل، یاهو!، توئیتر و سیسکو می‌شود.
نود جی‌اس در ابتدا در سال ۲۰۰۹ توسط رایان دال (Ryan Dahl) نوشته شد. ۱۳ سال قبل از آن نیز اولین محیط توسعهٔ جاوااسکریپت در سمت سرور با نام LiveWire Pro Web توسط نت‌اسکیپ معرفی شده بود. نسخهٔ اولیهٔ نود جی‌اس تنها از سیستم‌عامل لینوکس و مک‌اواس پشتیبانی می‌کرد. توسعه و نگهداری نود جی‌اس توسط رایان دال صورت می‌گرفت و سپس نیز توسط شرکت جوینت حمایت شد.
مشاهدهٔ نوار پیشرفت بارگذاری فایل در سایت فلیکر توسط رایال دال، الهام بخش ایدهٔ ساخت نود جی‌اس شد. در آن موقع حین بارگذاری فایل در سایت فلیکر، مرورگر وب نمی‌توانست تشخیص دهد که چه میزان از فایل بارگذاری شده و بنابراین برای نمایش روند پیشرفت بارگذاری، مرورگر مجبور بود به وب سرور درخواست دهد. رایان دال مشتاق راه ساده‌تری برای این‌کار بود.
رایان دال در سال ۲۰۰۹ به انتقاد از ضعف محبوب‌ترین سرور وب جهان یعنی آپاچی در زمینهٔ رسیدگی به تعداد زیادی اتصال (تا ۱۰٬۰۰۰ اتصال یا بیش‌تر) پرداخت و همچنین انتقاداتی را به متداول‌ترین روش کدنویسی یعنی برنامه‌نویسی ترتیبی (Sequential Programming) وارد کرد. در برنامه‌نویسی ترتیبی در مواجهه با کانکشن‌های هم‌زمان یا کل فرایند برنامه موقتاً متوقف می‌شود یا بالاجبار مقداری زیادی از حافظهٔ اصلی به پشتهٔ فراخوانی اختصاص می‌یابد.
رایان دال پروژهٔ نود جی‌اس را در ۸ نوامبر سال ۲۰۰۹، در افتتاحیهٔ همایش JSCond در اروپا به همگان معرفی کرد. نود جی‌اس تشکیل شده بود از موتور جاوااسکریپت وی۸ (V8) گوگل به همراه یک حلقهٔ رخداد (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 و سرورهای یونیکس اجرا شوند. برنامه‌های کاربردی نود جی‌اس را با کافی‌اسکریپت، زبان برنامه‌نویسی دارت، تایپ‌اسکریپت (یا هر شکل دیگر از جاوااسکریپت با وابستگی زیاد به نوع) یا هر زبان دیگری که قابل ترجمه به جاوااسکریپت باشد، می‌توان نوشت.
نود جی‌اس در وهلهٔ اول برای نوشتن برنامه‌های تحت شبکه مانند سرورهای وب استفاده می‌شود. بزرگترین تفاوت میان نود جی‌اس و پی‌اچ‌پی در این است که برخلاف پی‌اچ‌پی که در آن بیشتر توابع تا تمام شدن کار مسدود می‌شوند (به این معنا که دستورها تنها زمانی اجرا می‌شوند که دستورهای قبلی انجام شده باشند)، توابع در نود جی‌اس به گونه‌ای طراحی شده‌اند تا ناهمگام باشند و در نتیجه مسدود نشوند (به این معنا که دستورهای همروند یا حتی به صورت موازی قابل اجرا هستند و برای اعلام موفقیت یا شکست در اجرا از بازخوان‌ها (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) و بسیاری دیگر می‌شوند.
محیط‌های مدرن یک‌پارچهٔ توسعه نرم‌افزار امکانات مختلفی از جمله ویرایش و اشکال زدایی را مخصوص نود جی‌اس ارائه می‌کنند.
نود جی‌اس یک محیط اجرایی جاوااسکریپت است که درخواست‌های ورودی را در یک حلقه موسوم به حلقهٔ رخداد، پردازش می‌کند.
نود جی‌اس تنها روی یک نخ (ریسه) اجرا می‌شود و با استفاده از ورودی/خروجی ناهمگام (مسدود نشدنی) امکان پشتیبانی از ده‌ها هزار ارتباط هم‌زمان را بدون صرف هزینهٔ تعویض زمینه (Context switching) فراهم می‌کند. این نوع طراحی که در آن یک نخ (ریسه) بین تمام درخواست‌ها مشترک است به خاطر ساخت برنامه‌های کاربردی با همزمانی بسیار بالا، استفاده شده‌است که در آن هر تابعی که کار ورودی/خروجی انجام می‌دهد باید از بازخوانی (Callback) استفاده کند. نود جی‌اس برای پیاده‌سازی حلقهٔ رخداد تک نخی، از کتابخانهٔ libuv استفاده می‌کند که این کتابخانه برای انجام عملیات ورودی/خروجی ناهمگام (مسدود نشدنی) از یک مخزن نخ (Thread pool) با اندازهٔ ثابت بهره می‌گیرد.
یک عیب روش تک نخی این است که اجازهٔ مقیاس‌پذیری عمودی (vertical scaling) را با استفاده از افزایش تعداد هسته‌های پردازنده بدون استفاده از پیمانه‌های اضافی، مثل کلاستر (Cluster) یا StrongLoop Process Manager یا pm2 نمی‌دهد. اگرچه توسعه‌دهندگان می‌توانند تعداد پیش‌فرض نخ‌ها در مخزن نخ کتابخانهٔ libuv را افزایش دهند؛ این نخ‌ها معمولاً توسط سیستم عامل سرور بین هسته‌های مختلف توزیع می‌شوند.
اجرای هم‌زمان کارها در نود جی‌اس توسط یک مخزن نخ صورت می‌گیرد. فراخوانی توابع در نخ اصلی، وظایف را داخل یک صف وظایف قرار می‌دهد که بین نخ‌های مخزن نخ به اشتراک گذاشته شده‌است؛ سپس نخ‌ها وظایف را از این صف برمی‌دارند و آن‌ها را اجرا می‌کنند. در بطن ماجرا، عملکردهای مسدود نشدنی سیستم، مثل کار با شبکه، به سوکت‌های مسدود نشدنی سمت هستهٔ سیستم عامل ترجمه می‌شوند درحالی که عملکردهای مسدود شدنی سیستم، مثل ورودی/خروجی فایل، به شکل مسدود شدنی داخل نخ خود اجرا می‌شوند. یک نخ در مخزن نخ، اتمام وظیفهٔ خود را به اطلاع نخ اصلی می‌رساند که متعاقباً نخ اصلی نیز بازخوان متناظر با وظیفه را بیدار و اجرا می‌کند. از آنجایی که بازخوان‌ها به‌طور ترتیبی در نخ اصلی اجرا می‌شوند، محاسبات طولانی و دیگر وظایف وابسته به پردازش‌گر تمام حلقهٔ رخداد را تا زمانی که کارشان به پایان برسد مسدود خواهند کرد.
وی۸ موتور اجرای جاوااسکریپتی است که برای مرورگر گوگل کروم ساخته و در سال ۲۰۰۸ توسط گوگل متن‌باز شد. وی۸ که با زبان سی‌پلاس‌پلاس نوشته شده به جای اجرای آنی کدهای جاوااسکریپت ابتدا آن‌ها را به کد ماشین کامپایل می‌کند.
نود جی‌اس از کتابخانهٔ libuv برای رسیدگی به رخدادهای ناهمگام (asynchronous events) استفاده می‌کند. libuv یک لایهٔ انتزاعی برای شبکه و قابلیت‌های سیستم فایل است که هم در ویندوز و هم در سیستم‌های برپایهٔ پازیکس مثل لینوکس و مک‌اواس، قابل استفاده است.
قابلیت‌های اصلی نود جی‌اس در یک کتابخانهٔ جاوااسکریپت مستقر است. بایندینگ‌های (bindings) نود جی‌اس (پیمانه‌هایی که با زبان سی‌پلاس‌پلاس نوشته شده‌اند و یک API به زبان جاوااسکریپت عرضه می‌کنند که می‌توان به راحتی از آن‌ها استفاده کرد)، این تکنولوژی‌های مختلف را با یکدیگر و نیز با سیستم‌عامل متصل می‌کند.
ان‌پی‌ام (npm) مدیر بسته‌ی از پیش نصب شده و پیش‌فرض برای سکوی نود جی‌اس است. از ان‌پی‌ام برای نصب برنامه‌های نود جی‌اس از مخزن ان‌پی‌ام، ساماندهی به نصب‌ها و نیز مدیریت برنامه‌های شخص ثالث نود جی‌اس استفاده می‌شود. نباید ان‌پی‌ام را با دستور codice_2 در CommonJS اشتباه گرفت. از ان‌پی‌ام برای بارگذاری کد استفاده نمی‌شود؛ بلکه از آن برای نصب کد و مدیریت وابستگی‌های کد از طریق خط فرمان استفاده می‌شود. بسته‌هایی که در مخزن ان‌پی‌ام قرار دارند بسیار متنوع‌اند و در آن از کتابخانه‌های سادهٔ کمکی مثل Lodash تا اجراکننده‌های وظیفه مثل گرانت (Grunt) را می‌توان پیدا کرد.
همچنین یارن (Yarn) یک مدیر بسته برای نود جی‌اس است که توسط فیسبوک در سال ۲۰۱۶ ساخته شده است که سرعت، ثبات و امنیت را به عنوان جایگزینی برای ان‌پی‌ام فراهم می کند
نود.جی‌اس خودش را به سیستم‌عامل وصل می‌کند تا هرگاه اتصال جدیدی ایجاد شد، سیستم‌عامل یک بازخوان را فراخوانی کند. در داخل نود.جی‌اس هر اتصال یک اختصاص هیپ (Heap) کوچک است. به‌طور سنتی، اتصال‌ها توسط پردازه‌ها یا نخ‌های سنگین سیستم‌عامل رسیدگی می‌شدند. نود جی‌اس برای مقیاس‌پذیری بیشتر به جای پردازه‌ها یا نخ‌ها از یک حلقهٔ رخداد استفاده می‌کند. برعکس سرورهای رخدادگرای دیگر، نیاز نیست تا حلقهٔ رخداد نود.جی‌اس به‌طور صریح صدا زده شود؛ به جای آن بازخوان‌ها تعریف می‌شوند و سرور در آخر تعریف بازخوان به‌طور خودکار وارد حلقهٔ رخداد می‌شود. زمانی که هیچ بازخوان دیگری موجود نباشد، نود جی‌اس از حلقهٔ رخداد خارج می‌شود.
به عنوان یک محیط اجرایی ناهمگام جاوااسکریپت، نود جی‌اس برای ساختن برنامه‌های کاربردی مقیاس‌پذیر تحت شبکه طراحی شده. در مثال «سلام، دنیا!» که در ادامه آورده شده، تعداد زیادی اتصال به صورت هم‌زمان رسیدگی می‌شوند. با برقراری هر اتصال، بازخوان صدا زده می‌شود.
import http from 'http' // و یا در کامن جی اس // const http = require('http')
const hostname = '127.0.0.1' const port = 3000
const server = http.createServer((request, response) => {
server.listen(port, hostname, () => {