آموزش مفاهیم مقدماتی Node.js
۱۳ شهریور ۱۳۹۹
هر فناوری، استانداردهای خاص خود را دارد. مهم نیست که PHP ،JavaScript ،Java و یا Swift باشد، همیشه قوانینی وجود دارند که باید از آنها پیروی کنید.
مقدمه
بهعنوان توسعهدهنده نرمافزار، سعی میکنیم از اختراع دوباره چیزهایی که وجود دارند، خودداری کنیم و برای این کار باید قبل از شروع به نوشتن کدها، از وجود نداشتن کدهای مدنظرمان اطمینان حاصل کنیم.
توسط NPM (Node Package Manager)، تعداد قابل توجهی کتابخانه جاوااسکریپت در اختیار عموم قرار گرفته است و امروزه به فریمورکهای مختلف HTTP، کتابخانههای اعتبارسنجی، اجراکنندههای تست و حتی ابزار ثبت Log دسترسی خواهیم داشت.
مشاهده کردهایم که توسعهدهندگان کمتجربه همیشه در تلاش برای انتخاب ابزار مناسب هستند و بههمین دلیل تصمیم گرفتهایم، مفاهیم و ابزارهای مفید Node.js را در این مقاله گردآوری کنیم.
Supervisor
احتمالا برای شروع باید با این سوال شروع کنیم. Node.js چهکاری انجام میدهد؟ بهتر است بدانید که تفاوتهایی بین یک سرور Node.js و PHP وجود دارند. هرکدام از درخواستهایی که به سرور PHP ارسال میشوند، isolate شده هستند و به این شکل خطاهای ایجاد شده در هر درخواست، بر روی درخواست دیگر تاثیری ندارد.
اما Node.js متفاوت است، هرخطایی رخ دهد، روی کل سرور تاثیر میگذارد. بدتر از اینها ممکن است با ایجاد خطا، تمام سرور دچار مشکل شود و دیگر سرور پاسخگوی دیگر درخواستها نباشد. به همین دلیل شما به یک supervisor نیاز خواهید داشت، این یک ابزار ویژه برای نظارت بر روند و در صورت لزوم راهاندازی مجدد برنامه، بهحساب میآید. ابزارهای مختلفی با این کارایی وجود دارند که معروفترین آنها forever و supervisor هستند. همچنین PM2 هم توصیه میشود.
PM2 ابزاری برای ارائه محصول (Production Runtime) و مدیریت پردازشها در برنامههای nodejs است. میتوان گفت این ابزاری است که دقیقا هر توسعهدهندهای به آن احتیاج دارد. PM2 یک قابلیت به نام PM2-Dev دارد و در زمانی استفاده میشود که پروژهمان درحال توسعه است و توسعه را با راهاندازی مجدد برنامه در زمانی که کدهایتان را تغییر میدهید، آسان میکند.
همچنین PM2 دارای یک load balancer داخلی است. از مقیاسبندی پشتیبانی میکند (به شما اجازه میدهد برنامه Node.js خود را در حالت cluster اجرا کنید). بهعلاوه با دستور ساده m2 میتوانید به عملیات استقرار برنامهتان، رسیدگی کرده و همچنین درصورت تمایل به containerize کردن برنامهتان با PM2 میتوانید از docker imageهای این ابزار استفاده کنید. سرانجام این ابزار یک داشبورد برای کنترل وضعیت برنامه در اختیار شما قرار میدهد که در آن لاگها، خطاها و میزان استفاده از منابع و بسیاری از موارد دیگر، به شما نشان داده میشود.
فریمورک
مورد بعدی که باید در برنامه یادگیری Node.js قرار دهید، انتخاب و یادگیری فریمورک مناسب است. همانطور که همه میدانند، در زبان جاوااسکریپت تعداد زیادی فریمورک وجود دارد و این تعداد در حال رشد هستند. Node.js هم به این صورت است. گزینههای زیادی وجود دارند که انتخاب را دشوار میکنند.
از گزینههایی که پیش روی شما قرار دارند مانند Koa، Loopback، Nest.js، Hapi، Restify، Fastify، Sails.js، Totaljs و … بهنظر استفاده از Express.js انتخاب عاقلانه و پایداری باشد. دلایل زیادی برای انتخاب Express در اکثر پروژهها، بهجای انتخاب موارد دیگر وجود دارند.
اولین و احتمالا مهمترین دلیلی که میتوان برای انتخاب Express.js در نظر گرفت، جامعه کاربری است. این فریمورک بسیار مشهور است و گاها وقتی که صحبت از Node.js میشود خیلی از افراد آن را با Express.js اشتباه میگیرند.
از مزیتها و معایب Express در مقایسه با فریمورکهای دیگر میتوان به موارد زیر اشاره کرد:
- این فریمورک بر خلاف Koa، مبتنی بر Callback است.
- برخلاف فریمورک Restify، از قبل برای REST API پیکربندی نشده است.
- عملکرد فریمورک Express به خوبی Fastify نیست.
اما این فریمورک با افزوده شدن چند افزونه و قابلیتهای جدید Node.js 14، سهولتی باور نکردنی را در اختیار ما قرار میدهد.
در ادامه باید بگوییم که Express بر پایه Middlewareها کار میکند و اگر شما با redux آشنا باشید، میدانید که چقدر کارتان راحت میشود. اگرچه برخلاف فریمورک Hapi، از قابلیت اعتبارسنجی دادهها بهصورت داخلی بهره نبرده است اما شما میتوانید کتابخانههایی مانند express-validator (ajv)، celebrate (joli) را به پروژهتان اضافه کنید و از این قابلیت بهره ببرید.
همچنین برای مدیریت لاگها میتوانید به سادگی کتابخانههای winston، pino یا bunyan را به فریمورک خود اضاف کنید.
برای تکمیل این بخش لیستی از پکیجهای Middleware که معمولا از آنها استفاده میشود را معرفی میکنیم:
- winston: سیستم ثبت Log،
- morgan: برای ثبت لاگ درخواستها،
- cors: رسیدگی به cors،
- helmet: تامین امنیت برنامه،
- celebrate: برای اعتبارسنجی درخواست و رسیدگی به خطا.
البته باید افزود که اینها فقط موارد رایجی هستند که برنامهنویسان تمایل دارند از آنها استفاده کنند.
تست و ارزیابی برنامه
یکی دیگر از بخشهای اصولی که در Node.js باید به آن بپردازیم، تست است. همه ما برای برنامههایمان تست مینویسیم یا حداقل امیدواریم اینچنین باشد. شما برای انجام این کار به چند ابزار مختلف نیاز خواهید داشت:
- ابزاری برای اجرای تست (به آن test runner میگویند)،
- ابزاری دیگر برای اثبات نتایج (assertion library)،
- در موارد پیشرفتهتر ابزاری برای mock/stub کردن ماژولها (mocking library).
شاید زمانی که کار با Node.js را شروع میکنید نیاز شود تا تمام مواردی که در بخش بالا دربارهشان صحبت کردهایم را نصب کنید. برای شروع با مواردی مانند mocha، chai، sinon برخورد خواهید کرد اما ابزارهای دیگری وجود دارند، برای مثال میتوان به Jasmine (test runner + assertion library) و Rewire (module mocking library) اشاره کرد.
اما از زمانی که React منتشر شده، همه چیز تغییر کرده است. فیسبوک یک ابزار تست فوقالعاده به نام Jest در اختیار توسعهدهندگان قرار داده است که تمام موارد مورد نیاز را شامل میشود.
دیباگینگ
بیایید با این موضوع کنار بیاییم که راهی برای رهایی از به وجود آمدن باگ در برنامه، وجود ندارد. شاید این مورد یک آرزو باشد که بخواهید روزی به آن برسید، اما ایجاد یک برنامه موبایل یا وب آنهم به سادگی، غیرممکن است. مهم نیست که چقدر سخت تلاش کنید تا موارد مورد استفاده در برنامه را تست کنید، باز هم با مواردی غیر منتظره در برنامهتان روبرو خواهید شد.
به همین دلیل است که در شروع آموزشهای Node.js باید روش اشکال زدایی یا همان دیباگینگ کدها را یاد بگیرید. یکی از موارد مهم در این زمینه، داشتن ابزارهایی برای پیدا کردن راه حل است.
Node.js تا به امروز، مسیر طولانی را طی کرده، همچنین با تجربههای به وجود آمده دیباگینگ هم آسانتر شده است. در گذشته برای فهمیدن اینکه چه اتفاقی در کدهایمان رخ میدهد از console.log استفاده میشد. سپس node-inspector به میان آمد اما در مقابل ابزارهای موجود در PHP، ناکارآمد بود.
آیا شما در بررسی کردن (inspecting) اجرای کدها با pm2، ts-node (بهخصوص نسخه +5.0) مشکلی داشتهاید؟
ابزار دیباگینگی به نام NDB وجود دارد که توسط گوگل توسعه داده شده و برای درک اهمیت این موضوع باید اشاره کنیم که گوگل همان کمپانی است که موتور V8 را توسعه داده و امروزه در بسیاری از پلتفرمها از آن استفاده میشود.
به جای اینکه برنامههایتان را با سوئیچ -inspect
(این قابلیت توسط node-inspector به هسته اصلی Node اضاف شده است) اجرا کنید، میتوانید به سادگی از دستور ndb استفاده کرده (برای مثال: ndb npm start) و با اجرای این دستور یک مرورگر جدید با هدف دیباگینگ برنامه باز میشود. تمام فایلهای هسته node به صورت پیشفرض در blacklist قرار میگیرند. همچنین شما به ترمینال، REPL و بسیاری از موارد دیگر دسترسی خواهید داشت.
سبک کدنویسی
برخلاف PHP که از سبک کدنویسی PSR پیروی میکند، زبان جاوااسکریپت به این شکل نیست و بسیاری از کمپانیها قوانین خودشان را بهوجود میآورند.
برای رعایت همه قوانین باید ابزاری داشته باشید که تمام اشتباهات را ردگیری کرده و احتمالا بتواند مشکلها را برطرف کند. شما میتوانید برای اینکار از eslint یا tslint (بسته به زبانی که میخواهید با آن کار کنید) و Prettier استفاده کنید. البته باید به مورد جالبی اشاره داشته باشیم، شما میتوانید تمام این ابزارها را در کنار همدیگر استفاده کنید. هر دو ابزار eslint و tslint ابزارهای linting بهحساب میآیند. به این معنی که آنها مجموعهای از قوانین تعیین شده را در کد شما بررسی میکنند، برای مثال: استفاده از var را مجاز نمیدانند.
زبان برنامهنویسی
در بخش پایانی این مقاله به زبان برنامهنویسی میپردازیم. با اینکه همه ما از جاوااسکریپت استفاده میکنیم، ولی روشهای استفادهمان متفاوت است. برخی مجبورند از ES5 استفاده کنند درحالی که برخی دیگر از برنامهنویسان میتوانند تمام کدهایشان را با ES9 بنویسند یا حتی از stage 3 proposals به کمک babel استفاده کنند.
یکی از نکتههای قابل ذکر دیگری که در Node.js وجود دارد، static typing است که روز به روز محبوبتر میشود.
بخش پایانی
اکوسیستم Node.js بهقدری گسترده است که یک توسعهدهنده جوان نمیتواند فقط به آن وارد شود و بعد از آن بتواند از تمام ویژگیهای موجود، استفاده ببرد. به دلیل اهمیت بالای زمان، بهتر است بهجای امتحان کردن تمام ابزارهای موجود، از توسعهدهندگان باتجربه کمک گرفته و به کمک توصیههای آنها، ابزار مناسب را انتخاب کنید.