سیر تا پیاز Nodejs

ممکنه در مورد Node.js چیزی شنیده باشین ، اما این چیه ؟ به چه درد می‌خوره ؟ چه وقت باید از آن استفاده کنیم ؟

Node.js

عمدتا ً به عنوان یک سرور وب backend استفاده می‌شه که API رو در صفحه اول خود قرار می‌ده و می‌تونه با اون ارتباط برقرار کنه . یک برنامه کاربردی می‌تونه کارهایی مثل :

باز کردن و نوشتن فایل ها روی سرور رو انجام بده .

افزودن ، حذف و دریافت داده‌ها از یک پایگاه‌داده .

رسیدگی به پیام‌های Real time از کاربران متعدد برای برنامه‌های کاربردی مثل HTML۵ گیم های مختلف یا چت روم ها .

و خیلی بیشتر …


اصلا Nodejs چیه؟

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

در آغاز … در روزهای اولیه اینترنت یک پروتکل عمومی بنام HTTP به دنیا اومد. خیلی زود بعد اون، مرورگرهای وب سایت‌هایی مانند Netscape  وجود داشتند که از این پروتکل برای نمایش صفحات وب استفاده کردند. این صفحات با طراحی بد، خیلی ساده بودن، اما یک انقلاب بود، چون مردم می‌تونستند صفحات رو با اطلاعات ایجاد کنند. سپس این صفحات در دسترس مردم سراسر جهان قرار گرفت.

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

صفحات وب داینامیک

با جاوااسکریپت میتونید برنامه‌هایی رو ایجاد کنید که در مرورگر اجرا می‌شوند. لازم نیست دانلود کنید, نصب کنید, فقط در آدرس تایپ کنید و ببینید .

بعد از اون, می‌تونید ایمیل‌های خودتونو روی وب بخونید, وضعیت مالی خودتونو حفظ کنید و به صورت آنلاین خرید کنید.

AJAX

قبلا ً، هنگام دریافت داده‌ها از یک سرور ، باید کل صفحه رو باز کنید . این به معنای تصاویر ، برچسب‌هایHTML ، همه چیز است. اغلب دوست دارید بخشی از صفحه خودتونو باز کنید .

با AJAX که مخفف JavaScript Asynchronous و XML است میشه این مشکل رو حل کرد . با AJAX شما می‌تونید فقط داده‌ها را از سرور دریافت کنید، و به طور داینامیک اطلاعات رو در صفحه با برچسب HTML و قالب‌بندی وارد کنید و تعداد کمتری روی پهنای باند وارد کنید .

گوگل کروم

مردم تو گوگل هنوز فکر می‌کردند که وب کند است . اونا یک مرورگر وب جدید به نام کروم رو منتشر کردند .

چیزی که بیشتر انقلابی در مورد این مرورگر بود این بود که اونا موتور جدیدی جاوا اسکریپت را از نو ساختند که آن را " v8 " نامیدند . این موتور در مقایسه با موتورهای دیگر بسیار بهینه بود . موتور سیاه‌رنگ به این دلیل سریع است که جاوا اسکریپت رو قبل از اجرای آن مستقیما ً به کد ماشین کامپایل می‌کند . علاوه بر این , کد تدوین‌شده در طول زمان اجرا بهینه شده‌است .

موتور جاوا اسکریپت V8و Node.js

در سال ۲۰۰۹ ، Ryan Dahl با استفاده از موتور v8 جاوا اسکریپت ، ایده استفاده از جاوا اسکریپت روی سرور را داشت . او هم همین کار رو کرد . او یک لایه در اطراف موتور JavaScript ایجاد کرد تا روی سرور کار کند و اونو Node.js نامید .




فواید استفاده از Node.js چیه؟

جاوا اسکریپت میتونه روی کلاینت و سرور استفاده شود .

این یک مزیت مهم برای شرکت‌ها است چون اونا می‌تونند از تکنولوژی قبل از آن استفاده کنند . الان توسعه دهندگان front end قادر به توسعه backend خیلی ساده و برعکس هستند .

