حتماً تاکنون دقت کردهاید که نام خیلی از پکیجها با علامت @ شروع میشوند. و حتماً این سؤال برایتان پیش آمده که این علامت چه معنایی دارد ...؟
باید بگوییم بعضی از پکیجهای npm علاوه بر نام، یک scope هم دارند که بعد از علامت @ میآید. در واقع تعیین اسکوپ راهیست برای گروهبندی پکیجهای مرتبط با هم. به این معنی میتوانیم اسکوپ را «محدوده» یا «گروه» ترجمه کنیم. در این مقاله برای جلوگیری از سردرگمی و از طرفی بدلیل خاص بودن مفهوم scope در این کاربرد، برای ترجمه این واژه، از کلمه «اسکوپ» استفاده میکنیم.
استفاده از اسکوپ در بعضی جاها، باعث می شود که npm به طرز متفاوتی با پکیج برخورد نماید.
بطور کلی در npm دو نوع اسکوپ وجود دارد: individual user scope (یا user scope) و organization scope. اولی اسکوپ شخصی یک کاربر است و دومی اسکوپ یک سازمان.
معمولاً یک کاربر یا یک سازمان(organization) اسکوپ مخصوص به خود را میسازد و پکیجهایش را در محدوده آن اسکوپ منتشر میکند. یکی از خوبیهای این کار، ایجاد تمایز بین پکیجهاست. مثلاً اگر نام پکیجِ یک ارگان یا یک شخص با نام پکیجِ ارگان یا شخص دیگری یکی باشد، از آنجایی که نام اسکوپ آنها با هم متفاوت است، هیچ مشکلی پیش نخواهد آمد. مثلاً اگر کاربری در اسکوپ شخصی خود با نام someusername@ پکیجی به نام react را منتشر کند، اولاً مجاز به این کار است و ثانیاً این پکیج هیچ گونه تداخلی با پکیج react معروف نخواهد داشت. این که نام این محدوده چه میتواند باشد، از همان قوانین نامگذاری پکیجها تبعیت میکند.
و در کل استفاده از اسکوپ راه خوبی برای افراد و ارگانهاست که از این طریق پکیجهای رسمی خود را ارائه کنند.
توجه داشته باشید از اینجا به بعد در دانشنامه، به پکیجهای scoped «اسکوپدار» و به پکیجهای unscoped «بدون اسکوپ» گفتهایم.
نام پکیجهای اسکوپ دار با علامت @ شروع میشود، مثلاً vue/cli@، ما با یک نگاه به این اسم درمییابیم که این پکیج یک پکیج cli است و بطور رسمی توسط vue منتشر شده. قالب کلی نامگذاری پکیجهای اسکوپ دار نیز به این صورت است:
مثلاً یک شخص یا یک ارگان میتواند اسم پکیجهایش را اینطور قرار دهد: myorg/mypackage@
برای ایجاد فایل package.json یک پکیج اسکوپدار (راه اندازی پروژهای که قرار است بصورت یک پکیج اسکوپدار منتشر شود)، میتوانیم از دستور
npm init --scope=@<scope-name>
استفاده کنیم، که در آن <scope-name> نام اسکوپ مورد نظر ماست.
اگر به فولدر node_modules
پروژهای مراجعه کنیم، میبینیم پکیجهایی که مربوط به یک اسکوپ هستند، همگی در فولدر مربوط به آن اسکوپ قرار دارند. یکی دیگر از محاسن تعیین اسکوپ همین موضوع است که باعث میشود ساختار فایلِ مرتبتر و گویاتری داشته باشیم. بعنوان مثال وقتی یک نسخه خاص از vue را نصب میکنیم: npm install vue@3.0.0.alpha-12
، میبینیم پکیجهایی نظیر
vue/compiler-core@،vue/compiler-dom@،vue/shared@ و ... هم در دایرکتوریِ ./node_modules/@vue
نصب شدهاند و به این ترتیب پکیجهایی که مربوط به اسکوپ vue@ هستند یک جا تجمیع میگردند.
نکته آنکه پکیجهای scoped و unscoped میتوانند نیازمندیِ یکدیگر باشند و از این نظر هیچ مشکلی نیست و فرقی هم با هم ندارند.
یادمان باشد وقتی که میخواهیم پکیجهای اسکوپ دار را require کنیم، از آنجایی که در فولدر اسکوپ مخصوص بخودشان ذخیره شدهاند، باید نام آن اسکوپ را هم ابتدای کار بیاوریم:
در مقاله بعد، در مورد public و private بودن پکیج ها بیشتر توضیح داده ایم. با ما همراه باشید.