yarn — مدير حزم بديل لـ Node.js، تم إنشاؤه بواسطة Facebook بالتعاون مع Exponent و Google و Tilde في عام 2016. حل yarn مشاكل السرعة والأمان في npm 2-4: التثبيت المتوازي، ملف lock صارم وذاكرة تخزين مؤقت غير متصلة. اليوم لا يزال yarn يحظى بشعبية في React Native و Expo والمستودعات الأحادية. تعرف على المزيد في yarn Documentation.
النقاط الرئيسية
yarn (Yet Another Resource Negotiator) تم إصداره في أكتوبر 2016 كاستجابة من Facebook لمشاكل npm 2-4: التثبيت البطيء، عدم وجود ملف lock والحزم غير الآمنة. قدم yarn تنزيل الحزم المتوازي، yarn.lock القطعي والتحقق من التكامل من خلال المجاميع الاختبارية. في عام 2020 انتقل yarn إلى الإصدار 2 (Berry) مع Plug'n'Play ونهج TypeScript-first.
هندسة yarn تختلف عن npm: يقوم yarn بتنزيل الحزم بشكل متوازي (npm قبل الإصدار 5 — بشكل تسلسلي)، يخزن كل حزمة في ~/.cache/yarn بدون تكرار بين المشاريع ويتحقق من التكامل عبر المجاميع الاختبارية. يقوم 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 بتنزيل الحزم بشكل متوازي، مما يسرع التثبيت بمقدار 2-3 مرات مقارنة بـ npm 4 والإصدارات الأقدم. يستخدم 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 تلقائياً، ولكن يمكنك تنفيذ yarn cache clean يدوياً. yarn cache dir يعرض مسار ذاكرة التخزين المؤقت. yarn cache list — يعرض قائمة الحزم المخزنة مؤقتاً.
yarn.lock — ملف 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 في المستودع وهو مصدر الحقيقة الوحيد للتبعيات. إذا اختلف yarn.lock و package.json، يصدر yarn تحذيراً.
Yarn constraints — نظام قواعد للمستودعات الأحادية يتحقق ويفرض إصدارات التبعيات في yarn.lock. يتم وصف القيود في ملف yarn.constraints.js باستخدام لغة قيود Yarn. تسمح لك 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 واحد على المستوى الجذر. تشير الحزم إلى بعضها البعض عبر الروابط الرمزية. يتم تنفيذ 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+ يسمح بإيداع ذاكرة التخزين المؤقت في المستودع — يحصل المطورون على بيئة جاهزة للاستخدام دون تثبيت التبعيات بعد 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 |
| ملف lock | package-lock.json (JSON) | yarn.lock (YAML) |
| التثبيت | تسلسلي (npm 5+) | متوازي |
| Plug'n'Play | لا | نعم (yarn 2+) |
| Workspaces | نعم (npm 7+) | نعم |
| Zero-Installs | لا | نعم (yarn 3+) |
| ذاكرة التخزين المؤقت | node_modules مع تسطيح | عالمية ~/.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 واحد، وينشئ روابط رمزية بين الحزم المحلية ويتجنب التكرار. يتم تشغيل الأوامر لجميع workspaces عبر 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 تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.