آخرین پرسش‌های کاربران در Nodejs (نود جی اس)

Nodejs (نود جی اس)

زبان Node.js یک زبان برنامه نویسی برای سرور است که توسط آن می توانید وب سایت های عادی یا API های پیشرفته خودتان را بسازید! آیا متوجه معنی این جمله می شوید؟

Node.js زبانی قدرتمند
Node.js زبانی قدرتمند

چه کسانی باید Node.js یاد بگیرند؟

زبان Node.js کاربردهای فراوانی دارد و افراد مختلفی می توانند از آن استفاده کنند. به طور مثال افرادی که می خواهند روی برنامه نویسی سرور یا همان Back-end کار کنند از اولین گروه های پیشنهادی برای یادگیری این زبان هستند چرا که طیف وسیعی از افراد در دنیا وجود دارند که به برنامه نویسی سرور نیاز خواهند داشت. به طور مثال اگر توسعه دهنده Android هستید و می خواهید بخش سرور را نیز خودتان بنویسید،‌ این زبان یک گزینه بسیار عالی برایتان محسوب می شود. اگر می خواهید از برنامه نویسان back-end شوید این زبان از الزامات اصلی برای شما محسوب می شود. همچنین اگر می خواهید یک توسعه دهنده full-stack شوید باید با برنامه نویسی سرور آشنا باشید و Node.js یکی از راه های برنامه نویسی سرور است.

آیا یادگیری Node.js دشوار است؟

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

در صورتی که در دنیای برنامه نویسی تازه وارد هستید و هنوز هیچ زبان برنامه نویسی را یاد نگرفته اید، یادگیری جاوا اسکریپت و Node.js می تواند نقطه شروع بسیار مناسبی برای شما باشد. بر اساس آمار ارائه شده توسط وب سایت Stackoverflow (از معتبرترین مراجع آماری) در سال ۲۰۲۰ جاوا اسکریپت همچنان محبوب ترین و رایج ترین زبان برنامه نویسی دنیا است:

محبوب ترین زبان های برنامه نویسی دنیا بر اساس نظرسنجی Stackoverflow
 محبوب ترین زبان های برنامه نویسی دنیا بر اساس نظرسنجی Stackoverflow

بازار کار Node.js

با جست و جویی ساده در آگهی های استخدامی در فضای وب فارسی متوجه می شوید که Node.js تکنولوژی بسیار گسترده ای است و بازار کار بسیار گسترده ای را دارد. در عین حال باید توجه داشته باشید که Node.js و JavaScript از هم جدا نشدنی هستند و یادگیری هر دو در اصل یکی است! با این حساب با یادگیری Node.js به راحتی وارد بازار کار جاوا اسکریپت نیز می شوید. در عین حال با جست و جویی ساده متوجه می شوید که حقوق کار توسعه دهندگان Node.js در بازار ایران حدود ۱۰ میلیون تومان است بنابراین حقوق خوبی را دریافت خواهید کرد. توجه داشته باشید که این مقدار میزان متوسط درآمد است و بر اساس بسیاری از فاکتورها متغیر خواهد بود. مثلا در هنگام شروع کار و تازه کار بودن میزان حقوق شما کمتر خواهد بود اما به مرور زمان به مقادیر بالاتری خواهید رسید.

بازار کار Node.js در خارج از کشور، بسیار بزرگ تر است و متوسط حقوق توسعه دهندگان Node.js (بسته به تجربه و زمینه کاری شان) چیزی بین 48 هزار تا 130 هزار دلار در سال است (متوسط 86 هزار دلار در سال). با این حساب چه قصد مهاجرت را داشته باشید و چه بخواهید در ایران کار کنید، حقوق مناسبی خواهید داشت.

از سیر تا پیاز Node.js‌

با مراجعه به وب سایت رسمی Node.js با چنین توضیحاتی در رابطه با این زبان روبرو می شوید:

As an asynchronous event-driven JavaScript runtime, Node.js is designed to build scalable network applications

