آشنایی با Yarn

?What is Yarn

31 خرداد 1400
آشنایی با Yarn

اگر با فضای توسعه وب با جاوا اسکریپت آشنا باشید حتما نام npm را شنیده اید. npm یک package manager است که به صورت خودکار با نصب node.js برایتان نصب می شود. package manager چیست؟ package manager به معنی «مدیریت کننده پکیج» است. همانطور که می دانید ما در جاوا اسکریپت به یک بسته کد «پکیج» یا «ماژول» می گوییم.

مخاطب مقاله: این مقاله برای افرادی طراحی شده است که با npm آشنا بوده و حالا می خواهند از yarn استفاده کنند.

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

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

با این حساب Yarn چیست و چه نقشی در این اکوسیستم دارد؟ Yarn جایگزینی برای npm است. احتمالا می پرسید چرا باید به جای npm از yarn استفاده کنیم؟ npm معایب خودش را نیز دارد، گرچه این معایب بسیار کوچک هستند:

  • npm registry وب سایتی است که پکیج های npm روی آن قرار دارند. فقط یک npm registry وجود دارد بنابراین اگر قطعی ایجاد شده یا کُند شود باید منتظر بمانید تا سیستم را درست کنند. این مسئله ممکن است در لحظات حیاتی، ساعت ها از زمان شما را هدر بدهد.
  • طبیعتا برای نصب پکیج ها به اینترنت نیاز دارید، در غیر این صورت هیچ دسترسی به پکیج ها نخواهید داشت.
  • دستورات CLI برای npm از نظر ظاهری زیبا نیستند و بعضا ممکن است حالت پیچیده ای پیدا کنند.
  • یکی دیگر از مشکلات بزرگ npm این است که به پکیج ها اجازه می دهد در هنگام نصب شدن هر کدی را که خواستند اجرا کنند. این مسئله در قبل باعث اجرای کد های مخرب شده روی سیستم کاربران شده است.

Yarn پا به میدان گذاشته است تا این مسائل را حل کند. از مهم ترین ویژگی ها و مزایای yarn می توان به موارد زیر اشاره کرد:

  • yarn می تواند پکیج ها را از کش محلی (local cache) سیستم شما نیز نصب کند و لزوما نیازی به اینترنت ندارد.
  • yarn نسخه پکیج ها را به طور محکم bind می کند.
  • yarn به شما اجازه می دهد پکیج ها را در حالت موازی (همزمان و در کنار هم) نصب کنید در حالی که در npm پکیج ها به صورت توالی نصب می شوند.
  • yarn در هنگام نصب پکیج ها سرعت بالاتری دارد.
  • دستورات ساده و خوانا در CLI
  • ارائه قابلیت های بیشتری نسبت به npm در زمینه مدیریت پکیج ها
  • پلاگین های مختلف

نصب yarn

yarn از طریق npm نصب می شود بنابراین برای نصب آن باید ابتدا دستور زیر را اجرا کنید:

npm install -g yarn

اگر از کاربران لینوکس یا مک هستید احتمالا باید دستور sudo را نیز قبل از این دستور قرار بدهید:

sudo npm install -g yarn

حالا اگر دستور yarn --version را در ترمینال خود اجرا کنید می بینید که نسخه اول yarn برایتان نصب شده است. برای اینکه به نسخه ۲ برویم باید دستور زیر را اجرا کنید:

yarn set version berry

هر زمانی که خواستید yarn را به روز رسانی کنید نیز باید این دستور را اجرا کنید:

yarn set version latest

استفاده از Yarn

زمانی که می خواهیم یک پروژه را با npm شروع کنیم باید دستور npm init را اجرا می کردیم. yarn نیز به همین شکل است بنابراین یک پوشه را برای خودتان در نظر بگیرید و ترمینال را درون آن باز کنید. حالا دستور yarn init را در آن اجرا کنید. با اجرای این دستور چندین فایل پوشه مختلف درون پوشه مورد نظر شما ساخته می شوند. مثلا یک فایل gitignore را داریم که برای نادیده گرفتن برخی از فایل ها از نظر git است. همچنین فایل package.json را داریم که پکیج های ما را مدیریت می کند.

