Bower और npm के बीच अंतर क्या है?


1763

bowerऔर के बीच मूलभूत अंतर क्या है npm? बस कुछ सादा और सरल चाहिए। मैंने अपने कुछ सहकर्मियों का उपयोग bowerऔर npmउनकी परियोजनाओं में परस्पर परिवर्तन देखा है ।


7
संबंधित जवाब stackoverflow.com/a/21199026/1310070
sachinjain024


7
इस प्रश्न का उत्तर पुराना लगता है। क्या कोई हमें बता सकता है कि 2016 में क्या करें यदि हम npm 3 का उपयोग करते हैं जो फ्लैट निर्भरता का समर्थन करते हैं? क्या अंतर है wpm npm3 और bower और अभी सबसे अच्छा अभ्यास क्या है?
अमदेव

2
निचला-रेखा, @ कामदेव: बोवर अब पदावनत हो गया है। npm (या यार्न, जो केवल एक मामूली अंतर है) जहां यह है। मुझे किसी भी व्यवहार्य विकल्प के बारे में पता नहीं है।
XML

जवाबों:


1914

सभी पैकेज प्रबंधकों के पास कई डाउनसाइड हैं। आपको बस उसे चुनना है जिसके साथ आप रह सकते हैं।

इतिहास

NPM Node.js मॉड्यूल प्रबंध बाहर शुरू कर दिया (जो की क्यों संकुल में जाने node_modulesडिफ़ॉल्ट रूप से), लेकिन यह सामने के अंत भी जब साथ संयुक्त के लिए काम करता Browserify या webpack

बोवर पूरी तरह से फ्रंट-एंड के लिए बनाया गया है और इसे ध्यान में रखते हुए अनुकूलित किया गया है।

रेपो का आकार

npm सामान्य उद्देश्य जावास्क्रिप्ट (जैसे country-dataदेश की जानकारी के लिए या sortsछंटनी करने वाले कार्यों के लिए सामने के छोर या पिछले छोर पर प्रयोग करने योग्य है) सहित bpm से बहुत बड़ा है ।

बोवर में बहुत कम मात्रा में पैकेज होते हैं।

शैलियों आदि को संभालना

बोवर में स्टाइल आदि शामिल हैं।

npm जावास्क्रिप्ट पर केंद्रित है। शैलियाँ या तो अलग से डाउनलोड की जाती हैं या किसी चीज़ की आवश्यकता होती है npm-sassया जैसे sass-npm

निर्भरता से निपटने

सबसे बड़ा अंतर यह है कि एनपीएम नेस्टेड निर्भरता (लेकिन डिफ़ॉल्ट रूप से फ्लैट है) जबकि बोवर को एक फ्लैट निर्भरता पेड़ की आवश्यकता होती है (उपयोगकर्ता पर निर्भरता संकल्प का बोझ डालता है)

एक नेस्टेड डिपेंडेंसी ट्री का मतलब है कि आपकी निर्भरता की अपनी निर्भरता हो सकती है जो कि उनकी अपनी हो सकती है, और इसी तरह। यह दो मॉड्यूल के लिए एक ही निर्भरता के विभिन्न संस्करणों और अभी भी काम करने की आवश्यकता है। ध्यान दें npm v3 के बाद से, निर्भरता का पेड़ डिफ़ॉल्ट रूप से (बचत स्थान) द्वारा फ्लैट होगा और केवल घोंसला जहां जरूरत हो, जैसे, अगर दो निर्भरता को अंडरस्कोर के अपने संस्करण की आवश्यकता होती है।

कुछ परियोजनाएं दोनों का उपयोग करती हैं कि वे बोवर का उपयोग फ्रंट-एंड पैकेज के लिए करते हैं और डेवलपर उपकरण जैसे कि योमन, ग्रंट, गुलप, जेएसहिंट, कॉफीस्क्रिप्ट आदि के लिए एनपीएम।


साधन


37
एक नेस्टेड निर्भरता पेड़ सामने के छोर पर अच्छी तरह से क्यों नहीं करता है?
लार्स Nyström

24
क्या फ्रंट-एंड एनपीएम पैकेज फ्लैट निर्भरता का पेड़ नहीं हो सकता है? मैं "हमें 2 पैकेज प्रबंधकों की आवश्यकता क्यों है?" दुविधा।
स्टीवन वचोन