یعنی Node.js یک runtime برای زبان جاوا اسکریپت بوده و علاوه بر ناهمگام بودن، رویداد محور نیز می باشد! اگر متوجه این جمله نشدید جای نگرانی نیست. در این تعریف چند ویژگی مهم وجود دارد که باید بررسی شود و علاوه بر آن چند ویژگی دیگر را نیز اضافه خواهیم کرد.

تفاوت Back-end و Front-end

ساختار هر وب سایت به دو بخش back-end و front-end تقسیم می شود که به ترتیب با نام های server-side (سمت سرور) و client-side (سمت کاربر) نیز شناخته می شوند. برای درک جایگاه Node.js در فضای توسعه وب باید تفاوت این دو بخش را به خوبی درک کنید.

Front-end قسمتی نمایان از کوه یخ!
Front-end قسمتی نمایان از کوه یخ!

یک خودرو را در نظر بگیرید. این خودرو مولفه های ظاهری و عملیاتی دارد؛ به طور مثال رنگ ماشین، یا شیشه های ماشین، یا چراغ های ماشین همگی از مولفه های ظاهری ماشین هستند و به خودی خود کار خاصی انجام نمی دهند اما موتور ماشین، سیستم تعلیق ماشین یا باطری ماشین از اجزای درونی و عملیاتی ماشین هستند که کار اصلی (حرکت) را بر عهده دارند.

شما می توانید یک وب سایت را نیز به همین شکل تقسیم کنید. ظاهر هر وب سایت با کدهای HTML و CSS و JavaScript نوشته شده است اما این ظاهر بدون داشتن یک هسته اصلی هیچ کاری انجام نمی دهد، همانطور که ماشین بدون موتور حتی روشن هم نمی شود و عملا یک جعبه آهنی است! کدهای HTML و CSS و JavaScript که ظاهر سایت را تشکیل می دهند جزئی از Front-end یا client-side هستند اما موتور سایت ما چطور؟ موتور سایت شما با زبان هایی مانند Node.js یا PHP یا Python نوشته می شود و منطق عملیاتی سایت شما را بر عهده دارد.

اگر بخواهیم به زبان ساده تر و خلاصه تر توضیح بدهیم، می توان گفت front-end همان ظاهر سایت است که شما (کاربر) آن را می بینید اما back-end کدهای نوشته شده برای سرور سایت است که مسئول تولید پاسخ به شما (کاربر) است و این پاسخ را از طریق front-end به شما خواهد داد. تصویر زیر یکی از شوخی های برنامه نویسان با این دو مبحث است که می تواند مسئله را به صورت بصری برایتان توضیح بدهد:

شوخی توسعه دهندگان در رابطه با تمایز Front-end از Back-end
شوخی توسعه دهندگان در رابطه با تمایز Front-end از Back-end

 Node.js یک زبان یا یک runtime؟

در توضیحات سایت Node.js آمده بود که Node.js یک Runtime برای زبان جاوا اسکریپت است. آیا با مفهوم runtime آشنا هستید؟ حتما نام زبان جاوا اسکریپت را شنیده اید. این زبان برنامه نویسی معمولا درون مرورگر اجرا می شود تا DOM را تغییر دهد یا درخواست های AJAX را ارسال کند یا قسمتی از سایت را تعامل پذیر نماید و الی آخر. در واقع تمام مرورگرهای وب در دنیا (گوگل کروم، فایرفاکس، اینترنت اکسپلورر، اپرا و غیره) همگی یک موتور داخلی دارند که به زبان جاوا اسکریپت اجازه اجرا شدن را می دهد:

  • گوگل کروم از موتور V8 استفاده می کند.
  • فایرفاکس از موتور SpiderMonkey استفاده می کند.
  • سافاری از موتور JavaScriptCore استفاده می کند.
  • اینترنت اکسپلورر از موتور Chakra استفاده می کند.
  • مرورگر اج (edge) از V8 استفاده می کند.
  • اپرا در ابتدا از موتور Carakan استفاده می کرد اما بعدا آن را به V8 تغییر داد.

