هناك ثلاثة لاعبين رئيسيين في مساحة مدير الحزم:
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
أيضًا العديد من التحسينات لهذا الغرض)، بما في ذلك:
monorepo
Locking
)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.cjs
node_modules
أو .pnp.cjs
node_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/