از این به بعد پروژه ما تحت نظر yarn است. برای اضافه کردن یک پکیج از ساختار زیر استفاده می کنیم:

yarn add [package]

مثلا برای اضافه کردن پکیج axios می گوییم:

yarn add axios

اگر نسخه خاصی از این پکیج را نیز بخواهید باید آن را بدین شکل بنویسید:

yarn add [package]@[version]

به طور مثال:

yarn add axios@0.21.1

yarn نیز مانند npm چند دسته وابستگی دارد:

dependencies: در ابتدا وابستگی های استاندارد را داریم که پروژه برای اجرا شدن به آن ها وابسته است. اگر این وابستگی ها به درستی نصب نشوند برنامه اجرا نخواهد شد. مثلا بدون پکیج react نمی توانید یک وب سایت react ای بسازید.

devDependencies: وابستگی های خاص توسعه که در اصل پروژه استفاده نمی شوند و فقط در زمان توسعه به آن ها نیاز داریم. به زبان ساده تر آن ها ابزار های توسعه برای ما هستند. مثلا وبپک (webpack) همیشه یک dev-dependency است چرا که زمانی که پروژه را روی سرور قرار می دهیم دیگر با webpack کاری نداشته و از آن استفاده نمی کنیم اما در هنگام کدنویسی و توسعه پروژه حتما به آن نیاز داریم.

peerDependencies: این وابستگی که اعلام می کند این پکیج حتما بخشی از یک پکیج دیگر است. تفاوت این دسته از وابستگی ها با وابستگی های dev (توسعه) این است که وابستگی های dev بخشی از پکیجی دیگر نیستند. مثلا اگر یک وب سایت را با react می نویسیم، کد هایمان را با webpack کامپایل می کنیم اما خود webpack بخشی از پکیج react نیست. وابستگی های peer یا همسان بخشی از یک پکیج دیگر بوده و نمی توانند به صورت مستقل استفاده شوند. مثلا اگر یک پلاگین برای فریم ورک Express بنویسید، آن پلاگین یک وابستگی peer برای پکیج Express به شمار می رود. یا مثلا پکیج react-dom یک وابستگی peer برای پکیج react محسوب می شود.

optionalDependencies: وابستگی هایی که می توانند در پروژه استفاده شوند اما وجودشان ضروری نیست. اگر فرآیند نصب این وابستگی ها به مشکل بخورد yarn هیچ خطایی به شما نمی دهد.

حالت اول نصب (وابستگی های عادی) را در قسمت قبلی مشاهده کردیم:

yarn add axios

برای سه حالت بعدی (وابستگی های dev و peer و optional) می توانید از فلگ های خاص خودشان استفاده کنید:

yarn add [package] --dev

yarn add [package] --peer

yarn add [package] --optional

اضافه کردن این فلگ ها در انتهای دستور add باعث می شود این وابستگی ها به صورت خاصی نصب شوند. برای اینکه این مسئله را به صورت عملی ببینیم بیایید آن را با هم امتحان کنیم. ابتدا پکیج axios را به صورت وابستگی استاندارد نصب کنید:

yarn add axios

حالا پکیج nodemon را به صورت وابستگی dev نصب می کنیم:

yarn add nodemon --dev

در حال حاضر اگر فایل package.json را باز کنید باید محتوای زیر را در آن ببینید:

{

  "name": "code",

  "dependencies": {

    "axios": "0.21.1"

  },

  "devDependencies": {

    "nodemon": "^2.0.7"

  }

}

فیلد name برابر code است چرا که اسم پوشه من code بوده است. این مقدار بنا بر نام پوشه شما تغییر می کند و می توانید هر مقداری را برایش انتخاب کنید. قسمت مهم برای ما dependencies و devDependencies است. امیدوارم متوجه تفاوت شده باشید.