اما Node.js به زبان جاوا اسکریپت اجازه اجرا شدن در سمت سرور را می دهد! چطور؟ کلمه Runtime در دنیای برنامه نویسی به دو مفهوم متفاوت اشاره می کند:

  • lifecycle runtime: اگر منظور از runtime همان lifecycle runtime باشد، منظور زمانی است که برنامه شما در حال اجرا است، یعنی زمانی که اسکریپت شما خوانده شده و دستوراتش اجرا می شود.
  • runtime environment: اگر runtime به یک محیط برای اجرای یک زبان یا تکنولوژی خاصی اشاره کند منظور یک محیط خاص است که برنامه و کدهایش می توانند در آن اجرا شوند.

زمانی که می گوییم Node.js یک JavaScript Runtime است یعنی محیطی را فراهم می کند تا جاوا اسکریپت در آن اجرا شود. این یکی از بزرگترین اشتباهات رایج بین برنامه نویسان است که تصور می کنند Node.js یک زبان برنامه نویسی است در صورتی که Node.js فقط یک runtime است. البته Node.js کمی موتور V8 را توسعه داده است تا به قابلیت های بیشتری در سمت سرور دسترسی داشته باشیم اما اصل همان موتور V8 است. در عین حال از آنجایی که اکثریت توسعه دهندگان به Node.js با عنوان «زبان» اشاره می کنند من نیز برای راحت تر بودن انتقال مفاهیم از کلمه «زبان» استفاده می کنم.

Node.js ناهمگام (asynchronous) است

همانطور که در تعریف Node.js ذکر شده است، Node.js یک زبان async (مخفف asynchronous) به معنای «ناهمگام» است (البته در وب فارسی بعضا با نام نامتقارن نیز به آن اشاره می شود). زمانی که یک وب سایت ساده HTML ای داشته باشیم، تعامل سرور و کلاینت (به ترتیب Back-end و Front-end) به شکل زیر خواهد بود:

  • مرحله ۱: کلاینت درخواستی را ارسال می کند.
  • مرحله ۲: سرور درخواست را دریافت می کند.
  • مرحله ۳: سرور درخواست را پردازش می کند.
  • مرحله ۴: سرور پاسخ مناسب را به کلاینت یا همان Front-end ارسال می کند.
  • مرحله ۵: شما (کاربر) پاسخ را مشاهده می کنید.

این روند تا سال های سال در فضای توسعه وب مرسوم بود و زبان هایی مانند PHP دقیقا به همین شکل عمل می کنند. با نگاهی ساده به این طراحی متوجه موضوع مهمی خواهید شد: اگر درخواستی در مرحله ۳ باشد و در همان لحظه درخواست دیگری به سرور ما ارسال شود چه می شود؟ در این دسته از زبان ها (مانند PHP) تا یک درخواست به طور کامل پردازش نشود (به مرحله ۵ نرسد) درخواست دیگری اجرا نخواهد شد بنابراین دیگر افراد باید منتظر بمانند تا نوبتشان برسد!

این موضوع زمانی بدتر می شود که یکی از درخواست ها طولانی باشد. فرض کنید ما در وب سایت خود قابلیتی را قرار داده ایم که اطلاعات هواشناسی کاربر را به او نشان می دهد. طبیعتا ما یک پایگاه هواشناسی نیستیم بنابراین داده های هواشناسی را در پایگاه داده خودمان نداریم. حالا کاربر ما، شهر خود را برای ما ارسال می کند و از ما اطلاعات هواشناسی اش را می خواهد بنابراین باید به یک سرور هواشناسی (از طریق API) متصل شویم که چنین داده هایی را دارد، این داده ها را دریافت کنیم و سپس به کاربر ارسال کنیم. طبیعتا چنین فرآیندی زمان خواهد برد و تا زمانی که این فرآیند و درخواست تمام نشود، دیگر درخواست ها منتظر خواهند ماند. به این نوع از برنامه نویسی، برنامه نویسی همگام یا synchronous می گوییم.

