
هناك ثلاثة لاعبين رئيسيين في مساحة مدير الحزم:
npm
Yarn
High-Performance npm (pnpm)
لدينا بالفعل وظائف مماثلة بشكل أساسي يتم تنفيذها في جميع مديري الحزم، لذلك من المرجح أن تقرر أي منها ستستخدمه بناءً على المتطلبات غير الوظيفية مدير الحزم ، مثل سرعة التثبيت أو استهلاك التخزين أو التطبيق العملي.
بالطبع، الطريقة التي تختارها لاستخدام كل مدير حزم ستكون مختلفة، لكن جميعها لديها مفاهيم متسقة بشكل أساسي. يمكن لجميع مديري الحزم المذكورة أعلاه تنفيذ الأوامر التالية:
ومع ذلك، على الرغم من ذلك، يختلف مديرو الحزم تحت الغطاء. تقليديًا، يقوم npm و Yarn بتثبيت التبعيات في مجلدNode_modules المسطح. (انتبه إلى الترتيب هنا، يتم تجانب yarn أولاً، وكان npm متكررًا من قبل). لكن التبليط يمكن أن يسبب أيضًا سلسلة من مشكلات السلامة.
عدم اليقين هيكل الاعتماد.
- لا يزال من الممكن الوصول إلى
خوارزمية التسطيح نفسها معقدة للغاية وتستغرق وقتًا طويلاً.
الحزم ذات التبعيات المعلنة
بشكل غير قانوني في المشروع،
لذلك، قدم pnpm بعض المفاهيم الجديدة في مجلد node_modules لتخزين التبعيات بشكل أكثر كفاءة. يذهب Yarn Berry إلى أبعد من ذلك من خلال التخلي عن وضع (PnP) node_modules بالكامل (المزيد حول هذا في مقال آخر).
أول مدير حزم تم إصداره كان npm ، في يناير 2010. لقد أسس المبادئ الأساسية لكيفية عمل مديري الحزم اليوم. ولكن بما أن npm موجود منذ أكثر من 10 سنوات، فلماذا يوجد أي خيار آخر؟ فيما يلي بعض الأسباب الرئيسية وراء حدوث ذلك:
node_modules على خوارزميات مختلفة لتحليل التبعية (متداخلة ومتجانبة، و node_modules مقابل وضع PnP)hoisting ).locking مختلفة (أداء مختلف، مثل الأداء المكتوب بواسطة yarn نفسه)workspaces ) مما يؤثر على قابلية الصيانة وسرعة monoreposدعنا نتعمق في تاريخ كيفية تحديد هذه الجوانب بعد ظهور npm ، وكيف قامت Yarn Classic بحل بعض هذه المشكلات، وكيف وسعت pnpm هذه المفاهيم، وكيف قام Yarn Berry ، بصفته خليفة Yarn Classic بكسر هذه المفاهيم والعمليات التقليدية.
npm هو منشئ مديري الحزم. يعتقد الكثير من الناس خطأً أن npm هو اختصار لـ "Node package manager"، لكن هذا ليس هو الحال.
شكل إصداره ثورة لأنه في السابق، كان يتم تنزيل تبعيات المشروع وإدارتها يدويًا. قدمت npm أشياء مثل الملفات وحقول البيانات الوصفية الخاصة بها، وتخزين التبعيات في node_modules ، والبرامج النصية المخصصة، والحزم العامة والخاصة، والمزيد.
في عام 2020، استحوذت GitHub على npm، لذلك من حيث المبدأ تتم إدارة npm الآن بواسطة Microsoft. وفي وقت كتابة هذا التقرير، كان الإصدار الرئيسي الأخير هو v8، وتم إصداره في أكتوبر 2021.
في أكتوبر 2016، أعلن فيسبوك عن شراكة مع Google وعدد من الشركات الأخرى لتطوير مدير حزم جديد (engineering.fb.com/2016/10/11/…) لمعالجة الاتساق الحالي لـ npm ، قضايا الأمن والأداء. أطلقوا على الغزل البديل اسمًا.
على الرغم من أن Yarn لا يزال يتم تصميمه وتصميمه استنادًا إلى العديد من مفاهيم وعمليات npm ، إلا أن Yarn كان له تأثير كبير على مجال إدارة الحزم. مقارنةً بـ npm ، يقوم Yarn بموازاة العمليات لتسريع عملية التثبيت، والتي كانت نقطة ضعف رئيسية في الإصدارات السابقة من npm .
وضع Yarn معايير أعلى للقراءة والكتابة والأمان والأداء، واخترع العديد من المفاهيم (أدخلت npm أيضًا العديد من التحسينات لهذا الغرض)، بما في ذلك:
monorepoLocking )Yarn v1 في الدخول إلى وضع الصيانة في 2020. منذ ذلك الحين، أصبحت سلسلة v1.x تعتبر قديمة وتمت إعادة تسميتها باسم Yarn Classic . أصبح خليفته Yarn v2 (Berry) الآن فرع التطوير الأكثر نشاطًا.
تم إصدار الإصدار 1 pnpm
pnpm الأكثر كفاءةإنه بديل لـ npm ، لذلك إذا كان لديك مشروع npm ، فيمكنك استخدام pnpm على الفور!
السبب الرئيسي وراء إنشاء pnpm هو أن npm و Yarn زائدان عن الحاجة من حيث هياكل تخزين التبعية المستخدمة عبر المشاريع. على الرغم من أن Yarn Classic يتمتع بميزة السرعة مقارنة بـ npm ، إلا أنه يستخدم نفس طريقة حل التبعية التي لا يستخدمها pnpm : يستخدم npm و Yarn Classic hoisting لتسوية node_modules الخاصة بهم
بدلاً من تحسين البنية السابقة، يقدم pnpm استراتيجية أخرى لحل التبعيات مقترحة: أ هيكل التخزين الموجه للمحتوى. يعتمد المجلد node_modules الذي تم إنشاؤه بهذه الطريقة فعليًا على الدليل ~/.pnpm-store/ المُخزن عالميًا في المجلد الرئيسي. يتم تخزين كل إصدار من التبعيات فعليًا مرة واحدة في مجلد الدليل هذا، مما يشكل عنوان مصدر واحدًا لتوفير مساحة كبيرة على القرص.
بنية node_modules هي بنية متداخلة من التبعيات التي تم إنشاؤها باستخدام symlinks (حيث يتم تخزين كل ملف/حزمة داخل المجلد من خلال رابط ثابت). يوضح الشكل التالي من الوثائق الرسمية ذلك. (الصور المراد ملؤها: الروابط الناعمة والصلبة)