38
"सपाट निर्भरता पेड़" से आपका क्या मतलब है? फ्लैट पेड़ क्या है - एक सूची? यह एक पेड़ नहीं है।
mvmn

14
दरअसल, एक रास्ता पेड़ भी है। यह सिर्फ एक विशेष मामला है। विकीपीडिया से: "गणित में, और अधिक विशेष रूप से ग्राफ सिद्धांत में, एक पेड़ एक अप्रत्यक्ष ग्राफ़ है जिसमें कोई भी दो कोने बिल्कुल एक मार्ग से जुड़े होते हैं।"
जॉरगेन फॉग

42
npm 3 अब एक फ्लैट निर्भरता पेड़ का समर्थन करता है।
वास

361

यह उत्तर सिंद्रे सोरहस के उत्तर के अतिरिक्त है। एनपीएम और बोवर के बीच प्रमुख अंतर यह है कि वे पुनरावर्ती निर्भरता का इलाज करते हैं। ध्यान दें कि उन्हें एक ही परियोजना में एक साथ उपयोग किया जा सकता है।

पर NPM पूछे जाने वाले प्रश्न : (6 से archive.org लिंक सितं, 2015)

निर्भरता को कम करने के बिना निर्भरता संघर्ष से बचना बहुत कठिन है। यह उस तरीके के लिए मौलिक है जो एनपीएम काम करता है, और एक अत्यंत सफल दृष्टिकोण साबित हुआ है।

पर बोवर होमपेज:

बोवर को फ्रंट-एंड के लिए ऑप्टिमाइज़ किया गया है। बोअर एक फ्लैट निर्भरता पेड़ का उपयोग करता है, प्रत्येक पैकेज के लिए केवल एक संस्करण की आवश्यकता होती है, पेज लोड को कम करके न्यूनतम।

संक्षेप में, एनपीएम का उद्देश्य स्थिरता है। न्यूनतम संसाधन भार के लिए बोवर का लक्ष्य है यदि आप निर्भरता संरचना बनाते हैं, तो आप इसे देखेंगे:

NPM:

project root
[node_modules] // default directory for dependencies
 -> dependency A
 -> dependency B
    [node_modules]
    -> dependency A

 -> dependency C
    [node_modules]
    -> dependency B
      [node_modules]
       -> dependency A 
    -> dependency D

जैसा कि आप देख सकते हैं यह कुछ निर्भरता को पुनरावर्ती रूप से स्थापित करता है। निर्भरता ए में तीन स्थापित उदाहरण हैं!

बोवर:

project root
[bower_components] // default directory for dependencies
 -> dependency A
 -> dependency B // needs A
 -> dependency C // needs B and D
 -> dependency D

यहां आप देखते हैं कि सभी अद्वितीय निर्भरताएं समान स्तर पर हैं।

तो, क्यों npm का उपयोग कर परेशान?

शायद निर्भरता बी को निर्भरता के एक अलग संस्करण की आवश्यकता होती है। निर्भरता सी। एनपीएम इस निर्भरता के दोनों संस्करणों को स्थापित करता है इसलिए यह वैसे भी काम करेगा, लेकिन बोवर आपको एक संघर्ष देगा क्योंकि यह दोहराव पसंद नहीं करता है (क्योंकि एक वेबपेज पर एक ही संसाधन लोड करना) बहुत ही अक्षम और महंगा, यह कुछ गंभीर त्रुटियां भी दे सकता है)। आपको मैन्युअल रूप से चुनना होगा कि आप किस संस्करण को स्थापित करना चाहते हैं। इसका प्रभाव यह हो सकता है कि निर्भरता में से एक टूट जाएगा, लेकिन यह कुछ ऐसा है जिसे आपको वैसे भी ठीक करने की आवश्यकता होगी।

इसलिए, आम उपयोग उन पैकेजों के लिए बोवर है जिन्हें आप अपने वेबपेजों (जैसे रनटाइम , जहां आप डुप्लीकेशन से बचते हैं) पर प्रकाशित करना चाहते हैं , और अन्य सामान जैसे परीक्षण, भवन, अनुकूलन, जाँच आदि के लिए npm का उपयोग करते हैं (जैसे विकास का समय , जहां दोहराव कम चिंता का विषय है)।

Npm 3 के लिए अपडेट:

