Yarn چیست و آیا از npm بهتر است؟

Yarn vs npm

25 بهمن 1400
npm یا Yarn: کدام یک مدیریت کننده ی بهتری برای پکیج های شماست؟

npm و Yarn دو package manager (مدیریت کننده پکیج) بسیار مشهور برای زبان جاوا اسکریپت می باشند. اگر نمی دانید package manager چیست می توانم به صورت خلاصه برایتان بگویم که package manager ها روشی برای اتوماسیون و خودکارسازی پروسه نصب، به روز رسانی، پیکربندی و حذف قطعات نرم افزاری (پکیج ها) از یک رجیستری جهانی هستند. در این مقاله می خواهیم به تفاوت های این دو package manager بسیار محبوب بپردازیم.

npm چیست؟

JavaScript node package manager که معمولا به اختصار npm خوانده می شود package manager پیش فرض در Node.js است. کار با آن بر اساس command line بوده و هزاران پکیج مختلف عمومی و حرفه ای دارد که به طور کل به آن ها npm registry (جایی که تمام پکیج های npm جمع شده اند) می گویند. شما می توانید از طریق client به این رجیستری دسترسی داشته باشید و از بین هزاران پکیج موجود در آن انتخاب کنید.

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

node -v
npm -v

Yarn چیست؟

Yarn package manager

Yarn در واقع تلاش فیسبوک برای جبران کاستی های npm بود! از نظر فنی Yarn به جای npm به وجود نیامده چرا که هنوز از ماژول های npm registry استفاده می کند، بلکه یک installer جدید است که هنوز از ساختار npm استفاده می کند. به زبان ساده تر رجیستری هنوز همان رجیستری است اما روش نصب متفاوت شده است. از آنجایی که Yarn و npm یک مجموعه پکیج را دارند اگر بخواهید از Yarn به npm یا بالعکس بروید نیازی به تغییرات سنگین نخواهید داشت.

برای نصب Yarn دو راه وجود دارد؛ اگر می خواهید Yarn را از طریق npm نصب کنید باید از دستورات زیر استفاده کنید:

npm install yarn --global

اما توسعه دهندگان با تجربه می گویند بهتر است از این کار دوری کنید. بهتر است برای نصب Yarn از package manager سیستم خودتان استفاده کنید. به طور مثال اگر از brew در سیستم عامل مک استفاده می کنید باید از کد زیر استفاده کنید:

brew update
brew install yarn

همچنین اگر می خواهید از Yarn در پروژه های فعلی npm خود استفاده کنید تنها کافی است دستور زیر را اجرا کنید:

Yarn

پس از اجرای این دستور متوجه می شوید که پوشه node_modules بر اساس سیستم نام گذاری Yarn نام گذاری شده است.

مقایسه npm و Yarn

Yarn قابلیت هایی دارد که آن را از npm جدا می کند (مخصوصا نسخه های قبل از 5.0 npm):

1. وجود فایل yarn.lock

برخی اوقات مدیریت نسخه ها در package.json شلوغ و سخت می شود اما فایل yarn.lock به شما کمک می کند که خود را از این وضعیت خلاص کنید. هر گاه یک module جدید اضافه می کنید، Yarn یک فایل yarn.lock را به روز رسانی می کند. از آنجا که این فایل شبیه به فایل Gemfile.lock در Ruby است، به شما این تضمین را می دهد که دقیقا یک پکیج روی تمام دستگاه های شما نصب شود. اصلا به همین دلیل است که lock (به معنی «قفل») نامیده می شوند چرا که وابستگی به ورژن خاصی را در هنگام نصب قفل می کنند. این فایل های lock کلیدهایی دارند که با آن تغییرات در ساختار فایل ها در node_modules را تا حد ممکن کاهش می دهند.

در نسخه های قبلی npm همین کار با استفاده از دستور shrinkwrap انجام می شد اما مشکل آنجا بود که فایل shrinkwrap به صورت خودکار ساخته نمی شود و نیاز به توجه و مدیریت دائمی دارد. البته npm جدیدا package-lock.json را معرفی کرده است که نسخه ارتقاء یافته npm-shrinkwrap است اما از آنجا که yarn.lock همه کارها را به صورت خودکار انجام میدهد باز هم گزینه بهتری محسوب می شود.

