برای استفاده از کتابخانه های اشخاص دیگر در نرم افزار خود ، Node.js با سیستم مدیریت پکیج های خود در نرم افزار شما می آید که عنوان آن Node Package Manager ( NPM ) می باشد . در این بخش در مورد چگونگی استفاده از این سیستم مدیریت پکیج ها با شما خواهیم بود .
بخش 13 – آموزش Node.JS ، پکیج های Node.js
هر نرم افزاری که می تواند در جاوا اسکریپت نوشته شود ، در نهایت در جاوا اسکریپت نوشته خواهد شد !
قانون Atwood ، توسط Jeff Atwood
برای استفاده از کتابخانه های اشخاص دیگر در نرم افزار خود ، Node.js با سیستم مدیریت پکیج های خود در نرم افزار شما می آید که عنوان آن Node Package Manager ( NPM ) می باشد . در این بخش در مورد چگونگی استفاده از این سیستم مدیریت پکیج ها با شما خواهیم بود .
بازنگری ماژول های Node.js
در قسمت های قبلی گفتیم که سه نوع ماژول در Node.js داریم . ماژول file-base ، ماژول core ، و ماژول external. در مورد دو نوع اول در بخش های قبلی صحبت کردیم و اکنون در مورد external ها صحبت خواهیم کرد .
· برای ارسال نام ماژول به تابع require از پیشوندهای ‘./’ یا ‘../’ یا ‘/’ استفاده نمودیم . و سپس فرض براین است که ماژول از نوع file-base بوده و فایل بارگزاری می گردد . مثال هایی از این دست : require(‘./ilia’) ، require(‘../ilia/ilia1’) ، require(‘full/path/ilia/file’) .
· و در صورتی دیگر مشاهده کردیم که ماژول های هسته را می توان تنها با نوشتن نام آن ها فرخوانی کرد . بطور مثال require(‘ilia’) .
جستجو برای node_modules
مثالی در این زمینه می زنیم . اگر یک فایل در مسیر /home/ryo/project/foo.js یک دستور require(‘bar’) داشته باشد ، آنگاه Node.js سیستم فایل را برای node_modules بر اساس ترتیب زیر اسکن می نماید . و اولین bar.js را برمی گرداند :
به عبارت دیگر ، Node.js بدنبال node_modules/bar.js در فولدر جاری جستجو می کند و این کار را به ترتیب ادامه می دهد تا به ریشه ی سیستم فایل برسد تا زمانی که یک bar.js را بیابد .
ماژول های folder-based
همانطوری که در قسمت های قبلی گفتیم شما می توانید تمامی ماژول های خود را در یک فایل index.js قرار داده و سپس آن index.js را فرخوانی کنید تا بدین ترتیب به تمامی ماژول ها دسترسی داشته باشید و دیگر نیازی به فراخوانی جداگانه ی هر ماژول نباشد .
حال این سناریو در Node.js بدین صورت است که اگر شما مسیر یک ماژول را به جای نام فایل ، نام یک فولدر بگذارید ، آن گاه Node.js در آن فولدر بدنبال یک فایل Index.js خواهد گشت و آن را به عنوان ماژول مورد نظر باز خواهد گرداند .
فواید node_modules
متوجه شدیم که node_modules شبیه به ماژول های مبتنی بر فایل می باشد ، منتهی با یک تفاوت که در مکانیستم اسکن و بارگزاری فایل جاوا اسکریپت ماژول دارند . سوال اینجاست که این تفاوت چه فوایدی دارد ؟
ساده کردن مسیرهای فایل طولانی
فرض کنید یک ماژول با عنوان ilia/ilia.js دارید که تعداد ابزار مفید را برای استفاده از جاهای مختلف نرم افزار شما فراهم می نماید . در بخش Foutami/Foutami.js شما با استفاده از فراخوانی require(‘../ilia/ilia.js’) و در بخشی دیگر مانند bas/nick/scott.js شما با استفاده از require(‘../../../ilia/ilia.js’) به آن دسترسی خواهید داشت . در اینجاست که شما براحتی با استفاده از node_modules/ilia/index.js می توانید براحتی مسیر خود را ساده سازی کنید . و با قرار دادن آن در مسیر ریشه و سپس فراخوانی require(‘ilia’) می توانید به آن دسترسی داشته باشید .
افزایش قابلیت استفاده مجدد
اگر شما بخواهید ماژول خود را با پروژه ای دیگر به اشتراک بگذارید ، کافیست شما node_modules/ilia را در آن پروژه کپی نمایید . در واقع اگر شما در دو زیر پروژه ی مشابه کار می کنید ، می توانید node_modules/ilia را به فولدر مشابه منتقل نمایید . در مثال زیر چنین چیزی را می بینید :
کاهش اثرات جانبی
بدلیل شیوه ی اسکن ماژول های در node شما می توانید وجود ماژول های مشابه در کدهای خود را محدود سازید .
غلبه بر ناسازگاری ماژول
Node.js از مشکلات وابستگی و ناسازگاری که در برخی از سیستم های قدیمی وجود داشت رنج نمی برد . در بسیاری از سیستم های قدیمی ، یک module نمی تواند با یک moduleY کار کند چرا که آن ها به نسخه های مختلفی از moduleZ وابسته می باشند . اما در Node.js هر ماژول فولدر node_module خودش را داشته و نسخه های مختلفی از moduleZ می توانند وجود داشته باشند . ماژول ها نیازی ندارند تا در Node.js بصورت سراسری باشند .
Caching ماژول و node_modules
همانطوری که گفتیم node_modules یک راه متفاوت برای یافتن ماژول های مبتنی بر فایل می باشد . بنابراین ، این روش نیز از همان قوانین caching پیروی می نمایند .
شاد و سلامت باشید
محمد جعفری فوتمی