npm 3 अभी भी बोवर की तुलना में चीजों को अलग तरह से करता है। यह विश्व स्तर पर निर्भरता स्थापित करेगा, लेकिन केवल पहले संस्करण के लिए ही इसका सामना होता है। अन्य संस्करण पेड़ में स्थापित किए गए हैं (मूल मॉड्यूल, फिर नोड_मॉड्यूल)।

  • [Node_modules]
    • डिपो A v1.0
    • डिप बी ० बी ०
      • डिपो A v1.0 (रूट संस्करण का उपयोग करता है)
    • dep C v1.0
      • dep A v2.0 (यह संस्करण रूट संस्करण से अलग है, इसलिए यह एक नेस्टेड इंस्टॉलेशन होगा)

अधिक जानकारी के लिए, मैं npm 3 के डॉक्स पढ़ने का सुझाव देता हूं


4
यह अब लगभग एक क्लिच है कि "सॉफ्टवेयर डेवलपमेंट सभी ट्रेड-ऑफ के बारे में है।" यह एक अच्छा उदाहरण है। एक के साथ या तो अधिक स्थिरता npm या न्यूनतम संसाधन भार का चयन करना चाहिए bower
jfmercer

6
@ श्रेक मैं स्पष्ट रूप से कह रहा हूं कि आप वास्तव में दोनों का उपयोग कर सकते हैं। उनके अलग-अलग उद्देश्य हैं, जैसा कि मैं अंतिम पैराग्राफ में बताता हूं। यह मेरी नजर में ट्रेड-ऑफ नहीं है।
जस्टस रोमिजन

आह, मुझे लगता है मैं तुम्हें गलत समझा। या मैंने ध्यान से नहीं पढ़ा। स्पष्टीकरण के लिए धन्यवाद। :-) यह अच्छा है कि दोनों का उपयोग बिना ट्रेड-ऑफ के किया जा सकता है।
jfmercer

4
@AlexAngas मैंने npm3 के लिए एक अपडेट जोड़ा है। यह अभी भी बोवर की तुलना में कुछ प्रमुख अंतर है। npm संभवतः हमेशा निर्भरता के कई संस्करणों का समर्थन करेगा, जबकि बोवर नहीं करता है।
जस्टस रोमीजन

npm 3 बोवर के करीब हो रही है;)
ni3

269

TL; DR: रोजमर्रा के उपयोग में सबसे बड़ा अंतर नेस्टेड निर्भरता नहीं है ... यह मॉड्यूल और ग्लोबल्स के बीच का अंतर है।

मुझे लगता है कि पिछले पोस्टर्स में कुछ बुनियादी अंतरों को अच्छी तरह से कवर किया गया है। (npm की नेस्टेड निर्भरता का उपयोग वास्तव में बड़े, जटिल अनुप्रयोगों के प्रबंधन में बहुत सहायक है, हालांकि मुझे नहीं लगता कि यह सबसे महत्वपूर्ण अंतर है।)

मुझे आश्चर्य है, हालांकि, किसी ने भी स्पष्ट रूप से बावर और एनपीएम के बीच के सबसे बुनियादी भेदों में से एक को नहीं समझाया है। यदि आप ऊपर दिए गए उत्तर पढ़ते हैं, तो आप अक्सर npm के संदर्भ में 'मॉड्यूल' शब्द देखेंगे। लेकिन यह आकस्मिक रूप से उल्लिखित है, जैसे कि यह केवल एक सिंटैक्स अंतर हो सकता है।

लेकिन मॉड्यूल बनाम ग्लोबल्स (या मॉड्यूल बनाम 'स्क्रिप्ट') का यह अंतर संभवतः बोवर और एनपीएम के बीच सबसे महत्वपूर्ण अंतर है। मॉड्यूल में सब कुछ डालने का npm दृष्टिकोण आपको ब्राउज़र के लिए जावास्क्रिप्ट लिखने के तरीके को बदलने की आवश्यकता है, लगभग निश्चित रूप से बेहतर के लिए।

द बोवर अप्रोच: ग्लोबल रिसोर्सेज, लाइक <script>टैग

मूल में, बोवर सादे-पुरानी स्क्रिप्ट फ़ाइलों को लोड करने के बारे में है। जो भी स्क्रिप्ट फाइलें होती हैं, बोवर उन्हें लोड करेगा। मूल रूप से जिसका अर्थ है कि बोवर सादे पुराने में अपने सभी लिपियों सहित की तरह है <script>'में है <head>अपने HTML के।

तो, वही मूल दृष्टिकोण जिसका आप उपयोग कर रहे हैं, लेकिन आपको कुछ अच्छी स्वचालन सुविधाएं मिलेंगी:

  • आपको अपने प्रोजेक्ट रेपो (विकास करते समय) में JS निर्भरता को शामिल करने या CDN के माध्यम से प्राप्त करने की आवश्यकता थी। अब, आप रेपो में उस अतिरिक्त डाउनलोड भार को छोड़ सकते हैं, और कोई व्यक्ति bower installस्थानीय स्तर पर त्वरित और त्वरित रूप से कर सकता है।
  • यदि एक बोवर निर्भरता तो इसमें अपनी निर्भरताएं निर्दिष्ट करती हैं bower.json, जिन्हें आपके लिए भी डाउनलोड किया जाएगा।

लेकिन इसके अलावा, बोवर नहीं बदलता है कि हम जावास्क्रिप्ट कैसे लिखते हैं । बोवर द्वारा भरी गई फाइलों के अंदर क्या जाता है, इसके बारे में कुछ भी नहीं बदलना चाहिए। विशेष रूप से, इसका अर्थ है कि बोवर द्वारा लोड की गई लिपियों में उपलब्ध कराए गए संसाधन (आमतौर पर, लेकिन हमेशा नहीं) अभी भी वैश्विक चर के रूप में परिभाषित किए जाएंगे , जो ब्राउज़र निष्पादन के संदर्भ में कहीं से भी उपलब्ध हैं।

एनपीएम दृष्टिकोण: सामान्य जेएस मॉड्यूल, स्पष्ट निर्भरता इंजेक्शन

नोड भूमि में सभी कोड (और इस प्रकार एनपीएम के माध्यम से लोड किए गए सभी कोड) को मॉड्यूल के रूप में संरचित किया जाता है (विशेष रूप से, कॉमनजस मॉड्यूल प्रारूप के कार्यान्वयन के रूप में , या अब, ईएस 6 मॉड्यूल के रूप में)। इसलिए, यदि आप ब्राउज़र-साइड निर्भरता (ब्राउज़र के माध्यम से या कुछ और जो समान काम करते हैं) को संभालने के लिए एनपीएम का उपयोग करते हैं, तो आप अपने कोड को उसी तरह से संरचना करेंगे जैसे नोड करता है।

होशियार लोगों की तुलना में मैंने 'क्यों मॉड्यूल?' के सवाल को निपटाया है, लेकिन यहाँ एक कैप्सूल सारांश है:

  • एक मॉड्यूल के अंदर कुछ भी प्रभावी रूप से नाम दिया गया है , जिसका अर्थ है कि यह कोई वैश्विक चर नहीं है, और आप गलती से इसे संदर्भित किए बिना नहीं कर सकते।
  • एक मॉड्यूल के अंदर कुछ भी जानबूझकर एक विशेष संदर्भ (आमतौर पर एक अन्य मॉड्यूल) में इंजेक्ट किया जाना चाहिए ताकि इसका उपयोग किया जा सके
  • इसका मतलब है कि आपके आवेदन के विभिन्न हिस्सों में एक ही बाहरी निर्भरता (लॉश, मान लें) के कई संस्करण हो सकते हैं और वे टकराव / संघर्ष नहीं करेंगे। (यह आश्चर्यजनक रूप से अक्सर होता है, क्योंकि आपका अपना कोड एक निर्भरता के एक संस्करण का उपयोग करना चाहता है, लेकिन आपकी बाहरी निर्भरता में से एक दूसरे को निर्दिष्ट करता है जो टकराव करता है। या आपको दो बाहरी निर्भरताएं मिली हैं जो प्रत्येक एक अलग संस्करण चाहते हैं।)
  • क्योंकि सभी निर्भरता मैन्युअल रूप से एक विशेष मॉड्यूल में इंजेक्ट की जाती है, इसलिए उनके बारे में तर्क करना बहुत आसान है। आप एक तथ्य के लिए जानते हैं: "इस पर काम करते समय एकमात्र कोड पर विचार करने की आवश्यकता है जो मैंने जानबूझकर यहां इंजेक्शन लगाने के लिए चुना है"
  • क्योंकि यहां तक ​​कि इंजेक्ट किए गए मॉड्यूल की सामग्री को उस चर के पीछे एनकैप्सुलेट किया गया है जिसे आप इसे असाइन करते हैं, और सभी कोड एक सीमित दायरे के अंदर निष्पादित होते हैं, आश्चर्य और टकराव बहुत असंभव हो जाते हैं। यह बहुत कम है, संभावना है कि आपके किसी आश्रित से कुछ गलती से एक वैश्विक चर को फिर से परिभाषित किए बिना आपको इसे साकार कर देगा, या कि आप ऐसा करेंगे। (यह हो सकता है, लेकिन आपको आमतौर पर इसे करने के लिए अपने रास्ते से बाहर जाना पड़ता है, कुछ इस तरह से window.variable। एक दुर्घटना जो अभी भी होती है वह असाइन करना है this.variable, यह एहसास नहीं है कि thisवास्तव windowमें वर्तमान संदर्भ में है।)
  • जब आप एक व्यक्तिगत मॉड्यूल का परीक्षण करना चाहते हैं, तो आप आसानी से जान सकते हैं: वास्तव में और क्या (निर्भरताएं) मॉड्यूल के अंदर चलने वाले कोड को प्रभावित कर रहा है? और, क्योंकि आप स्पष्ट रूप से सब कुछ इंजेक्ट कर रहे हैं, आप आसानी से उन निर्भरताओं का मजाक उड़ा सकते हैं।

मेरे लिए, फ्रंट-एंड कोड के लिए मॉड्यूल का उपयोग उबलता है: एक बहुत ही संकीर्ण संदर्भ में काम करना जो कि कारण और परीक्षण के लिए आसान है, और जो चल रहा है उसके बारे में अधिक निश्चितता है।


कॉमनजस / नोड मॉड्यूल सिंटैक्स का उपयोग करना सीखने में केवल 30 सेकंड लगते हैं। किसी दिए गए JS फ़ाइल के अंदर, जो एक मॉड्यूल होने जा रहा है, आप पहले किसी भी बाहरी निर्भरता को घोषित करते हैं जिसका आप उपयोग करना चाहते हैं, जैसे:

var React = require('react');

फ़ाइल / मॉड्यूल के अंदर, आप सामान्य रूप से जो कुछ भी करते हैं, और कुछ वस्तु या फ़ंक्शन बनाते हैं, जिसे आप बाहरी उपयोगकर्ताओं के लिए उजागर करना चाहते हैं, शायद यह कहते हुए myModule

किसी फ़ाइल के अंत में, आप जो कुछ भी दुनिया के साथ साझा करना चाहते हैं, उसे इस तरह निर्यात करते हैं:

module.exports = myModule;

फिर, ब्राउज़र में एक कॉमनजेस-आधारित वर्कफ़्लो का उपयोग करने के लिए, आप उन सभी व्यक्तिगत मॉड्यूल फ़ाइलों को हथियाने के लिए Browserify जैसे उपकरणों का उपयोग करेंगे, रनटाइम पर अपनी सामग्री को एनकैप्सुलेट करेंगे, और आवश्यकतानुसार एक-दूसरे में इंजेक्ट करेंगे।

और, चूंकि ES6 मॉड्यूल (जिसे आप Babel या इसी तरह ES5 के साथ ट्रांसपाइल की संभावना है) व्यापक स्वीकृति प्राप्त कर रहे हैं, और ब्राउज़र या नोड 4.0 दोनों में काम करते हैं, हमें उन लोगों के एक अच्छे अवलोकन का भी उल्लेख करना चाहिए ।

इस डेक में मॉड्यूल के साथ काम करने के लिए पैटर्न के बारे में अधिक ।


EDIT (फरवरी 2017): फेसबुक का यार्न इन दिनों npm के लिए एक बहुत ही महत्वपूर्ण संभावित प्रतिस्थापन / पूरक है: तेज, निर्धारक, ऑफ़लाइन पैकेज-प्रबंधन जो npm आपको देता है उस पर बनाता है। यह किसी भी जेएस परियोजना के लिए देखने लायक है, खासकर जब से इसे / बाहर स्वैप करना इतना आसान है।


EDIT (मई 2019) "बोवर को आखिरकार हटा दिया गया है । कहानी का अंत।" (h / t: @DanDascalescu, नीचे, pithy सारांश के लिए।)

और, जबकि यार्न अभी भी सक्रिय है , इसके लिए बहुत सारी गति npm पर वापस आ गई, जब उसने यार्न की कुछ प्रमुख विशेषताओं को अपनाया।