اگر پکیجی را از قبل دانلود کرده بودید و حالا می خواهید آن را به روز رسانی کنید چطور؟ برای به روز رسانی پکیج ها باید از دستور upgrade استفاده کنید:

yarn upgrade [package]

yarn upgrade [package]@[version]

و نهایتا برای حذف یک پکیج یا همان وابستگی نیز از دستور remove استفاده می کنیم:

yarn remove [package]

همچنین زمانی که کد هایی را دریافت می کنید که فقط اسکریپت اصلی را دارند و وابستگی هایش را ندارند باید دستور yarn یا yarn install را اجرا کنید. هر دو دستور یکی بوده و دقیقا معادل npm install هستند.

ورژن وابستگی ها

Yarn از Semantic Versioning پیروی می کند که یک سیستم مشهور برای تعیین نسخه نرم افزار ها است. ساختار کلی آن به شکل major.minor.patch است به طوری که:

  • تغییر بخش major به معنی ایجاد breaking change است. یعنی تغییراتی که باعث می شود API پکیج تغییر کرده و برنامه هایی که قبلا با آن نوشته شده است دیگر کار نکند.
  • تغییر بخش minor به معنی اضافه کردن ویژگی های جدید است. این ویژگی ها باعث خراب شدن برنامه هایی که با نسخه های قبلی نوشته شدند، نمی شود.
  • تغییر بخش patch به معنی تصحیح باگ های موجود است. طبیعتا این دسته از تغییرات نیز باعث خراب شدن برنامه های قبلی نمی شوند.

نکته مهم بعدی این است که اگر به فایل package.json نگاه کنید، در کنار نسخه هر اسکریپت یک علامت < یا > یا = یا ^ یا چیزی شبیه به این ها را مشاهده می کنید:

  "devDependencies": {

    "nodemon": "^2.0.7"

  }

این علامت ها comparator نام داشته و هر کدام معنی خاصی دارند. من با چند مثال معنی آن ها را برایتان توضیح می دهم:

  • علامت > به معنی «کمتر از» می باشد بنابراین نسخه 2.0.0> یعنی هر نسخه ای که کمتر از 2.0.0 باشد.
  • علامت < به معنی «بیشتر از» می باشد بنابراین نسخه 0.4.2< به معنی هر نسخه ای است که از 0.4.2 بیشتر باشد.
  • علامت => به معنی «کمتر از یا مساوی با» می باشد بنابراین نسخه 3.1.4=> به معنی هر نسخه ای است که از برابر با 3.1.4 یا کمتر از آن باشد.
  • علامت =< به معنی «بیشتر از یا مساوی با» می باشد بنابراین نسخه 2.7.1=< به معنی هر نسخه ای است که از برابر با 2.7.1 یا بیشتر از آن باشد.
  • علامت = به معنی «مساوی با» می باشد بنابراین نسخه 4.6.6= به معنی نسخه ای است که دقیقا برابر با 4.6.6 باشد.
  • علامت ~ به معنی هر نسخه ای است که قسمت patch آن تغییر کند. مثلا 3.1.4~ یعنی نسخه هایی که بین 3.1.4 و 3.2.0 هستند.
  • علامت ^ به معنی نسخه هایی است که عدد صفر را تغییر نمی دهند. مثلا 3.1.4^ یعنی نسخه هایی که بین 3.1.4 و 4.0.0 هستند در حالی که 0.4.2^ یعنی نسخه هایی که بین 0.4.2 و 0.5.0 هستند. همچنین 0.0.2^ یعنی نسخه هایی که بین 0.0.2 و 0.0.3 هستند.

امیدوارم این مسئله برای شما واضح شده باشد.


منبع: وب سایت yarnpkg

نویسنده شوید
دیدگاه‌های شما (2 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

Mohammadali fallahzade
27 فروردین 1401
خیلی ممنون ♥

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

روکسو
12 اردیبهشت 1401
سپاس از حضورتون

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

روکسو
12 اردیبهشت 1401
قدردان حمایت شما هستیم.

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

mobin
08 اسفند 1400
واقعا استاد حرف نداشت

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.