نود جی اس Node.js
نود جی اس Node.js یک محیط اجرایی سمت سرور متنباز برای زبان جاوااسکریپت است که درخواستهای ورودی را در یک حلقه موسوم به حلقه رخداد Event loop ، پردازش میکند . جاوااسکریپت ابتدا به عنوان یک زبان اسکریپتنویسی سمت کاربر client-side به این صورت استفاده میشد که اسکریپتهای نوشته شده با جاوااسکریپت درون صفحات HTML و یا در فایل مجزا نوشته میشود و سپس این اسکریپتها توسط یک موتور جاوااسکریپت در مرورگر وب کاربر پردازش میشود. نود جی اس امکان استفاده از جاوااسکریپت برای نوشتن اسکریپتهای سمت سرور را فراهم میکند .
در نتیجه نود جی اس به یکی از ابزارهای اصلی در مبحث “جاوااسکریپت در همه جا/ JavaScript Everywhere” تبدیل شدهاست که در آن به جای استفاده از زبانهای برنامهنویسی مختلف در نوشتن اسکریپتهای سمت سرور، از یک زبان واحد برای توسعه برنامههای کاربردی وب ، هم سمت سرور و هم سمت کاربراستفاده میشود.
نود جی اس با زبان های برنامه نویسی C++، C، JavaScript نوشته شده است و بر روی سیستم عامل های Linux, MacOS, Microsoft Windows, SmartOS, FreeBSD, OpenBSD, IBM AIX قابل نصب می باشد
پسوند فایلهای نود جی اس هم مانند جاوااسکریپت js NodejsFileName.js می باشد . هدف استفاده از این نوع طراحی نرمافزاری، بهینهسازی توان عملیاتی و مقیاسپذیری در برنامههای کاربردی تحت وب که عملیات ورودی/خروجی زیادی دارند و همچنین برنامههای کاربردی وب بلادرنگ (برنامههای ارتباط بلادرنگ مانند اتاق گفتگو یا بازیهای تحت مرورگر) است.
پروژه توسعه توزیعشده نود جیاس تحت نظارت بنیاد نود جیاس Node.js Foundation قرار دارد که جزئی از برنامه پروژههای جمعی بنیاد لینوکس (Linux foundation collaborative projects) نیز میباشد.
نود جیاس در ابتدا در سال ۲۰۰۹ توسط رایان دال Ryan Dahl نوشته شد . ۱۳ سال قبل از آن نیز اولین محیط توسعه جاوااسکریپت در سمت سرور با نام LiveWire Pro Web توسط نتاسکیپ معرفی شده بود. نسخه اولیه نود جیاس تنها از سیستمعامل لینوکس و مکاواس پشتیبانی میکرد. توسعه و نگهداری نود جیاس توسط رایان دال صورت میگرفت و سپس توسط شرکت جوینت Joyent حمایت شد.
مشاهده نوار پیشرفت بارگذاری فایل در سایت فلیکر توسط رایال دال، الهام بخش ایده ساخت نود جیاس شد. در آن موقع حین بارگذاری فایل در سایت فلیکر، مرورگر وب نمیتوانست تشخیص دهد که چه میزان از فایل بارگذاری شده و بنابراین برای نمایش روند پیشرفت بارگذاری، مرورگر مجبور بود به وب سرور درخواست دهد. رایان دال مشتاق راه سادهتری برای اینکار بود.
رایان دال در سال ۲۰۰۹ به انتقاد از ضعف محبوبترین سرور وب جهان یعنی آپاچی در زمینه رسیدگی به تعداد زیادی کانکشن (تا ۱۰٬۰۰۰ کانکشن یا بیشتر) پرداخت و همچنین انتقاداتی را به متداولترین روش کدنویسی یعنی برنامهنویسی ترتیبی Sequential Programming وارد کرد. در برنامهنویسی ترتیبی در مواجهه با کانکشنهای همزمان یا کل فرایند برنامه موقتاً متوقف میشود یا می بایست مقداری زیادی از حافظه اصلی به پشته فراخوانی اختصاص یابد.
پروژه نود جیاس از موتور جاوااسکریپت وی۸ V8 JavaScript engine گوگل به همراه یک حلقه رخداد Event loop و نیز یک رابط برنامهنویسی کاربردی سطح پایین برای ورودی/خروجی تشکیل شده است .
Google V8 JavaScript Engine یک موتور جاوااسکریپت متنباز است که توسط گوگل در اصل برای مرورگرهای گوگل کروم و کرومیوم توسعه یافته است. لارس باک Lars Bak خالق و مدیر تیم برنامهنویسی آن است؛ در پروژه های زیر از V8 استفاده شده است:
Google chrome, Chromium, Couchbase, MongoDB and Node.js …
در سال۲۰۱۰، سامانه مدیریت بسته npm Node Package Manager برای نود جیاس معرفی شد. انپیام فرایند انتشار و به اشتراکگذاری کد منبع کتابخانههای نود جیاس را آسان میکند و طراحی شده تا کار نصب، بروزرسانی و حذف کتابخانههای نرمافزاری را تسهیل نماید.
در ژوئن ۲۰۱۱، مایکروسافت و جوینت Joyent با همکاری یکدیگر کار پیادهسازی نسخه بومی نود جیاس برای ویندوز را شروع کردند. اولین نسخه نود جیاس که از سیستمعامل ویندوز پشتیبانی میکرد در ژولای ۲۰۱۱ منتشر شد.
شرکتهای استفادهکننده از نود جیاس :
Netflix, LinkedIn, PayPal, EBay, Uber, Microsoft, IBM, NASA, Yahoo, Google, Cisco, Twitter …
برنامههای کاربردی نود جیاس را با کافیاسکریپت (میتواند به جای جاوااسکریپت استفاده شود)، زبان برنامهنویسی دارت، تایپاسکریپت (یا هر شکل دیگر از جاوااسکریپت با وابستگی زیاد به نوع) یا هر زبان دیگری که قابل ترجمه به جاوااسکریپت باشد، میتوان نوشت.
نود جیاس معمولاً برای نوشتن برنامههای تحت شبکه مانند سرورهای وب استفاده میشود. بزرگترین تفاوت میان نود جیاس و پیاچپی PHP در این است که برخلاف پیاچپی که در آن بیشتر توابع تا تمام شدن کار مسدود میشوند (به این معنا که دستورها تنها زمانی اجرا میشوند که دستورهای قبلی انجام شده باشند)، توابع در نود جیاس به گونهای طراحی شدهاند تا ناهمگام باشند و در نتیجه مسدود نشوند به این معنا که دستورهای همروند Concurrent یا حتی به صورت موازی Parallel قابل اجرا هستند و برای اعلام موفقیت یا شکست در اجرا از بازخوانها Callbacks استفاده میکنند.
نود جی اس تنها روی یک نخ Single Threat اجرا میشود و با استفاده از ورودی/خروجی ناهمگام Async و مسدود نشدنی امکان پشتیبانی از دهها هزار ارتباط همزمان را بدون صرف هزینه تعویض زمینه Context switching فراهم میکند. این نوع طراحی که در آن یک نخ بین تمام درخواستها مشترک است به خاطر ساخت برنامههای کاربردی با همزمانی بسیار بالا، استفاده شدهاست که در آن هر تابعی که کار ورودی/خروجی انجام میدهد باید از بازخوانی Callback استفاده کند. نود جی اس برای پیادهسازی حلقه رخداد تک نخی، از کتابخانه libuv استفاده میکند که این کتابخانه برای انجام عملیات ورودی/خروجی ناهمگام و مسدود نشدنی از یک مخزن نخ Thread pool با اندازه ثابت بهره میگیرد.
یک عیب روش تک نخی این است که اجازه مقیاسپذیری عمودی vertical scaling را با استفاده از افزایش تعداد هستههای پردازنده بدون استفاده از پیمانههای اضافی، مثل کلاستر Cluster یا StrongLoop Process Manager یا pm2 نمیدهد. اگرچه توسعهدهندگان میتوانند تعداد پیشفرض نخها در مخزن نخ کتابخانه libuv را افزایش دهند؛ این نخها معمولاً توسط سیستم عامل سرور بین هستههای مختلف توزیع میشوند.
نود جی اس می تواند به عنوان بستر و پایه موارد زیر مورد استفاده قرار گیرد :
React.js, React native, Socket.io, Wiki.js, TensorFlow.js, ExpressCart …
مواردی که استفاده از نود جی اس توصیه می شود :
1 – نرم افزار های استریم اطلاعات Data Streaming Applications
2 – نرم افزارهای مبتنی بر ورودی و خروجی I/O bound Applications
3 – نرم افزارهایی با تبادل حجم بالای اطلاعات جاری بین سرور و کلاینت Data Intensive Real-time Applications / DIRT
4 – نرم افزارها مرتبط با فایل ها و بانکهای اطلاعاتی از نوع JSON
5 – اپلیکیشن های تک صفحه سرور – کلاینتی سریع Single Page Applications
6 – بازی های تحت وب آنلاین
7 – اپلیکیشن های تحت وب مبتنی بر هوش مصنوعی و یادگیری ماشین AI/Machine Learning(به عنوان مثال TensorFlow.js)
8 – مسنجرها و اپلیکیشن های چت متنی ، صوتی و ویدئویی
9 – اینترنت اشیاء IOT و کار با سنسورها و مانیتورینگ آنها (به عنوان مثال کار با رزبری پای Raspberry Pie)
امروزه دانش نود جی اس به علت قابلیت های متمایز و گستردگی استفاده ، از الزامات برنامه نویسان وب می باشد.
منابع:
https://nodejs.org/api/
http://www.learnwebskill.ir/
https://dzone.com/articles
https://www.toptal.com/nodejs/why-the-hell-would-i-use-node-js
https://www.peerbits.com/blog/lamp-stack-vs-mean-stack.html
https://www.ibm.com/developerworks/community/blogs/gcuomo/entry/javascript_everywhere_and_the_three_amigos?lang=en