13
खुशी है कि यह जवाब यहाँ था, अन्य लोकप्रिय उत्तर इस विवरण का उल्लेख नहीं करते हैं। npm आपको मॉड्यूलर कोड लिखने के लिए मजबूर करता है।
जुआन मेंडेस

मुझे क्षमा करें, एक ऐसे व्यक्ति से, जो जावास्क्रिप्ट पैराग्राफ़ में सभी फ़ज़िंग के लिए बहुत कम परवाह करता है, लेकिन ऐसा होता है कि यह एक व्यवसाय चलाता है जो एक छोटे से वेब एप्लिकेशन का उपयोग करता है। हाल ही में npm की कोशिश करने के लिए मजबूर किया गया था, टूलकिट के साथ बोवर का उपयोग करके हम डारन वेब चीज़ को विकसित करने के लिए उपयोग करते हैं। मैं आपको बता सकता हूं कि सबसे बड़ा अंतर प्रतीक्षा समय है, एनपीएम उम्र लेता है। याद रखें कि लोगों के साथ xkcd कार्टून संकलित किया जा रहा है, जिसमें तलवार चलाने वाले लड़ते हुए अपने मालिक से 'संकलन' करवाते हैं; बहुत ज्यादा क्या npm bower में जोड़ा गया है।
पेड्रो रॉड्रिक्स

129

2017-अक्टूबर अपडेट

अंत में बोवर को हटा दिया गया है । कहानी का अंत।

पुराना उत्तर

मैटिस पेटर जोहानसन से, स्पॉटिफ़ायर में जावास्क्रिप्ट डेवलपर :

लगभग सभी मामलों में, बोवर के ऊपर Browserify और npm का उपयोग करना अधिक उपयुक्त है। यह बस बोवर की तुलना में फ्रंट-एंड ऐप्स के लिए एक बेहतर पैकेजिंग समाधान है। Spotify पर, हम पूरे वेब मॉड्यूल (html, css, js) को पैकेज करने के लिए npm का उपयोग करते हैं और यह बहुत अच्छी तरह से काम करता है।

बोवर ब्रांड वेब के लिए पैकेज मैनेजर के रूप में खुद को विकसित करता है। अगर यह सच होता तो बहुत बढ़िया होता - एक पैकेज मैनेजर जिसने मेरे जीवन को बेहतर बनाया क्योंकि फ्रंट-एंड डेवलपर कमाल होगा। समस्या यह है कि इस उद्देश्य के लिए बोवर कोई विशेष टूलींग प्रदान नहीं करता है। यह NO टूलिंग प्रदान करता है जो मुझे पता है कि npm नहीं है, और विशेष रूप से कोई नहीं जो विशेष रूप से फ्रंट-एंड डेवलपर्स के लिए उपयोगी है। Npm पर Bower का उपयोग करने के लिए फ्रंट-एंड डेवलपर के लिए बस कोई लाभ नहीं है।

हमें bower का उपयोग करना बंद करना चाहिए और npm के आसपास समेकित करना चाहिए। शुक्र है, जो हो रहा है :

मॉड्यूल मायने रखता है - बोवर बनाम एनपीएम

Browserify या webpack के साथ, अपने सभी मॉड्यूल्स को बड़ी minified फाइलों में समेटना सुपर-आसान हो जाता है, जो प्रदर्शन के लिए बहुत बढ़िया है, खासकर मोबाइल डिवाइसेस के लिए। बोवर के साथ ऐसा नहीं है, जिसे समान प्रभाव प्राप्त करने के लिए काफी अधिक श्रम की आवश्यकता होगी।

npm आपको एक साथ मॉड्यूल के कई संस्करणों का उपयोग करने की क्षमता भी प्रदान करता है। यदि आपने बहुत अधिक एप्लिकेशन डेवलपमेंट नहीं किया है, तो यह शुरुआत में आपको एक बुरी चीज के रूप में प्रहार कर सकता है, लेकिन एक बार जब आप डिपेंडेंसी नरक के कुछ मुकाबलों से गुजर चुके होते हैं, तो आपको एहसास होगा कि एक मॉड्यूल के कई संस्करण होने की क्षमता बहुत सुंदर है महान सुविधा। ध्यान दें कि npm में एक बहुत ही आसान डिड्यूप टूल शामिल है जो स्वचालित रूप से सुनिश्चित करता है कि आप केवल मॉड्यूल के दो संस्करणों का उपयोग करते हैं यदि आपके पास वास्तव में है - यदि दो मॉड्यूल दोनों एक ही मॉड्यूल के एक ही संस्करण का उपयोग कर सकते हैं, तो वे करेंगे। लेकिन अगर वे नहीं कर सकते हैं , तो आप बहुत आसान है।