نکته: امروزه پکیج هایی وجود دارند که می توانید با استفاده از آن ها زبان هایی مانند PHP را نیز به صورت ناهمگام اجرا کنید.

زبان Node.js یک زبان ناهمگام یا Asynchronous است! یعنی چه؟ یعنی در مثال بالا منتظر دریافت اطلاعات هواشناسی از API نمی شود بلکه در همان حال به سراغ درخواست های دیگر رفته و پاسخشان را می دهد و هر گاه پاسخ اطلاعات هواشناسی دریافت شد آن را نیز به کاربر مورد نظر ارسال می کند. این مسئله باعث سرعت عالی Node.js شده و آن را مقیاس پذیر (scalable) می کند.

مقایسه ی زمان پاسخ به درخواست ها در برنامه نویسی ناهمگام و همگام
مقایسه زمان پاسخ به درخواست ها در برنامه نویسی ناهمگام و همگام

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

Node.js رویداد محور است

یکی از مهم ترین جنبه های درک Node.js درک event-loop یا حلقه رویداد در آن است. در بخش قبلی توضیح دادم که Node.js ناهمگام است اما چطور؟ ناهمگام بودن Node.js به لطف حلقه رویداد امکان پذیر است. تصویر زیر ناهمگام بودن Node.js را به خوبی توضیح می دهد:

روند کلی پردازش درخواست در Node.js
روند کلی پردازش درخواست در Node.js

Node.js به صورت single-threaded اجرا می شود، یعنی کل برنامه روی یک thread خاص از CPU اجرا خواهد شد (گرچه می توانید این مسئله را تغییر بدهید). زمانی که اسکریپت Node.js شما اجرا می شود، یک حلقه رویداد اجرا می شود که کارش بر عهده گرفتن عملیات های ناهمگام است. همانطور که از نام آن (حلقه رویداد) پیدا است، نحوه کار این حلقه بدین شکل است:

  • ابتدا عملیات blocking (عملیاتی که thread را مسدود می کند) شناسایی می شود. مثلا دریافت اطلاعات آب و هوا از یک سرور دیگر یک عملیات blocking است.
  • این عملیات در یک thread دیگر باز شده و آن thread مسئولیت اجرای آن را بر عهده می گیرد.
  • عاملی در حلقه گردش می کند و در هر گردش بررسی می کند که آیا عملیات مورد نظر (مثلا دریافت اطلاعات هواشناسی) تکمیل شده است یا خیر.
  • در صورتی که عملیات تکمیل نشده باشد هیچ اتفاقی نمی افتد و به گردش ادامه می دهد اما اگر عملیات تکمیل شده باشد، پاسخ را گرفته و به کاربر ارسال می کنیم.

طرح زیر این مسئله را به صورت فنی تر نشان می دهد:

┌───────────────────────────┐ ┌─>│           timers          │ │  └─────────────┬─────────────┘ │  ┌─────────────┴─────────────┐ │  │     pending callbacks     │ │  └─────────────┬─────────────┘ │  ┌─────────────┴─────────────┐ │  │       idle, prepare       │ │  └─────────────┬─────────────┘      ┌───────────────┐ │  ┌─────────────┴─────────────┐      │   incoming:   │ │  │           poll            │<─────┤  connections, │ │  └─────────────┬─────────────┘      │   data, etc.  │ │  ┌─────────────┴─────────────┐      └───────────────┘ │  │           check           │ │  └─────────────┬─────────────┘ │  ┌─────────────┴─────────────┐ └──┤      close callbacks      │ └───────────────────────────┘

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

Node.js کاملا cross-platform است

زبان Node.js کاملا Cross-Platform یا «چندسکویی» است. cross-platform در اصطلاح برنامه نویسی به دسته ای از نرم افزار ها و تکنولوژی هایی گفته می شود که وابسته به پلتفرم خاصی نیستند و در چندین پلتفرم مختلف اجرا می شوند. با این حساب شما می توانید Node.js را در سرور های لینوکسی یا ویندوز و غیره اجرا نمایید.

۱۰ دلیل مهم برای یادگیری Node.js‌

تا این بخش متوجه شدیم که Node.js یکی از بزرگترین تکنولوژی های دنیا است اما چه دلایلی وجود دارد که به ما اطمینان بدهد انتخاب Node.js انتخاب صحیح است؟ چرا باید برای یادگیری Node.js وقت بگذاریم؟ ما در این بخش ۱۰ دلیل مهم برای یادگیری Node.js را بررسی می کنیم.

۱. تقاضای بازار

همانطور که قبلا هم توضیح دادم تقاضا برای Node.js هم در ایران و هم در خارج از ایران وجود دارد و این تقاضا بالا است بنابراین شانس عدم استخدام کمتر خواهد بود. باید توجه داشته باشید که غول های تکنولوژی مانند Uber و PayPal و LinkedIn از Node.js در پروژه هایشان استفاده می کنند.

۲. سهولت یادگیری

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

۳. توسعه Full Stack

اگر می خواهید از توسعه دهندگان Full Stack شوید، شروع با Node.js گزینه ایده آلی است. چرا؟ به دلیل اینکه Node.js همان جاوا اسکریپت است بنابراین با یادگیری آن می توانید همزمان برنامه نویسی back-end و front-end را یاد گرفته و زمان زیادی را ذخیره کنید.

۴. پیاده سازی ساده در سرور

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

۵. هماهنگی بین تیم Front-end و Back-end

از آنجایی که توسعه دهندگان Node.js تا حد زیادی به جاوا اسکریپت تسلط دارند، تیم توسعه front-end و back-end شما می توانند به راحتی با یکدیگر تعامل داشته باشند چرا که هر دو کلیت کار را می دانند اما حالا می توانند در مورد جزئیات نیز با هم صحبت کنند و مشکلات عجیب و غریب زبان های دیگر را نخواهید داشت.

۶. همگام نبودن Node.js

همگام نبودن Node.js آن را به یکی از قدرتمندترین زبان های برنامه نویسی دنیا تبدیل می کند. برنامه هایی که با Node.js نوشته شوند توانایی پاسخگویی به هزاران کاربر در ثانیه را دارند بنابراین گزینه ای بسیار عالی برای وب سایت های محبوب و سرورهای سنگین می باشد.

۷. کدهای ساده اما قدرتمند

یکی دیگر از مزیت های Node.js قدرتمند بودن کدهای آن است به شکلی که کمتر از برنامه های دیگر به نوشتن کدهای بسیار پیچیده نیاز پیدا خواهید کرد. موتور V8 گوگل که Node.js بر اساس آن ساخته شده است، با هدف اجرای سریع کدهای جاوا اسکریپت روی مروگر توسعه داده شده است و سعی داشته است تا به توسعه دهندگان کمک کند از نوشتن کدهای بیهوده جلوگیری کنند. این خصوصیت در Node.js نیز به ارث رفته است و انجام بسیاری از فرآیند های رایج در آن بسیار ساده است.

۸. جامعه ای بسیار بزرگ

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

۹. فراتر از توسعه وب

Node.js آنچنان منعطف است که استفاده آن از توسعه وب فراتر رفته و وارد توسعه برنامه های دسکتاپ شده است. به طور مثال پروژه هایی مانند Electron به شما اجازه می دهند که با استفاده از Node.js و HTML و CSS برنامه های cross-platform بسازید، یعنی برنامه هایی که روی ویندوز و لینوکس و مکینتاش اجرا می شوند.

۱۰. تست زمان

برخی از تکنولوژی های حوزه وب بیشتر هیستریا و هیجان هستند و پس از مدت کوتاهی از بین می روند اما برخی دیگر مانند Node.js سال های سال است که پابرجا بوده و روز به روز بر محبوبیتشان اضافه می شود. Node.js تست زمان را پس داده است و می توانید مطمئن باشید که توسعه آن متوقف نشده و تا مدتی بسیار طولانی از پروژه هایتان پشتیبانی می کند.