يظهر تأثير pnpm في تقرير 2021: نظرًا لابتكاراتهم في مجال التخزين المعنون بالمحتوى، يتطلع المنافسون إلى اعتماد مفاهيم pnpm ، مثل بنية الروابط الرمزية والإدارة الفعالة للقرص للحزم.
Yarn 2 تم إصداره في يناير 2020 وتم وصفه كترقية رئيسية لـ Yarn الأصلي. يطلق عليه فريق Yarn اسم Yarn Berry لتوضيح أنه في الأساس مدير حزم جديد بقاعدة تعليمات برمجية جديدة ومبادئ جديدة.
الابتكار الرئيسي لـ Yarn Berry هو أسلوب التوصيل والتشغيل (PnP) كاستراتيجية لإصلاح وحدات العقدة. بدلاً من استراتيجية إنشاء node_modules ، قم بإنشاء ملف .pnp.cjs باستخدام جدول البحث عن التبعيات، مما يسمح بمعالجة التبعيات بشكل أكثر كفاءة نظرًا لأنه ملف واحد وليس بنية مجلد متداخلة. بالإضافة إلى ذلك، يتم تخزين كل حزمة في مجلد على شكل ملف مضغوط بدلاً من .yarn/cache/ ، وتشغل مساحة أقل على القرص من node_modules .
كل هذه التغييرات حدثت بسرعة كبيرة لدرجة أنها أثارت الكثير من الجدل بعد إطلاقها. تتطلب مثل هذه التغييرات العاجلة في PnP من المشرفين تحديث الحزم الموجودة لديهم لتكون متوافقة معها. لم يكن استخدام نهج PnP الجديد افتراضيًا والعودة إلى node_modules أمرًا سهلاً في البداية، مما أدى إلى عدم تفكير العديد من المطورين المعروفين في ذلك وانتقاد Yarn 2 علنًا.
منذ ذلك الحين، عالج فريق Yarn Berry العديد من المشكلات في إصداراته اللاحقة. لحل مشكلات عدم توافق PnP، قدم الفريق طريقة لتغيير وضع التشغيل الافتراضي بسهولة. بمساعدة المكوّن الإضافيNode_modules، لا يتطلب التبديل مرة أخرى إلى النهج التقليدي node_modules سوى سطرًا واحدًا من التكوين.
بالإضافة إلى ذلك، قدم نظام JavaScript البيئي دعمًا متزايدًا لـ PnP بمرور الوقت، وكما ترون في جدول التوافق هذا، بدأت بعض المشاريع الكبيرة في اعتماد Yarn Berry .
على الرغم من أن Yarn Berry لا يزال صغيرًا، إلا أنه يحدث بالفعل تأثيرًا على مساحة مدير الحزم - اعتمد pnpm نهج PnP في أواخر عام 2020.
يجب أولاً تثبيت مدير الحزم على الأنظمة المحلية وأنظمة CI/CD الخاصة بكل مطور.
npm مع Node.js ، لذلك لا يلزم اتخاذ خطوات إضافية. بالإضافة إلى تنزيل مثبت Node.js لنظام التشغيل الخاص بك، فقد أصبح من الممارسات الشائعة استخدام أدوات CLI لإدارة إصدارات البرامج. في سياق Node، أصبح Node Version Manager (nvm) أو Volta أداة مساعدة مريحة للغاية.
يمكنك تثبيت Yarn 1 بطرق مختلفة، على سبيل المثال، كحزمة npm : .$ npm i -g yarn
للترحيل من Yarn Classic إلى Yarn Berry، الطريقة الموصى بها هي:
تثبيت Yarn Classic أو تحديثه إلى
إصدار
واستخدم
إصدار مجموعة الغزل berry،
ومع ذلك، فإن الطريقة الموصى بها لتثبيت Yarn Berry هنا هي من خلال Corepack.
تم إنشاء Corepack من قبل مطوري Yarn Berry. كانت المبادرة في الأصل تسمى مدير الحزم (pmm) وتم دمجها مع Node في LTS v16.
بمساعدة Corepack، يعد Node مدير حزم بديل لـ npm ولا يتعين عليك تثبيته "بشكل منفصل" لأنه يتضمن ثنائيات Yarn Classic و Yarn Berry و pnpm . تسمح هذه الحشوات للمستخدمين بتشغيل أوامر Yarn وpnpm دون تثبيتها بشكل صريح أولاً ودون العبث بتوزيع Node.
يأتي Corepack مثبتًا مسبقًا مع Node.js ≥ v16.9.0. ومع ذلك، بالنسبة لإصدارات Node الأقدم، يمكنك استخدام ⬇️
npm install -g corepack
لتمكين Corepack قبل استخدامه. يوضح هذا المثال كيفية تفعيله في Yarn Berry v3.1.1.
#يجب عليك الاشتراك أولاً تمكين الحزمة الأساسية $ # تم تثبيت الرقائق ولكن النسخة الملموسة تحتاج إلى التنشيط $ corepack تحضير الغزل@3.1.1 --activate
يمكنك تثبيت pnpm كحزمة npm : $ npm i -g pnpm . يمكنك أيضًا تثبيت pnpm باستخدام Corepack:
$ corepack تحضير [email protected] - تنشيط
في هذا القسم، ستشاهد في لمحة سريعة الميزات الرئيسية لمديري الحزم المختلفين. يمكنك بسهولة اكتشاف الملفات المشاركة في تكوين مدير حزم معين والملفات التي يتم إنشاؤها من خلال خطوة التثبيت.
يقوم جميع مديري الحزم بتخزين جميع المعلومات الوصفية المهمة في ملف بيان المشروع package.json. بالإضافة إلى ذلك، يمكن استخدام ملفات التكوين على مستوى الجذر لإعداد حزم خاصة مختلفة أو تكوينات مختلفة لتحليل التبعية.
أثناء خطوة التثبيت، يتم تخزين dependencies في بنية ملف مثل node_modules ويتم إنشاء ملف locking . لا يأخذ هذا القسم في الاعتبار إعدادات مساحة العمل، لذا فإن جميع الأمثلة تظهر فقط موقعًا واحدًا يتم فيه تخزين التبعيات.
باستخدام $ npm install أو $ npm i الأقصر، سأقوم بإنشاء ملف package-lock.json ومجلد node_modules . هناك أيضًا ملفات قابلة للتكوين مثل .npmrc والتي يمكن وضعها في دليل مستوى الجذر. راجع القسم التالي لمزيد من المعلومات حول locking الملفات.
. ├── العقدة_modules/ ├── .npmrc ├── package-lock.json └──
الذي يقوم بتشغيل $ yarn سوف ينشئ ملف yarn.lock ومجلد node_modules . يمكن أن تكون ملفات .yarnrc أيضًا خيارات تكوين، ويدعم Yarn Classic أيضًا ملفات .npmrc . وبدلاً من ذلك، يمكنك استخدام مجلد ذاكرة التخزين المؤقت .yarn/cache/ وأحدث إصدار Yarn Classic المخزن محليًا في .yarn/releases/ .
. ├── .غزل/ │ ├── ذاكرة التخزين المؤقت/ │ └── الإصدارات / │ └── غزل-1.22.17.cjs ├── العقدة_modules/ ├── .yarnrc ├── package.json └── الغزل.لوك
بسبب وضع التثبيت الخاص هذا، يجب عليك التعامل مع المزيد من الملفات والمجلدات في مشروع Yarn Berry الخاص بك أكثر من مديري الحزم الآخرين. بعضها اختياري وبعضها إلزامي.
لم يعد Yarn Berry يدعم .npmrc أو .yarnrc ؛ فهو يتطلب .yarnrc.yml. بالنسبة لسير العمل التقليدي لإنشاء مجلدات node_modules ، يجب عليك توفير تكوين nodeLinker لاستخدام node_modules أو تكوين pnpm (لا أفهم هذا الجزء).
# .yarnrc.yml عقدة رابط: عقدة وحدات # أو pnpm
تشغيل $ yarn سوف تثبيت كافة التبعيات في مجلد node_modules . ويتم إنشاء ملف yarn.lock ، وهو ملف أحدث ولكنه غير متوافق مع Yarn Classic . بالإضافة إلى ذلك، يتم إنشاء مجلد .yarn/cache/ للتثبيت دون اتصال بالإنترنت. هذا المجلد اختياري ويستخدم لتخزين إصدار Yarn Berry الذي يستخدمه المشروع.
. ├── .غزل/ │ ├── ذاكرة التخزين المؤقت/ │ └── الإصدارات / │ └── غزل-3.1.1.cjs ├── العقدة_modules/ ├── .yarnrc.yml ├── package.json └──
سواء كان الوضع الصارم أو الوضع غير المحكم لـ PnP، فإن تنفيذ $ yarn باستخدام .pnp.cjs و yarn.lock سيؤدي إلى إنشاء .yarn/cache/ و .yarn/unplugged . PnP الصارم هو الوضع الافتراضي إذا كنت تريد تكوين الوضع غير المقيد، فأنت بحاجة إلى تمكينه بالشكل التالي⬇️:
# .yarnrc.yml. رابط العقدة: pnp pnpMode: فضفاض
في مشروع PnP، بالإضافة إلى مجلد releases ، من المحتمل أن يحتوي المجلد .yarn أيضًا على مجلد sdk/ الذي يوفر دعم IDE. اعتمادًا على حالة الاستخدام الخاصة بك، يمكن أن يحتوي .yarn على المزيد من المجلدات.
. ├── .غزل/ │ ├── ذاكرة التخزين المؤقت/ │ ├── الإصدارات / │ │ └── غزل-3.1.1.cjs │ ├── سك/ │ └── موصول / ├── .pnp.cjs ├── .pnp.loader.mjs ├── .yarnrc.yml ├── package.json └── Yarn.lock`الحالة الأولية لـ
هي نفس حالة npm أو مشروع Yarn Classic pnpm يتطلب أيضًا ملف package.json . بعد تثبيت التبعيات باستخدام $ pnpm i ينتج عنه مجلد node_modules ، لكن هيكله مختلف تمامًا نظرًا لأن محتوياته عبارة عن مساحة تخزين قابلة للعنونة.
يقوم pnpm أيضًا بإنشاء ملف القفل الخاص به pnp-lock.yml . يمكنك توفير تكوين إضافي باستخدام ملف .npmrc الاختياري.
. ├── العقدة_modules/ │ └── .pnpm/ ├── .npmrc ├── package.json └── ملف القفل pnpm-lock.yml
كما ذكرنا في القسم السابق، يقوم كل مدير حزم بإنشاء ملفات قفل.
يخزن ملف lock الإصدار الدقيق لكل تبعية مثبتة بواسطة مشروعك، مما يسمح بتثبيت أكثر تحديدًا وقابلية للتنبؤ. يعتبر ملف lock هذا مهمًا لأنه من المحتمل أن يتم الإعلان عن الإصدارات التابعة بنطاق إصدار (على سبيل المثال، ≥ v1.2.5) وإذا لم تقم "بقفل" الإصدار الخاص بك، فقد يكون الإصدار الفعلي المثبت مختلفًا.
أحيانًا تقوم ملفات القفل أيضًا بتخزين المجاميع الاختبارية (تجزئة على ما أذكر)، والتي سنغطيها بمزيد من التعمق في قسم الأمان.
بدءًا من npm v5+، كان قفل الملفات دائمًا هو الوظيفة الرئيسية لـ npm ( package-lock.json ). في pnpm ، يظهر pnpm-lock.yaml yarn.lock Yarn Berry بتنسيق YAML الجديد.
في القسم السابق، رأينا الطريقة التقليدية لتثبيت التبعيات في بنية المجلدات node_modules . هذا هو الحل الذي تستخدمه npm و Yarn Classic و pnpm ( pnpm أكثر كفاءة من الحلول الأخرى).
يقوم Yarn Berry بالأشياء بشكل مختلف في وضع PnP. بدلاً من المجلد node_modules ، يتم تخزين التبعيات في ملفات مضغوطة كمجموعة من ملفات .yarn/cache/ و .pnp.cjs .
من الأفضل وضع ملفات القفل هذه تحت التحكم في الإصدار، نظرًا لأن كل عضو في الفريق يقوم بتثبيت نفس الإصدار، لذلك فهو يحل مشكلة "يعمل على جهازك وعلى جهازي".
يقارن الجدول التالي أوامر CLI المختلفة المتوفرة في npm و Yarn Classic و Yarn Berry و pnpm . هذه ليست قائمة كاملة بأي حال من الأحوال، بل هي ورقة غش. لا يغطي هذا القسم الأوامر المتعلقة بسير العمل.
يحتوي npm و pnpm على العديد من الأسماء المستعارة للأوامر والخيارات، مما يعني أن الأوامر يمكن أن يكون لها أسماء مختلفة، على سبيل المثال $ npm install مقابل $ npm add . بالإضافة إلى ذلك، تحتوي العديد من خيارات الأوامر على إصدارات مختصرة، مثل -D بدلاً من --save-dev . في الجدول، أقوم بتسمية جميع الإصدارات المختصرة بأسماء مستعارة. باستخدام كل من مديري الحزم هؤلاء، يمكنك إضافة تبعيات متعددة أو تحديثها أو إزالتها.
يغطي هذا الجدول أوامر إدارة التبعيات المستخدمة لتثبيت أو تحديث جميع التبعيات المحددة في package.json .
| Action | npm | Yarn Classic | Yarn Berry | pnpm | |
|---|---|---|---|---|---|
| install deps في package.json | npm install alias: i، أضف | تثبيت الغزل أو غزل | مثل | الاسم المستعار لتثبيت pnpm الكلاسيكي: أقوم | |
| بتحديث deps في package.json acc | الاسم المستعار لتحديث الغزل: up، قم بترقية | غزل | الترقية | semver up (عبر البرنامج المساعد) | الاسم المستعار لتحديث pnpm: |
| تحديث deps في package.json إلى أحدث | ترقيةلغزل | N/A | - | أحدث تحديث لـ pnpm - أحدث اسم مستعار: | |
| -L | update | deps | acc | semver up رد فعل | pnpm up رد فعل |
| تحديث deps إلى آخر | تحديث npm رد فعل @ أحدث | ترقية غزل رد فعل - أحدث | غزل لأعلى تفاعل | pnpm up -L رد فعل | |
| تحديث deps بشكل تفاعلي | N / A | ترقية غزل تفاعلية | ترقية غزل تفاعلية (عبر البرنامج المساعد) | $ pnpm up - الاسم المستعار التفاعلي: -أضيف | |
| وقت التشغيل deps | npm أنا أتفاعل | مع الغزل أضف رد فعل | مثل Classic | pnpm أضف رد فعل | |
| أضف dev deps | npm i -D babel alias: --save-dev | غزل add -D babel alias: --dev | مثل Classic | pnpm add -D الاسم المستعار بابل: --save-dev | |
| إضافة deps إلى package.json بدون | الاسم المستعار npm i -E للرد: --save-exact | thread add -E رد الفعل المستعار: --تمامًا | مثل Classic | pnpm add -E رد الفعل المستعار: - -حفظ إلغاء | |
| التثبيت الدقيق deps والإزالة من package.json | npm إلغاء تثبيت رد الفعل المستعار: إزالة، rm، r، un، إلغاء ربط | الغزل إزالة التفاعل | مثل Classic | pnpm إزالة رد الفعل المستعار: rm، un، إلغاء تثبيت إلغاء | |
| تثبيت deps بدون تحديث الحزمة. json | npm uninstall --no-save | N/A | N/A | N/A |
يوضح المثال التالي كيفية إدارة الحزم أثناء التطوير. المصطلحات المستخدمة في الجدول:
- الحزمة: التبعية أو
- الثنائية الثنائية: أداة تنفيذ من
node_modules/.bin/أو.yarn/cache/(PnP)
من المهم أن نفهم أن Yarn Berry يسمح لنا فقط بالتنفيذ في package.json أو Expose الملفات الثنائية المحددة في bin/ file.
| الإجراء | npm | Yarn Classic | Yarn Berry | pnpm |
|---|---|---|---|---|
| تثبيت الحزم عالميًا | npm i -g ntl الاسم المستعار: --global | الغزل العالمي إضافة ntl | N/A (تمت إزالة العالمية) | إضافة pnpm --حزم |
| تحديث ntl عالميًا | تحديث npm -g ntl | غزل الترقية العالمية ntl | N / | تحديث pnpm - |
| إزالة ntl العالمية للحزم عالميًا | npm إلغاء التثبيت -g ntl | غزل عالمي إزالة ntl | N/A | pnpm إزالة - |
| تشغيل ntl عالمي للثنائيات من المحطة | npm exec ntl | غزل ntl | غزل ntl | pnpm ntl |
| تشغيل الثنائيات من البرنامج النصي | ntl | ntl | ntl | ntl |
| تنفيذ الحزمة الديناميكية | npx ntl | N/A | غزل dlx ntl | pnpm dlx ntl |
| إضافة وقت التشغيل deps | npm أنا رد فعل | غزل إضافة تفاعل | مثل Classic | pnpm إضافة رد فعل |
| إضافة dev deps | npm i -D babel alias: --save-dev | غزل add -D babel alias: - dev | مثل Classic | pnpm add -D babel alias: --save-dev |
| إضافة deps إلى package.json بدون semver | npm i -E رد الفعل المستعار: --حفظ | الغزل الدقيق إضافة -E رد الفعل المستعار: --تمامًا | مثل Classic | pnpm إضافة -E رد الفعل المستعار: - حفظ - إلغاء التثبيت الدقيق |
| deps وإزالة من package.json | npm إلغاء تثبيت الاسم المستعار للتفاعل: إزالة، rm، r، un، إلغاء ربط | الغزل إزالة التفاعل | مثل | pnpm الكلاسيكي إزالة الاسم المستعار للتفاعل: rm، un، إلغاء تثبيت | إلغاء
| التثبيت deps بدون تحديث package.json | npm uninstall --no-save | N/A | N/A | N/A |
يغطي هذا الجدول بعض الأوامر المضمنة المفيدة. إذا لم يكن هناك أمر رسمي، فيمكن عادةً استخدام أوامر الطرف الثالث من خلال حزم npm أو مكونات Yarn Berry الإضافية.
| الإجراء | npm | Yarn Classic | Yarn Berry | pnpm | |
|---|---|---|---|---|---|
| نشر | npm نشر | غزل نشر | غزل npm | نشر | |
| قائمة نشر pnpm تثبيت deps | npm ls الاسم المستعار: قائمة، la، ll | قائمة الغزل | الاسم المستعار لقائمة pnpm: | ||
| قائمة ls عفا عليها الزمن deps | npm غزل عفا عليه الزمن | ترقية | غزل عفا عليها | الزمن تفاعليةpnpm | |
| معلومات طباعة قديمة حول deps | npm شرح الاسم المستعار ntl: لماذا | الغزل لماذا ntl | مثل Classic | pnpm لماذا ntl | |
| init مشروع | npm init -y npm init (التفاعلي) الاسم المستعار: - -نعم | غزل init -y غزل init (تفاعلي) الاسم المستعار: --yes | غزل init | pnpm init -y pnpm init (تفاعلي) الاسم المستعار: --yes | |
| معلومات تراخيص الطباعة | N/A (عبر حزمة الطرف الثالث) | قائمة تراخيص الغزل | N/ A (أو عبر مكون إضافي، مكون إضافي آخر) | N/A (عبر حزمة طرف ثالث) | |
| تحديث إصدار مدير الحزم | N/A (باستخدام أدوات طرف ثالث، على سبيل المثال، nvm) | مع npm: إصدار مجموعة سياسات الغزل 1.13.0 | مع Corepack : إصدار مجموعة الغزل 3.1.1 | N/A (مع npm، Corepack) | |
| إجراء تدقيق أمني، | تدقيق npm، | تدقيق الغزل | ، تدقيق الغزل npm، تدقيق | pnpm، | |
| إضافة deps إلى package.json بدون | الاسم المستعار للتفاعل semver npm i -E: - | إضافة غزل | دقيق-E رد الفعل المستعار: --تمامًا | مثل Classic | pnpm add -E رد فعل الاسم المستعار: --save-exact |
| uninstall deps وإزالته من package.json | npm إلغاء تثبيت رد الفعل المستعار: إزالة، rm، r، un، إلغاء ربط | الغزل إزالة التفاعل | مثل Classic | pnpm إزالة الاسم المستعار للتفاعل: rm, un, uninstall | |
| uninstall deps w/o تحديث package.json | npm uninstall --no-save | N/A | N/A | N/A |
يتم تكوين مدير الحزم في ملف package.json وملفات التكوين المخصصة.
monorepo. تحدث معظم التكوينات في ملف التكوين الخاص .npmrc .
إذا كنت تريد استخدام ميزة workspaces npm ، فيجب عليك إضافة حقل البيانات التعريفية لمساحات العمل في package.json لإخبار npm بمكان العثور على مجلد المشروع الفرعي أو مساحة العمل.
// ...
"مساحات العمل": [
"الخطافات"،
"المنفعة"
]
} يمكن لكل مدير حزمة استخدام سجل npm العام. ربما تريد إعادة استخدامها دون نشرها في سجل عام. يمكنك تكوين هذا لجعل السجل خاصًا في ملف .npmrc الخاص بك. (جميعها لديها مصادر خاصة الآن)
# .npmrc @doppelmutzi:registry=https://gitlab.doppelmutzi.com/api/v4/projects/41/packages/npm/
هناك العديد من خيارات التكوين لـ npm ، فمن الأفضل التحقق منها في الوثائق.
يمكنك تعيين workspaces yarn في package.json (يجب أن تكون حزمة خاصة).
{
// ...
"خاص": صحيح،
"مساحات العمل": ["مساحة العمل-أ"، "مساحة العمل-ب"]
} ينتقل أي تكوين اختياري إلى ملف .yarnrc . أحد خيارات التكوين الشائعة هو تعيين yarn-path: فهو يفرض على كل عضو في الفريق استخدام إصدار ثنائي محدد. يشير yarn-path إلى المجلد الذي يحتوي على إصدار Yarn محدد (على سبيل المثال .yarn/releases/ ). يمكنك تثبيت إصدار Yarn Classic الموحد باستخدام الأمر (classic.yarnpkg.com/en/docs/cli…).
تكوين workspaces في Yarn Berry يشبه التكوين في Yarn Classic ( package.json ). تتم معظم عمليات تكوين Yarn Berry في .yarnrc.yml ، وهناك العديد من خيارات التكوين المتاحة.
# .yarnrc.yml YarnPath: .yarn/releases/yarn-3.1.1.cjs
يمكن yarn berry استخدام طريقة الاستيراد $> yarn plugin import <name> لتوسيع المكون الإضافي (yarnpkg.com/cli/plugin/...)، وهذا الأمر سوف كما يتم تحديث .yarnrc.yml .
# .yarnrc.yml
الإضافات:
- المسار: .yarn/plugins/@yarnpkg/plugin-semver-up.cjs
المواصفات: "https://raw.githubusercontent.com/tophat/yarn-plugin-semver-up/master/bundles/%40yarnpkg/plugin-semver-up.js" كما هو مذكور في قسم السجل، نظرًا لأسباب التوافق، قد تكون هناك بعض المشكلات المتعلقة بالتبعيات في وضع PnP الصارم. يوجد حل نموذجي لهذا النوع من مشكلات PnP: سياسة تكوين ملحق الحزمة.
# .yarnrc.yml
ملحقات الحزمة:
"المكونات المصممة@*":
التبعيات:
رد الفعل هو: "*" pnpm يستخدم نفس آلية التكوين مثل npm ، لذلك يمكنك استخدام ملفات .npmrc . يعمل تكوين السجل الخاص أيضًا بنفس طريقة استخدام npm . يمكن دعم المشاريع متعددة الحزم باستخدام ميزة مساحة العمل الخاصة بـ pnpm. لتهيئة monorepo ، يجب عليك تحديد موقع الحزمة في ملف pnpm-workspace.yaml .
# pnpm-workspace.yaml الحزم: - 'الحزم/**'
(هناك في الواقع ثلاثة مفاهيم هنا، مستودع واحد ومشاريع متعددة، مستودع واحد ومشروع واحد، ومستودعات متعددة ومشاريع متعددة)
monorepo هو مستودع يحتوي على مشاريع متعددة تسمى workspace أو الحزم. يعد الاحتفاظ بكل شيء في مكان واحد بدلاً من استخدام مستودعات متعددة بمثابة استراتيجية لتنظيم المشروع.
وبطبيعة الحال، وهذا يقدم تعقيدا إضافيا. لقد كان Yarn Classic أول من قام بتمكين هذه الميزة، ولكن الآن يقدم كل مدير حزم رئيسي وظائف مساحة العمل. يوضح هذا القسم كيفية تكوين مساحة العمل الخاصة بك باستخدام كل من مديري الحزم المختلفين.
أصدر فريق npm ميزة مساحة عمل npm التي طال انتظارها في الإصدار 7. يحتوي على العديد من أوامر CLI للمساعدة في إدارة المشاريع متعددة الحزم من الحزمة الجذر. يمكن استخدام معظم الأوامر مع الخيارات المتعلقة workspace لإخبار npm ما إذا كان يجب تشغيلها على مساحات عمل محددة أو متعددة أو جميعها.
# تثبيت كافة التبعيات لجميع مساحات العمل $ npm i --مساحات العمل. # تشغيل ضد حزمة واحدة اختبار تشغيل $ npm --workspace=hooks # يعمل ضد حزم متعددة اختبار تشغيل $ npm --workspace=hooks --workspace=utils #الركض ضد الجميع اختبار تشغيل $ npm --مساحات العمل #تجاهل جميع الحزم المفقودة في الاختبار $ npm run test --workspaces --if-present
نصائح: بالمقارنة مع مديري الحزم الآخرين، لا يدعم npm v8 حاليًا التصفية المتقدمة أو التنفيذ المتوازي لأوامر متعددة متعلقة بمساحة العمل.
2017، أعلن فريق Yarn عن دعم monorepo لوظائف مساحة العمل. في السابق، كان من الممكن استخدام مديري الحزم فقط في المشاريع متعددة الحزم مع برامج الطرف الثالث مثل Lerna. تمهد هذه الإضافة الجديدة إلى Yarn أيضًا الطريق لمديري الحزم الآخرين لتنفيذ هذه الوظيفة.
إذا كنت مهتمًا، يمكنك الرجوع إلى كيفية استخدام وظيفة مساحة العمل في Yarn Classic مع Lerna وبدونه. لكن هذه المقالة ستقدم فقط بعض الأوامر الضرورية لمساعدتك في إدارة التبعيات في إعداد مساحة عمل Yarn Classic .
# تثبيت جميع التبعيات $yarn لجميع مساحات العمل # عرض معلومات مساحات عمل الغزل لشجرة التبعية # قم بتشغيل حزمة أخرى لبدء مساحة عمل الغزل الرائعة - بداية الحزمة # إضافة Webpack إلى حزمة مساحة عمل الغزل $ الرائعة - إضافة الحزمة - D webpack # add React لجميع الحزم $ غزل add React -W
يتميز Yarn Berry بمساحات عمل مميزة منذ البداية، حيث أن تنفيذه مبني على مفاهيم Yarn Classic . في تعليق Reddit، قدم المطور الرئيسي لـ Yarn Berry نظرة عامة موجزة عن الميزات الموجهة لمساحة العمل، بما في ذلك:
يستخدم Yarn Berry عددًا من البروتوكولات التي يمكن استخدامها في حقل dependencies أو devDependencies لملف package.json . من بينها بروتوكول workspace .
على النقيض من مساحة عمل Yarn Classic ، يحدد Yarn Berry بوضوح أن التبعية يجب أن تكون إحدى الحزم في هذا monorepo . وإلا، إذا كانت الإصدارات غير متطابقة، فقد يحاول Yarn Berry الحصول على نسخته من السجل البعيد.
{
// ...
"التبعيات": {
"@doppelmutzi/hooks": "مساحة العمل:*",
"خادم http": "14.0.0"،
// ...
}
} من خلال بروتوكول workspace ، ساهم pnpm في مشروع monorepo مشابه لـ Yarn Berry . تقبل العديد من أوامر pnpm خيارات --recursive (-r) أو --filter والتي تكون مفيدة بشكل خاص في سياق monorepo . تعد أوامر التصفية الأصلية أيضًا مكملاً رائعًا لـ Lerna .
# تقليم كافة مساحات العمل pnpm -r exec -- rm -rf عقدة_وحدات && rm pnpm-lock.yaml # قم بإجراء جميع الاختبارات لجميع مساحات العمل ذات النطاق @doppelmutzi اختبار التشغيل العودي pnpm --filter @doppelmutzi/`
الأداء هو جزء أساسي من قرار الاختيار. يعرض هذا القسم معايير تستند إلى مشروع صغير ومتوسط الحجم. فيما يلي بعض الملاحظات على نموذج المشروع:
لقد قمت بقياس كل متغير من متغيرات مدير الحزم لدينا مرة واحدة باستخدام ثلاث حالات استخدام (UC). للحصول على تقييم وشرح مفصل، يرجى الاطلاع على نتائج المشروع 1 (P1) والمشروع 2 (P2).
node_modules أو .pnp.cjsnode_modules أو .pnp.cjsnode_modules أو .pnp.cjsاستخدمت أداة gnomon لقياس الوقت الذي يستغرقه التثبيت ( yarn | gnomon ). بالإضافة إلى ذلك قمت بقياس حجم الملفات التي تم إنشاؤها $ du -sh node_modules .
| نتائج الأداء للمشروع 1 | |||||||
|---|---|---|---|---|---|---|---|
| الطريقة | npm v8.1.2 | Yarn Classic v1.23.0 | pnpm v6.24.4 | Yarn Berry PnP Loose v3.1.1 | Yarn Berry PnP الصارم v3.1.1 | Yarn Berry عقدة_وحدات v3.1.1 | Yarn Berry pnpm v3.1.1 |
| UC 1 | 86.63s | 108.89s | 43.58s | 31.77s | 30.13 ثانية | 56.64 | ثانية 60.91 ثانية |
| UC 2 | 41.54 ثانية | 65.49 | ثانية 26.43 | ثانية 12.46 | ثانية 12.66 | ثانية 46.36 | ثانية 40.74 ثانية |
| UC 3 | 23.59 ثانية | 40.35 | ثانية 20.32 | ثانية 1.61 | ثانية 1.36 | ثانية 28.72 | ثانية 31.8 |
| ملفات 9s وحجمها | package-lock.json: 1.3MNode_modules : 467 م | عقدة_وحدات: 397 م خيوط. قفل: 504 كيلو | pnpm-lock.yaml: 412 كيلو عقدة_وحدات: 319 ميجا | خيوط. قفل: 540 كيلو ذاكرة تخزين مؤقت: 68 ميجا غير موصول: 29 ميجا .pnp.cjs: 1.6 ميجا | خيوط. قفل: 540 كيلو ذاكرة تخزين مؤقت: 68 ميجا غير موصول: 29 ميجا . pnp.cjs: 1.5M | عقدة_وحدات: 395M غزل.قفل: 540K ذاكرة تخزين مؤقت: 68M | عقدة_وحدات: 374M غزل.قفل: 540K ذاكرة تخزين مؤقت: 68M |
| نتائج الأداء للمشروع 2 | |||||||
|---|---|---|---|---|---|---|---|
| الطريقة | npm v8.1.2 | Yarn Classic v1.23.0 | pnpm v6.24.4 | Yarn Berry PnP Loose v3.1.1 | Yarn Berry PnP الصارم v3.1.1 | Yarn Berry عقدة_وحدات v3.1.1 | Yarn Berry pnpm v3.1.1 |
| UC 1 | 34.91s | 43.26s | 15.6s | 13.92s | 6.44s | 23.62s | 20.09s |
| UC 2 | 7.92s | 33.65s | 8.86s | 7.09s | 5.63s | 15.12s | 14.93s |
| UC 3 | 5.09s | 15.64s | 4.73s | 0.93s | 0.79s | 8.18s | 6.02s |
| الملفات وحجم | حزمة القفل .json: 684 كيلو بايت 151 | م | | | M .pnp.loader.mjs: 8.0K غزل.قفل: 292K .غزل: 38M | غزل.قفل: 292K عقدة_وحدات: 164M ذاكرة تخزين مؤقت: 34M | غزل.قفل: 292K عقدة_وحدات: 156M ذاكرة تخزين مؤقت: 34M |
يعتبر npm متساهلاً بعض الشيء عندما يتعلق الأمر بالتعامل مع الحزم السيئة وقد واجه بعض الثغرات الأمنية التي أثرت بشكل مباشر على العديد من المشاريع. على سبيل المثال، في الإصدار 5.7.0، عند تنفيذ الأمر sudo npm على نظام تشغيل Linux، يمكنك تغيير ملكية ملفات النظام، مما يجعل نظام التشغيل غير قابل للاستخدام.
وقع حادث آخر في عام 2018 يتعلق بسرقة عملات البيتكوين. أضافت حزمة Node.js EventStream تبعية ضارة في إصدارها 3.3.6. تحتوي هذه الحزمة الضارة على طريقة تشفير تحاول سرقة عملات البيتكوين من جهاز المطور.
للمساعدة في حل هذه المشكلات، تستخدم إصدارات npm الجديدة خوارزميات التشفير للتحقق من سلامة الحزم المثبتة لديك. شا-512.
Yarn Classic و Yarn Berry المجاميع الاختبارية للتحقق من سلامة كل عبوة من البداية. يحاول Yarn أيضًا منعك من استرداد الحزم الضارة التي لم يتم الإعلان عنها في package.json : إذا تم العثور على عدم تطابق، فسيتم إحباط التثبيت.
لا يحتوي Yarn Berry في وضع PnP على مشكلات الأمان الخاصة بطريقة node_modules التقليدية. بالمقارنة مع Yarn Classic ، يعمل Yarn Berry على تحسين أمان تنفيذ الأوامر. يمكنك فقط تنفيذ الحزم التي تم الإعلان عنها في package.json . تشبه ميزة الأمان هذه ميزة pnpm ، والتي سأصفها أدناه.
pnpm يستخدم المجاميع الاختبارية للتحقق من سلامة كل حزمة مثبتة قبل تنفيذ التعليمات البرمجية الخاصة بها.
كما ذكرنا أعلاه، يواجه كل من npm و Yarn Classic مشكلات أمنية بسبب الترقية. يتجنب pnpm هذا الموقف لأن نموذج الإدارة الخاص به لا يستخدم الارتفاع؛ بدلاً من ذلك، فهو ينشئ مجلدات node_modules المتداخلة، وبالتالي يزيل خطر الوصول غير القانوني إلى التبعية. وهذا يعني أنه تم الإعلان عن التبعيات في .package.json .
كما ناقشنا، يعد هذا أمرًا مهمًا بشكل خاص في بيئة monorepo ، نظرًا لأن تعزيز الخوارزميات قد يؤدي أحيانًا إلى عدم حتمية التبعية.
| npm | Yarn Classic | Yarn Berry | pnpm |
| Svelte | React | Jest (مع وحدات_العقد) | Vue 3 |
| Preact | Angular | Storybook (مع وحدات_العقد) | Browserlist |
| Express.js | Ember | Babel (مع وحدات_العقد) | Prisma |
| Meteor | Next.js | Redux Toolkit (مع وحدات_العقد) | SvelteKit |
| Apollo Server | Gatsby | ||
| نوكست | |||
| إنشاء تطبيق رد فعل | |||
| webpack-cli | |||
| العاطفة |
هناك بالفعل اختلافات كبيرة في مبادئ مديري الحزم المختلفين.
يبدو أن pnpm في البداية مثل npm من حيث أن استخدام CLI pnpm ولكن إدارة التبعيات مختلفة تمامًا ؛ لا يزال Yarn Classic شائعًا ، لكنه يعتبر برامج قديمة وقد يتم إسقاط الدعم في المستقبل القريب. يعد Yarn Berry PnP جديدًا ، لكن إمكاناته في إحداث ثورة في عالم الحزمة لم يتم تحقيقه مرة أخرى.
على مر السنين ، سأل العديد من المستخدمين عن من يستخدم مديري الحزم ، ويبدو أن الأشخاص بشكل عام مهتمين بشكل خاص بنضج وتبني Yarn Berry PnP .
الغرض من هذه المقالة هو تزويدك بوجهات نظر متعددة لتحديد مدير الحزم الذي يجب استخدامه بنفسك. أود أن أشير إلى أنني لا أوصي بمدير حزمة معين. يعتمد ذلك على كيفية وزنك للمتطلبات المختلفة - لذلك لا يزال بإمكانك اختيار ما تريد!
العنوان الأصلي باللغة الإنجليزية: https://blog.logbrocket.com/javaScript-Package-Managers-Compared/