(ध्यान दें कि वेबपैक और रोलअप को व्यापक रूप से ब्राउज़र 2016 से बेहतर माना जाता है।)


7
<कटाक्ष> कृपया ध्यान रखें कि 'हैलो वर्ल्ड' npm प्रोजेक्ट को चलाने के लिए 300+ मॉड्यूल्स की जरूरत है ... </ sarcasm>: O
Mariusz Jamro

1
मैं इस बात से सहमत नहीं हूं कि "बड़ी खनन की गई फाइलें" प्रदर्शन के लिए बहुत बढ़िया हैं, खासकर मोबाइल उपकरणों के लिए। " इसके विपरीत: प्रतिबंधित बैंडविड्थ को मांग पर भरी हुई छोटी फ़ाइलों की आवश्यकता होती है।
माइकल फ्रांजल

बहुत अच्छी सलाह नहीं। अधिकांश एनपीएम पैकेज केवल नोडज बैकएंड हैं। यदि आप बैकएंड पर जावास्क्रिप्ट नहीं कर रहे हैं, या आपके पास एक मॉड्यूल सिस्टम नहीं है, तो पैकेजों की संख्या अप्रासंगिक है क्योंकि बोवर आपकी ज़रूरतों को बेहतर तरीके से फिट करेगा
गेरार्डो ग्रिग्नोली


45

बोवर मॉड्यूल के एक एकल संस्करण को बनाए रखता है, यह केवल आपके लिए सही / सर्वश्रेष्ठ का चयन करने में आपकी सहायता करने की कोशिश करता है।

जावास्क्रिप्ट निर्भरता प्रबंधन: एनपीएम बनाम बोवर बनाम वोलो?

एनपीएम नोड मॉड्यूल के लिए बेहतर है क्योंकि एक मॉड्यूल सिस्टम है और आप स्थानीय स्तर पर काम कर रहे हैं। ब्राउज़र के लिए बोवर अच्छा है क्योंकि वर्तमान में केवल वैश्विक गुंजाइश है, और आप उस संस्करण के बारे में बहुत चयनात्मक होना चाहते हैं जिसके साथ आप काम करते हैं।


4
मुझे लगता है कि सिंद्रे का उल्लेख है कि जब वह नेस्टेड निर्भरता के बारे में बात करता है।
गेम्स ब्रेनियाक

5
@GamesBrainiac आपका सही, मैंने सोचा कि मैं इसे अपने शब्दों में रखूँगा।
सगीव

1
@ सिग्विफ़ ये आपके अपने शब्द नहीं हैं , जब तक कि आप भी वेरीशियस न हों, जिन्होंने यहाँ
dayuloli

4
@Sagivf किसी अन्य के उत्तरों के प्रासंगिक भागों की नकल करने में कुछ भी गलत नहीं है यदि वे स्वयं यहां उत्तर नहीं देते हैं। यह बस मुझे थोड़ा आप "मैंने सोचा था कि मैं इसे अपने शब्दों में रखना होगा कहा।" जहां क्रेडिट बकाया है, वहां जाना चाहिए।
दिनूली

2
मुझे नहीं पता कि तुम लोगों ने इस जवाब पर इतना सवाल क्यों उठाया। मेरे लिए इस जवाब में वास्तव में नई जानकारी / परिप्रेक्ष्य है।
केल्विन

33

मेरी टीम बोवर से दूर चली गई और npm पर चली गई क्योंकि:

  • प्रोग्रामेटिक उपयोग दर्दनाक था
  • बोवर का इंटरफ़ेस बदलता रहा
  • कुछ विशेषताएं, जैसे url आशुलिपि, पूरी तरह से टूट गई हैं
  • एक ही परियोजना में बोवर और एनपीएम दोनों का उपयोग करना दर्दनाक है
  • Git टैग के साथ सिंक में bower.json वर्जन फील्ड को रखना दर्दनाक होता है
  • स्रोत नियंत्रण! = पैकेज प्रबंधन
  • CommonJS समर्थन सीधा नहीं है

अधिक जानकारी के लिए, "मेरी टीम बोवर के बजाय npm का उपयोग क्यों करती है" देखें ।


17

Http://ng-learn.org/2013/11/Bower-vs-npm/ से यह उपयोगी विवरण मिला