اغلب وقتی روی فرانت کار می‌کنید ، ممکنه به چیزی از بک اند نیاز داشته باشید تا کار خودتونو تمام کنید . اگر شرکت شما فقط توسعه دهندگان backend رو به زبانی اختصاص داده‌است که شما درک نمی‌کنید ، ممکنه لازم باشد از اونا بخواهید اونو اجرا کنند و امیدوارند که زیاد طول نکشد .

با استفاده از این فرصت برای توسعه هم بک اند و هم فرانت ، سرعت رشد زمان را افزایش خواهد داد . تعجبی نداره که بسیاری از شرکت‌ها به سمت Node.js میروند .

فریموورک Nodejs می‌تونه تعداد زیادی از کاربران Real-time رو کنترل کنه

سرور های سنتی اغلب فرآیندهای جدیدی برای هر اتصال کاربر ایجاد می‌کنند . اگر هزاران کاربر داشته باشید که همزمان متصل شوند ، استفاده از حافظه از سقف مجاز عبور خواهد کرد .

فریموورک Nodejs در یک رشته واحد اجرا می‌شود . این به این معنی هستش که زمانی که سرور کد رو اجرا می‌کنه، این باید قبل از اجرای دیگر اجرا شود . با این حال ، این تنها برای کد بکار می‌رود که کارها را مانند محاسبات ، و غیره انجام می‌دهد . این به این معنی است که وقتی Nodejs یک درخواست پایگاه‌داده را انجام می‌دهد ، کد دیگر می‌تواند در این فاصله اجرا شود . زمانی که داده‌ها از پایگاه‌داده آورده می‌شوند ، همچنان روی یک تابع callback کار می‌کند .

این حلقه event است که این event های I / O را مدیریت می‌کند و آن callbacks را باز می‌گرداند . این حلقه event به این دلیل است که چرا Nodejs رو “event-driven” میگویند و همچنین asynchronous I/O call ها ، چرا Nodejs رو non-blocking میگوند


مدیریت بسته Nodejs

فریموورک Nodejs سیستم مدیریت بسته خودشو داره . این پر از صدها هزار کتابخانه جاوا اسکریپت است . این کتابخانه‌ها رو می‌توان در frontend و backend استفاده کرد . این استاندارد صنعت چاپ و کسب کتابخانه‌ها است .

نکته مهم این است که شما می‌تونید به راحتی بسته‌های جدید رو از ابزار فرمان نصب کنید ویا به روز رسانی کنید . هنگام نصب بسته‌ها به پروژه شما به پوشه موسوم به " node _ modules " و اطلاعات درباره بسته‌های شما که در فایل package.json ذخیره می‌شوند ، می‌رود . زمانی که پروژه را به یک مخزن مانند Github قرار می‌دهید ، لازم نیست فایل‌های کتابخانه رو نیز در نظر بگیرید . فقط فایل package.json ضروری است . زمانی که کاربران پروژه Github را کپی می‌کنند ، تنها کاری که باید انجام دهند این است که " install npm " را اجرا کنند ، و تمام بسته‌ها از فایل package.json نصب می‌شوند .

سریع با استفاده از منابع کم

همانطور که قبلاً اشاره کردم ،Node.jsبه صورت event - driven و non - blocking است . از آنجا که نیازی به ایجاد فرایندها یا رشته‌های متعدد نیست ، تا زمانی که منطق زیاد نیست ، آن را با استفاده از منابع بسیار پایین سریع می‌سازد .


اشکالات استفاده از Nodejsچیست ?

در سرور از جاوا اسکریپت استفاده می شود

من قبلاً اشاره کردم که اجرای جاوا اسکریپت روی frontend  و backend  یک مزیت بزرگ است. اما جاوا اسکریپت به تنهایی مستعد خطا است.