2. نصب پکیج ها

وقتی می خواهیم پکیجی را نصب کنیم، npm فرآیند نصب را به صورت ترتیبی و خطی انجام می دهد؛ یعنی هر پکیج باید به صورت کامل نصب شود تا بتوانیم پکیج بعدی را نصب کنیم. خوشخبتانه Yarn قدرت این را دارد که همزمان چندین پکیج را نصب کند که باعث افزایش زیاد سرعت می شود. این مبحث دقیقا همان مبحث موازی‌گری در HTTP/2 است.

3. سرعت

Yarn همیشه از نسخه های پایین تر از 5.0 npm سریع تر بوده است. از طرفی تیم npm اعلام کردند که در نسخه جدید قرار است سرعت npm تا 5 برابر (در برخی از عملیات ها) افزایش پیدا کند اما بر اساس تحلیل ها و گزارشات آقای Scott Logic که در تصویر زیر می بینید، Yarn هنوز هم از npm 4 و npm 5 سریع تر است.

تفاوت سرعت npm و Yarn (وابستگی ها در این تست در کمترین حد خود نگه داشته شده اند)
تفاوت سرعت npm و Yarn (وابستگی ها در این تست در کمترین حد خود نگه داشته شده اند)

بنابراین npm 5 نتوانسته است افزایش سرعت قابل ملاحظه ای را نسبت به نسخه های قبلی خود ارائه کند. شاید اگر بخواهید gulp را نصب کنید این تفاوت سرعت به چشم نیاید اما در سطوح بالاتر و پروژه های بزرگ تر کاملا قابل لمس است. اگر می خواهید خودتان تست سرعت انجام دهید می توانید از ابزار بنچ مارک npm-yarn-benchmark استفاده کنید.

4. امنیت

یکی از مشکلات بزرگ npm این است که کدهای dependency (وابستگی ها - پکیج های وابسته به پکیج فعلی) را به صورت خودکار اجرا کرده و به آن ها اجازه می دهد که در لحظه اضافه شوند. با اینکه این قابلیت کار را کمی آسان تر می کند اما مشکلات امنیتی خود را نیز دارد. از آنجا که Yarn تنها از فایل yarn.lock یا package.json اجازه نصب می دهد، امن تر نیز می باشد. البته Yarn قبل از نصب پکیج ها checksums را نیز چک می کند تا از صحت پکیج اطمینان پیدا کند.

تفاوت دستور های npm و Yarn

Yarn علاوه بر مزایایی که توضیح دادیم، دستورات جدیدی نیز دارد. در این قسمت می خواهیم این تفاوت ها را به شما نشان دهیم.

1. نصب

دستور npm install وابستگی ها را از package.json نصب می کند اما دستور yarn (معادل  npm install) وابستگی ها را از yarn.lock نصب می کند.

2. دستور yarn why

اگر می خواهید بدانید که چرا فلان پکیج هم برای شما نصب شده است می توانید دستور yarn why را اجرا کنید.

3. اضافه کردن پکیج ها

دستور <yarn add <package به شما اجازه نصب وابستگی ها را می دهد و معادل دستور <npm install <package است اما تفاوت آنجاست که <yarn add <package در فایل package.json رفرنس (reference) هایی را نیز ذخیره می کند.

4. لایسنس (گواهی استفاده)

دستور Licenses تمام گواهی های پکیج های شما را برایتان نمایش می دهد. همچنین دستور yarn licenses generate-disclaimer اخطاری را برای محتوای گواهی هایتان می سازد که در برخی موارد استفاده می شود. چنین قابلیتی هنوز در npm موجود نیست.

5. ارتقا و به روز رسانی

دستور npm update معادل [yarn upgrade [package است و هر دو پکیج هایتان را از طریق فایل yarn.lock به روز رسانی می کنند. همچنین هر تگ مربوطه ای را که در package.json باشد به روز رسانی می کند.

6. دستور yarn generate-lock-entry

اگر بخواهید بر اساس وابستگی های موجود در package.json یک فایل yarn.lock را به صورت دستی ایجاد کنید باید از دستور yarn generate-lock-entry استفاده کنید. این دستور معادل دستور npm shrinkwrap است اما باید حواستان باشد چرا که فایل yarn.lock با هر بار اضافه شدن یا به روز رسانی وابستگی ها (از طریق دستور های yarn add و yarn upgrade) بازنویسی می شود.

این ها مهم ترین تفاوت در دستورات npm و Yarn بود اما اگر می خواهید لیست کاملی از تفاوت دستورات این دو داشته باشید به صفحه Infinite Red مراجعه کنید.

پیشرفت های npm در نسخه 5.0

  • Versioning (نسخه‌بندی): در این نسخه فایل package-lock.json اضافه شد و npm-shrinkwrap نیز دور انداخته شد. این مسئله مشکلات ناشی از تغییرات وابستگی ها بر اساس نسخه را در فرآیند نصب کنترل می کند.
  • سرعت بالا: npm 5 نسبت به نسخه های قبلی خود سرعت بالاتری را ارائه می دهد اما همانطور که بالاتر گفتیم هنوز هم به پای Yarn نمی رسد.
  • ذخیره به صورت پیش فرض: در نسخه های قبلی کاربران در هنگام نصب پکیج های جدید مجبور به استفاده از save-- بودند اما در نسخه جدید این کار به صورت پیش فرض انجام می شود.

کدام یک قابل اعتماد تر است؟ Yarn یا npm?

در ابتدا و هنگام معرفی Yarn گزارشاتی مبنی بر مشکلات عملکرد Yarn ارائه شد اما به سرعت تصحیح شدند. از آنجا که Yarn توسط کمپانی های بسیار بزرگ تکنولوژی پشتیبانی می شود، مشکلات آن نیز به سرعت گزارش و رفع خواهند شد. اگر از Yarn استفاده می کنید و دچار مشکل شدید می توانید سریعا و بدون زحمت خاصی به npm برگردید.

با اینکه Yarn نسخه ارتقاء یافته npm است اما هنوز هم مشکلات خودش را دارد. به طور مثال استفاده همزمان از npm و Yarn ممکن است مشکلاتی را ایجاد کند، به همین دلیل پیشنهاد می شود npm و Yarn را طوری تنظیم کنید که هر دو از یک رجیستری استفاده نکنند. همچنین Yarn باعث افزایش حجم اشغالی فضای سیستم شما می شود چرا که وابستگی ها را به صورت محلی ذخیره می کند.

از آنجا که Yarn نسبت به npm جوان تر است، برخی از افراد نسبت به آن شک دارند. باگ های اولیه Yarn نیز ممکن است خاطره بدی را برای توسعه دهندگان به جا گذاشته باشد اما به جرات می توان گفت که Yarn نسبت به 12 ماه گذشته بسیار بهتر شده و در مکان خوبی قرار دارد.

با این همه Yarn در حال پیشی گرفتن از npm است چرا که توسعه دهندگان متوجه مزایای آن مانند پردازش سریع تر و امنیت بیش تر شده اند. در حال حاضر Yarn در GitHub توانسته است 30,000 ستاره کسب کند.

تعداد ستاره های Yarn در GitHub
تعداد ستاره های Yarn در GitHub
تعداد ستاره های npm در GitHub
تعداد ستاره های npm در GitHub

گزینه های دیگر چیست؟

Yarn تنها جایگزین npm نیست. برخی از توسعه دهندگان می گویند pnpm از هر دوی آن ها بهتر است! یکی از بنچ مارک های Intoli نشان می دهد که pnpm از Yarn و npm سریع تر است. همچنین به اندازه Yarn فضای دیسک را اشغال نمی کند بلکه از hardlink و symlink استفاده می کند. البته این روش مشکلات خودش را دارد و به دلیل همین مشکلات است که Yarn از آن استفاده نمی کند.


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

نویسنده شوید
دیدگاه‌های شما

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