एक ओर npm को नोड.जेएस वातावरण में उपयोग किए गए मॉड्यूल को स्थापित करने के लिए बनाया गया था, या नोड का उपयोग करके निर्मित विकास उपकरण जैसे कर्मा, लिंट, मिनीफायर और इतने पर। npm एक प्रोजेक्ट में स्थानीय रूप से मॉड्यूल (नोड_मॉड्यूल में) या वैश्विक रूप से कई प्रोजेक्ट्स द्वारा उपयोग किए जा सकते हैं। बड़ी परियोजनाओं में निर्भरताएँ निर्दिष्ट करने का तरीका पैकेज नामक एक फ़ाइल बनाकर है। जो कि निर्भरताओं की एक सूची है। उस सूची को npm द्वारा पहचाना जाता है जब आप npm इंस्टॉल चलाते हैं, जो तब आपके लिए उन्हें डाउनलोड और इंस्टॉल करता है।

दूसरी ओर आपके सामने की निर्भरता को प्रबंधित करने के लिए बोवर बनाया गया था। JQuery, AngularJS, underscore इत्यादि जैसे पुस्तकालय। npm के समान इसमें एक फाइल है जिसमें आप निर्भरता की एक सूची निर्दिष्ट कर सकते हैं जिसे bower.json कहा जाता है। इस स्थिति में आपके फ्रंटएंड की निर्भरताएं bower install चलाकर स्थापित की जाती हैं, जो डिफ़ॉल्ट रूप से उन्हें bower_compenders नामक फ़ोल्डर में स्थापित करता है।

जैसा कि आप देख सकते हैं, हालांकि वे एक समान कार्य करते हैं, उन्हें पुस्तकालयों के बहुत अलग सेट पर लक्षित किया जाता है।


1
इसके आगमन के साथ npm dedupe, यह थोड़ा पुराना है। मटियास का उत्तर देखें ।
डैन डस्केल्सस्कु

7

नोड.जेएस के साथ काम करने वाले कई लोगों के लिए, बोवर का एक प्रमुख लाभ निर्भरता के प्रबंधन के लिए है जो जावास्क्रिप्ट बिल्कुल भी नहीं हैं। यदि वे जावास्क्रिप्ट के संकलन वाली भाषाओं के साथ काम कर रहे हैं, तो npm का उपयोग उनकी कुछ निर्भरता को प्रबंधित करने के लिए किया जा सकता है। हालाँकि, उनके सभी निर्भरता नोड.जेएस मॉड्यूल नहीं हैं। उन लोगों में से कुछ जो जावास्क्रिप्ट को संकलित करते हैं, उनके पास अजीब स्रोत भाषा विशिष्ट प्रबंधन हो सकती है जो उन्हें जावास्क्रिप्ट के लिए एक आसन्न विकल्प में संकलित करने के लिए पास करता है जब उपयोगकर्ता स्रोत कोड की उम्मीद कर रहे होते हैं।

एक npm पैकेज में सब कुछ उपयोगकर्ता-सामना करने वाली जावास्क्रिप्ट होने की आवश्यकता नहीं है, लेकिन npm लाइब्रेरी पैकेज के लिए, कम से कम कुछ होना चाहिए।


इस npmjs ब्लॉग पोस्ट में कहा गया है, "आपके पैकेज में कुछ भी हो सकता है, चाहे वह ES6 हो, क्लाइंट-साइड JS या HTML और CSS। ये ऐसी चीजें हैं जो स्वाभाविक रूप से जावास्क्रिप्ट के साथ-साथ बदल जाती हैं, इसलिए उन्हें वहां रखें।"
डैन डैस्केल्स्कु

1
इसमें अंतर हो सकता है , और इसमें शामिल होना चाहिए । बेशक वे कुछ भी शामिल कर सकते हैं, लेकिन सामान्य तौर पर, उन्हें कुछ प्रकार के इंटरफ़ेस को शामिल करना चाहिए । यह सब के बाद 'नोड पैकेज मैनेजर' है। इन के बारे में हिस्सा ऐसी चीजें हैं जो स्वाभाविक रूप से जावास्क्रिप्ट के साथ-साथ बदल जाती हैं। बहुत सी चीजें हैं जो स्पर्शरेखा से संबंधित हैं जो स्वाभाविक रूप से पक्ष के साथ नहीं मुड़ती हैं
डेसटर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.