زبان‌های Backend مانند C # از انواع استفاده می‌کنند و کد قبل از اینکه بتواند اجرا شود جمع‌آوری می‌شود. این روش شما رو از اشتباه‌ات در طول توسعه آگاه خواهد کرد. از آنجا که جاوااسکریپت انواع خاصی ندارد و به همان ترتیب کامپایل نمی‌شود، شما اغلب در طول زمان اجرا یک سورپرایز ناخوشایند خواهید داشت. :(

با این حال راه‌هایی برای مبارزه با این مسائل وجود دارد. چیزی مانند typescript می‌تواند به جای جاوا اسکریپت به کار رود. typescript عمدتاً با ویژگی‌های اضافی جاوا اسکریپت است، مانند ارائه نوع چک کردن به کد شما. ابزارهای linting نیز وجود دارند که می‌توانند اشتباهات رو در برنامه جاوا اسکریپت شما اعلام کنند.


Nested callback hell

فریموورک Nodejs زمانی که عملیات I / O را انجام می‌دهد به شدت وابسته به callbacks است. تعداد بسیار بیشتری از عملیات O / O روی backend  در مقایسه با frontend  وجود دارد. یک مساله مشترک که می‌تواند به آن برسد nested callback hell است. این زمانی است که شما یک تماس غیر همزمان را انجام می‌دهید که به نوبه خود یک callback را بر می‌گرداند، که به نوبه خود عمل I / O را انجام می‌دهد، که callback دیگر را بر می‌گرداند و غیره.

این ممکن است منجر به یک کد نامرتب با callbacks که در آن چه در اواخر شبیه یک هرم به نظر می‌رسد منجر شود. اگر این اتفاق بیفتد، خواندن کد شما مشکل خواهد بود و رسیدگی به خطا می‌تواند کاملاً به هم بریزد.

خوشبختانه، با کمی کدگذاری هوشمندانه، هیچ مشکلی برای اجتناب از این مساله وجود ندارد.


تعداد زیاد بسته ها

سیستم مدیریت بسته Nodejs عالی است. اما با وجود زیاد بودن تعداد بسته‌ها، گم شدن آسان است.

اگر نمی‌دانید به دنبال چه چیزی هستید، ممکن است سخت باشد که آنچه می‌خواهید را به دست آورید. بسته‌های بسیاری وجود دارند که کارهای مشابه انجام می‌دهند و هیچ سیستم درجه‌بندی وجود ندارد که به شما کمک می‌کند بسته‌های کیفیت را پیدا کنید.

بعضی از بسته‌ها به اندازه شما بالغ نیستند. این ممکن است منجر به اشکالات ناخواسته و توابع گم‌شده شود.

اما از طرف دیگر، این چیزی است که در مورد این سیستم باز بسیار عالی است. کتابخانه غول‌پیکر برای همه باز است!

روی کارهای متمرکز پردازنده خوب کار نمی‌کند

از آنجایی که Nodejs به صورت single threadedهست , کار زیادی در کارهای متمرکز پردازش مرکزی ندارد . اگرچه عملیات‌های i / o غیرهمزمان هستند , اجرای کد ساده نیست . بنابراین اگر کد شما محاسبات سنگینی انجام دهد , پس Nodejs ممکن است انتخاب بهینه نباشد چون بعد thread شما را مسدود خواهد کرد .


نتیجه‌گیری

اگر شما به یک پسانه نیاز دارید که می‌تواند بسیاری از کاربران را با منطق ساده اداره کند، Node.js یک انتخاب عالی است. استفاده از منابع شما در سرورها بسیار پایین خواهد بود، که هزینه‌های server  را کاهش می‌دهد.

از طرف دیگر، اگر backend شما محاسبات سنگین مانند پردازش تصویر و یا شبیه‌سازی انجام دهد، باید به جای دیگری نگاه کنید. Node.js در عملیات I / O غیر همزمان هستند، اما در کد جاوا اسکریپت شما نیستند.