Uncategorized

Npm مقابل Yarn

كتب بواسطة: 17/12/2019 لا يوجد تعليقات

عادة ما يتم وضع المطورين في حيرة عند اختيارهم بين مديري الحزم ليتم استخدامها في بناء وإدارة اعتمادات المشروع. ويوجد مديران للحزمة مشهورين في بيئة التطوير  وهما NPM اختصار لـ(Node package manager) وتعني مدير حزمة العقدة، و Yarn (مدير الحزم الذي أنشأه موقع فيس بوك). سوف ننظر إلى مديري الحزم هؤلاء جنباً إلى جنب مع الأخذ في الاعتبار الميزات التالية:

  • الأداء
  • الأمان
  • الدعم
  • سهولة الاستخدام

في نهاية هذا المقال ستكون قادراً على تحديد أي مدير حزمة تحتاج لمشروعك.

الأداء

كان الأداء موضع خلاف عند مقارنة NPM (Node Package Maneger) و Yarn (مدير الحزم الذي أنشأه فيسبوك). ويعتقد أنه منذ أن تم تقديم Yarn كان أداؤها أفضل مقارنة بـ NPM. وفي الآونة الأخيرة، قامت NPM (الإصدار 6.4.1) بسد الفجوة مع Yarn (الإصدار1.9.4) من حيث الأداء. في هذا القسم من هذه المقالة، سوف نقارن أداء هذه الحزم وكذلك بناء تركيب CLI الخاص بها، قدراتهم وهم غير متصلين وقدرتهم على تركيب الحزم بالتوازي.

سرعة تركيب الوحدة

هنا سنضع سرعة تركيب الحزمة في الاختبار باستخدام اختبار معياري يجريه appleboy. في هذا الاختبار المعياري، سنقوم بإجراء اختبار السرعة مع أحدث إصدار من Node v10.11.0 وقت كتابة هذا المقال. يمكنك إجراء هذه الاختبارات بنفسك عن طريق نسخ هذا المستودع. نتيجة الاختبار في الجدول التالي:

حالة الاختبارتحميل npm npm ciyarn
تحميل بدون  ذاكرة تخزين مؤقت ( بدون نسخ توضيحية)3 دقائق 40 ثانية3 دقائق 10 ثوانيدقيقة وثانية
تحميل بذاكرة مؤقتة ( بدون نسخ توضيحية)دقيقة وثانية 18 ثانيةثانيتين 
تحميل بذاكرة مؤقتة ( بوجود نسخة توضيحية) 54 ثانية21 ثانيةثانيتين 
تحميل بدون انترنت (بوجود نسخة توضيحية)ثانيتين

نعم! لقد رأيت ذلك. يتم تركيب Yarn بدون إنترنت بينما لا يتم ذلك في npm. ومع هذه النتائج، لا نحتاج إلى  mother confessor لتحديد أي من مديري الحزم أسرع.

بنية CLI لنختبر بنية CLI المزودة عن طريق npm و yarn. لاحظ أن بعض الأوامر تظهر في كلا الحزم، لكن ليس من الضروري أن تكون تقوم بنفس العمل.

