yarn — یک مدیر بسته جایگزین برای Node.js است که توسط Facebook با همکاری Exponent، Google و Tilde در سال 2016 ایجاد شد. yarn مشکلات سرعت و امنیت npm 2-4 را حل میکرد: نصب موازی، فایل قفل دقیق و کش آفلاین. امروزه yarn در React Native، Expo و مخازن چندگانه محبوبیت خود را حفظ کرده است. جزئیات بیشتر در yarn Documentation.
نکات اصلی
yarn (Yet Another Resource Negotiator) در اکتبر 2016 به عنوان پاسخی از جانب Facebook به مشکلات npm 2-4 منتشر شد: نصب کند، نبود فایل قفل و بستههای ناامن. yarn بارگیری موازی بستهها، yarn.lock قطعی و بررسی یکپارچگی از طریق جمعهای کنترلی را ارائه داد. در سال 2020 yarn به نسخه 2 (Berry) با رویکرد Plug'n'Play و TypeScript-first مهاجرت کرد.
معماری yarn با npm متفاوت است: yarn بستهها را به صورت موازی بارگیری میکند (npm تا نسخه 5 — به صورت ترتیبی)، هر بسته را در ~/.cache/yarn بدون تکرار بین پروژهها کش میکند و یکپارچگی را از طریق checksum بررسی میکند. yarn همیشه در هر نصب yarn.lock تولید میکند، در حالی که package-lock.json در npm فقط در نسخه 5 ظاهر شد.
از yarn 2 (Berry, 2020) به بعد، yarn به طور کامل در TypeScript بازنویسی شد و از Plug'n'Play، workspaces، constraints برای مخازن چندگانه و پروتکلهای نصب از منابع مختلف (npm، git، tarball) پشتیبانی میکند. yarn 3+ (2022) Zero-Installs را اضافه کرد — ذخیره کش در مخزن برای نصب فوری بدون شبکه.
yarn install — دستور اصلی که package.json و yarn.lock را میخواند و وابستگیها را نصب میکند. yarn بستهها را به صورت موازی بارگیری میکند که نصب را در مقایسه با npm 4 و نسخههای قدیمیتر 2-3 برابر سریعتر میکند. yarn از کش آفلاین استفاده میکند: اگر بسته قبلاً در پروژه دیگری دانلود شده باشد، از کش کپی میشود و دوباره دانلود نمیشود.
# دستورات اصلی yarn
$ yarn install
$ yarn add react-native-webview
$ yarn add --dev typescript
$ yarn global add expo-cli
# بهروزرسانی تعاملی
$ yarn upgrade-interactive
# حذف بستههای تکراری
$ yarn dedupe
yarn add — دستور نصب یک بسته جدید. yarn add <package> به dependencies اضافه میکند، yarn add --dev — به devDependencies. yarn به طور خودکار yarn.lock را بهروزرسانی میکند. yarn upgrade بستهها را به آخرین نسخهها در محدوده معنایی بهروزرسانی میکند. yarn upgrade-interactive — حالت تعاملی انتخاب بستههای خاص برای بهروزرسانی.
yarn cache — کش سراسری در ~/.cache/yarn/v6. هر بسته یک بار در آرشیو ZIP با جمع کنترلی ذخیره میشود. yarn cache به طور خودکار پاک میشود، اما میتوان yarn cache clean را دستی اجرا کرد. yarn cache dir مسیر کش را نشان میدهد. yarn cache list — لیست بستههای کش شده.
yarn.lock — فایل تثبیت نسخههای دقیق تمام وابستگیها و بستههای گذرای آنها. برخلاف package-lock.json (JSON)، yarn.lock از فرمت YAML با ساختار مسطح استفاده میکند. yarn.lock همیشه به طور خودکار در yarn install یا yarn add تولید میشود — این تضمین میکند که همه توسعهدهندگان و سرورهای CI مجموعه یکسانی از بستهها را دریافت کنند.
# نمونه ساختار yarn.lock
react@^18.3.0:
version: "18.3.1"
resolution: "react@npm:18.3.1"
dependencies:
loose-envify: "^1.1.0"
checksum: "abc123def456..."
react-native@^0.76.0:
version: "0.76.3"
resolution: "react-native@npm:0.76.3"
dependencies:
react: "18.3.1"
checksum: "def789ghi012..."
فیلدهای yarn.lock: version — نسخه دقیق بسته، resolution — منبع و نسخه، dependencies — وابستگیهای آن، checksum — جمع کنترلی برای تأیید. yarn.lock در مخزن commit میشود و تنها منبع حقیقت برای وابستگیها است. اگر yarn.lock و package.json مطابقت نداشته باشند، yarn هشدار میدهد.
Yarn constraints — سیستم قوانین برای مخازن چندگانه که نسخههای وابستگیها را در yarn.lock بررسی و اعمال میکند. محدودیتها در فایل yarn.constraints.js به زبان Yarn Constraint Language توصیف میشوند. Constraints تضمین میکنند که همه بستهها در مخزن چندگانه از همان نسخه React یا TypeScript استفاده میکنند.
React Native به طور سنتی با yarn مرتبط است. Expo CLI، React Native CLI و Create React Native App در ابتدا از yarn استفاده میکردند. در پروژههای React Native، yarn.lock نسخههای ماژولهای بومی را تثبیت میکند که برای کامپایل پایدار از طریق CocoaPods (iOS) و Gradle (Android) حیاتی است. yarn workspaces در مخازن چندگانه React Native با کد مشترک محبوب هستند.
yarn workspaces در مخازن چندگانه React Native: package.json ریشه حاوی "workspaces": ["packages/*", "mobile"] است. yarn install یک پوشه node_modules واحد در سطح ریشه ایجاد میکند. بستهها از طریق symlink به یکدیگر اشاره میکنند. npx pod-install پس از تغییر وابستگیهای بومی برای بهروزرسانی CocoaPods اجرا میشود.
{
"private": true,
"workspaces": [
"packages/*",
"apps/mobile",
"apps/web"
],
"scripts": {
"mobile:start": "yarn workspace mobile start",
"mobile:ios": "yarn workspace mobile ios",
"lint": "yarn workspaces run lint"
}
}
Expo SDK 50+ به طور رسمی yarn را برای پروژههای جدید ایجاد شده از طریق npx create-expo-app توصیه میکند. yarn سازگاری با ماژولهای Expo را تضمین میکند و به طور خودکار yarn.lock صحیح تولید میکند. Zero-Installs در yarn 3+ اجازه میدهد کش در مخزن commit شود — توسعهدهندگان محیط آماده را بدون نصب وابستگیها پس از git clone دریافت میکنند.
npm و yarn یک کار را حل میکنند — مدیریت بستههای Node.js. با انتشار npm 5-7 شکاف عملکردی عملاً از بین رفت. npm 7+ شامل workspaces، npm ci (معادل yarn install --frozen-lockfile) و نصب موازی است. با این حال، yarn در سناریوهای خاص مزایایی را حفظ میکند: Plug'n'Play، Zero-Installs و سیستم constraints بالغ.
| ویژگی | npm | yarn |
|---|---|---|
| سال ایجاد | 2010 | 2016 |
| فایل قفل | package-lock.json (JSON) | yarn.lock (YAML) |
| نصب | ترتیبی (npm 5+) | موازی |
| Plug'n'Play | خیر | بله (yarn 2+) |
| Workspaces | بله (npm 7+) | بله |
| Zero-Installs | خیر | بله (yarn 3+) |
| کش | node_modules با flattening | سراسری ~/.cache/yarn |
| زبان پیادهسازی | JavaScript | TypeScript (yarn 2+) |
چه زمانی yarn را انتخاب کنیم: پروژههای Expo SDK 50+، مخازن چندگانه بزرگ (100+ بسته)، تیمهایی که برای راهاندازی سریع محیط به Zero-Installs اهمیت میدهند و پروژههای قدیمی که از yarn استفاده میکنند. چه زمانی npm را انتخاب کنیم: پروژههای استاندارد create-react-app، Next.js، Vite، تیمهایی بدون نیازهای خاص به مدیر بسته.
yarn 4 (2024) عملکرد بهبودیافته، پشتیبانی بومی ESM و بهینهسازی برای مخازن چندگانه بزرگ را معرفی کرد. npm 10+ با تمرکز بر امنیت و سازگاری به رشد خود ادامه میدهد. انتخاب بین npm و yarn امروز مسئله ترجیحات تیمی و نیازهای خاص پروژه است، نه برتری فنی یک ابزار.
سوالات متداول
yarn در ابتدا از npm در سرعت به دلیل نصب موازی بستهها و کشکردن تهاجمی پیشی گرفت. yarn.lock به طور خودکار در هر نصب تولید میشود، در حالی که package-lock.json در npm 5 ظاهر شد. yarn Plug'n'Play را ارائه میدهد — جایگزینی برای node_modules با زمان نصب صفر. از npm 7+ به بعد، تفاوت سرعت و عملکرد برای سناریوهای پایه حداقل است.
yarn workspaces — مکانیزم مدیریت چندین بسته در یک مخزن. package.json ریشه حاوی فیلد "workspaces": ["packages/*"] است. yarn install وابستگیهای مشترک را در سطح بالایی در یک node_modules واحد نصب میکند، بین بستههای محلی symlink ایجاد میکند و از تکرار جلوگیری میکند. دستورات برای همه workspaceها از طریق yarn workspaces run <script> اجرا میشوند.
Plug'n'Play (PnP) — جایگزینی برای پوشه سنتی node_modules که در yarn 2 معرفی شد. به جای کپی فایلها، yarn نقشه وابستگیها را در .pnp.cjs ایجاد میکند و بستهها را در آرشیوهای ZIP در کش سراسری ذخیره میکند. مزایای PnP: نصب در چند ثانیه، کاهش زمان راهاندازی Node.js به میزان 30-50٪، عدم وجود node_modules و مشکلات مسیری مرتبط با آن.
yarn را به صورت سراسری نصب کنید: npm install -g yarn. در ریشه پروژه yarn import را اجرا کنید — yarn package-lock.json را میخواند و yarn.lock معادل ایجاد میکند. node_modules و package-lock.json را حذف کنید، برای بررسی yarn install را اجرا کنید. پیکربندی CI/CD را با جایگزینی npm با yarn بهروزرسانی کنید. yarn کاملاً با package.json سازگار است.
خطای "Integrity check failed" در صورت عدم تطابق yarn.lock و node_modules رخ میدهد. راهحل: node_modules، yarn.lock را حذف کرده و کش را پاک کنید (yarn cache clean)، سپس yarn install را دوباره اجرا کنید. برای تعارض نسخهها از yarn upgrade-interactive برای انتخاب بهروزرسانیهای خاص استفاده کنید. yarn dedupe بستههای تکراری را حذف میکند.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.