YarnNPM
Yarn: هذا الأمر يُستخدم لتنزيل كل الحزم في ملف package.jsonnpm install: هذا الأمر مُستخدم من قبل npm لتنزيل الحزمة من ملف package.json
Yarn run: هذا الأمر لتشغيل كائن برنامج نصي         (script) محدد في ملف package.json.Npm run: هو اسم مستعار للأمر npm run scripts، والذي يقوم بنفس أمر yarn.
yarn add [package]: هذا الأمر مُستخدم لتحميل حزمة. Npm install [package]:هذا الأمر يقوم بتحميل حزمة من npm. 
Yarn remove [package]: هذا الأمر يُستخدم لإزالة حزمة.npm uninstall [package]:  هذا الأمر في npm  مساوي لإزالة أو إلغاء تثبيت حزمة.
Yarn version:  هذا الأمر يُستخدم لتحديث التطبيق الخاص بك باستخدام الاصدار الدلالي ( semantic versioning).Npm version: هذا الأمر يسرد لك إصدار التطبيق الخاص بك، Node , NPM بالإضافة إلى  Node dependencies.
Yarn upgrade:  يقوم هذا الأمر بترقية جميع الحزم في ملف Package.json.ولدى npm ما يعادلها، ولكنها حزمة مثبتة [npm-upgrade] (https://www.npmjs.com/package/npm-upgrade).
yarn self-update:  هذا الأمر يُستخدم لتحديث yarn لآخر نسخة متاحة. لوقت كتابة هذا المقال، هذا الأمر غير متاح حتى الآن.npm ليس لديها أمر مماثل حتى وقت كتابة هذه المقالة.

دعنا ننظر بالتفصيل لبعض الاختلافات بين npm و yarn  من ناحية بنية CLI:

  • Yarn version مقابل npm version: هذه الأوامر متشابهة لكنها تُعطي نتائج مختلفة. تستخدم yarn الكلمة المفتاحية version للدلالة على تحديث علامة التطبيق في تنسيق semver (semantic versioning)، بينما يقوم npm  بعرض تصور للنسخة في التطبيق الحالي، Node، npm واعتمادات أخرى.
  • Yarn upgrade مقابل npm-upgrade: الكلمة المفتاحية upgrade تقوم بتحديث كل الحزم الموجودة في ملف package.json لـ yarn.

Npm ليس لديها أمر CLI ممثال، لكن لديه وحدة عالمية يتم ثبيتها عن طريق الأمر npm i -g npm-upgrade ، والتي تُستخدم لتحديث كل الحزم في package.json، عن طريق تشغيل الأمر npm-upgrade.

التنزيل بدون إنترنت: خاصية yarn في التحميل بدون انترنت، واحدة من الميزات الرائعة.  كيف تعمل؟ يتم تثبيت الحزم المثبتة باستخدام yarn على قرص المستخدم. وعلى الرغم من أن الكثيرين قد يدينون هذه الممارسة،إلا أنها تمنع كثرة إرسال طلبات بروتوكول (HTTP) للحصول على حزم سبق وتم تركيبها. بهذه الطريقة، وبدون الإنترنت، yarn أو yarn add [package_name]  تقوم بتثبيت الحزم الخاصة بك. ومن ناحية أخرى، تحتاج npm إلى الإنترنت باستخدام بروتوكول HTTP للحصول على حزم مثبتة مسبقاً. قد يرغب العديد من الناس في تثبيتها لأنها لا تملأ قرصهم المحلي بالحزم التي قد يستخدمونها لمرة واحدة فقط.

التنزيل بالتوازي (Parallel ): التنزيل بالتوازي ميزة أخرى رائعة من yarn، وخارج الصندوق. تقوم yarn  بتنزيل الحزم بطريقة متوازية. بمعنى إذا كان علي تنزيل 5 حزم، والحزمة 2 تأخذ وقتاً طويلاً للتثبيت، فإن yarn تنتقل إلى الحزم 3 ، 4 ، 5 ، وتقوم بتثبيت الحزم جنباً إلى جنب. بخلاف الطريقة التسلسلية التي تستخدمها npm. التنزيل بالتوازي هو واحد من أسباب انتصار yarn على npm  في سرعة التحميل.

الأمان 

يستخدم yarn اختبار المجموع (checksum) للتحقق من سلامة الحزم التي يتم تنزيلها قبل تنفيذ أي كود. ماهو اختبار المجموع (checksum)؟ اختبار المجموع هو سلسلة من الحروف التي تم إنشائها بتطبيق خوارزمية حسابية على محتويات الملف. ُيستخدم للتحقق مما إذا كان هناك ملفين متشابهين أم لا. كيف يعمل؟ في أي وقت يتم فيه تثبيت حزمة أو تكون على وشك تنفيذها، يتم إجراء فحص سلامة باستخدام  اختبار المجموع للحزمة. ومن ناحية أخرى، تقوم npm بإجراء فحوصات السلامة من خلال SHA-1 (خوارزمية التجزئة الآمنة) المحددة في ملف package-lock.json. يتم إضافة سلسلة SHA-1 على كل جزء حزمة في ملف package-lock.json ويتم إجراء التحقق من السلامة باستخدام مفتاح التكامل، والذي يبدو كما يلي:

فحص الترخيص

تأتي yarn مع مدقق ترخيص مفيد وخارج الصندوق، في حالة رغبتك في عرض تراخيص لحزم التثبيت.  الأمر yarn licenses list سوف يعرض قائمة مرتبة ترتيباً أبجدياً لجميع الحزم التي تم تثبيتها من قبل أمر yarn أو yarn install، كما تمنحك الترخيص (وكذلك عنوان url إلى الكود المصدري) المرتبط بكل حزمة. ومن ناحية أخرى، لا تملك npm مدقق ترخيص مفيد خارج الصندوق. هناك عدد قليل من حزم المصادر المفتوحة التي تؤدي هذه الوظيفة، إحداها مدقق التراخيص (license-checker) بواسطة davglass. دعونا نختبر كلا الأمرين:

yarn licenses list

بعد تحميل حزمة license-checker  من GitHub. ملاحظة: كلا الأمرين يجب تشغيلهما بداخل الجذر (root)  في مشروعك. الناتج سيكون كهذا: 

الدعم

Npm هي مدير اعتماد مفتوح المصدر، أُنشأ بواسطة  Isaac Z. Schlueter لمواجهة القصور في حزم أخرى مماثلة، مثل PEAR. وتم تطوير yarn  من قبل فيس بوك لمواجهة أوجه القصور في npm.هناك الكثير من توجهات المطورين تميل نحو yarn لأسباب منها أن yarn أسرع من npm. وكما هو مبين أعلاه في هذه الصفحة، فإن yarn التي لازالت حديثة إلى حد ما لديها  معجبين أكبر مقارنة بـ npm حتى وقت كتابة هذا التقرير.

والآن أصبحت هاتين الحزمتين على دراية تامة بأنفسهما، حيث يمكن تركيب yarn باستخدام npm. ومن ناحية أخرى يمكن لـ yarn  تركيب حزم من package-lock.json باستخدام أمر[yarn import](https://yarnpkg.com/en/docs/cli/import). مما يساعد في ترحيل المشروعات التي تعتمد على package-lock.json إلى yarn. لمعرفة المزيد، يمكنك زيارة [yarn-import](https://yarnpkg.com/en/docs/cli/import#toc-motivation).

من مدونة yarn:

تعد هذه الميزة أحد الثمار الأولى للتعاون المستمر بين مشغلي الحزم التابعين لمديري الحزم. إننا نشعر بقوة أن الأداتين تدركان بعضهما البعض وتوفر بينهما طريقاً انتقالياً سهلاً…

تقوم npm بتحميل كل الحزمة من موقع npmjs.com، والتي تعيق وصول الحدث في حالة تعطله. بينما تقوم yarn  من جهة أخرى، بالتحميل من مستودعات متعددة npjs.com وكذلك Bower. في حين أن هذا لا يضمن توفرها دائماً، إلا أنه يقلل من احتمالية عدم توفر الحد الأدنى. وبروح الاعتماد على المصادر المفتوحة، ترد أدناه روابط لمستودعاتها الفردية، سيتم الترحيب بعمليات المراجعة في أي من المستودعات.

سهولة الاستخدام 

سهولة الاستخدام أو صديق للمستخدم  هي الميزة الأخيرة التي سنتطلع إليها في هذا المقال. في هذا القسم، سوف ننظر إلى معيارين (CLI و تجربة المستخدم)، سوف يتم استخدامهما لفحص مدى سهولة استخدام مديري الحزم.

CLI وهي اختصار لـ Command Line Interface وتعني واجهة سطر الأوامر. نعم! أنت تقرأ هذا بشكل صحيح. أعني، لماذا يجب أن تكون واجهة المستخدم معياراً في الـCLI. دعونا نلقي نظرة على كيف تبدو واجهة الأوامر (terminal) عند تشغيل npm install **** أو أمر yarn.

npm install

Yarn

تم إجراء كلا التحميلين بنفس الملف package.json. يمكننا أن نرى أن npm وyarn  لديها CLIs مختلفة. وتولد npm ضجيجاً أثناء التثبيت يمكن إسكاته باستخدام علَم -s لتشغيله في الوضع الصامت.

تجربة المستخدم يتمتع كل من مديري الحزم بتجربة مستخدم جيدة، مثل في حالة بدء مشروع جديد باستخدام yarn init أو npm init. حيث يوفر كلاهما وضع تفاعلي يساعد المستخدم في إعداد مشروع جديد. Yarn خرجت خارج الصندوق كما ذكر أعلاه في قسم الأداء  عندما قامت بعمل تحديث عن طريق الأمر yarn upgrade الذي يساعد على تحديث كل تبعيات المشروع. كما أن لهذا الأمر ميزة تفاعلية يمكن إستخدامها من خلال تشغيل yarn upgrade-interactive [–latest] ستكون النتيجة مثل هذا:

ومن ناحية أخرى، يُظهر npm  نفس المستوى من تجربة المستخدم، فقط أن هذه الميزة لا تأتي مع الحزمة الأصلية، ولكن مع حزمة تسمى npm-upgrade. يمكن تثبيت هذه الحزمة عن طريق تشغيل هذا الأمر npm i -g upgrade. بعد التثبيت، ستنتج عن طباعة npm-upgrade في ملف مشروعك والضغط على مفتاح الإدخال (Enter) المخرجات التالية: