bower
और के बीच मूलभूत अंतर क्या है npm
? बस कुछ सादा और सरल चाहिए। मैंने अपने कुछ सहकर्मियों का उपयोग bower
और npm
उनकी परियोजनाओं में परस्पर परिवर्तन देखा है ।
bower
और के बीच मूलभूत अंतर क्या है npm
? बस कुछ सादा और सरल चाहिए। मैंने अपने कुछ सहकर्मियों का उपयोग bower
और npm
उनकी परियोजनाओं में परस्पर परिवर्तन देखा है ।
जवाबों:
सभी पैकेज प्रबंधकों के पास कई डाउनसाइड हैं। आपको बस उसे चुनना है जिसके साथ आप रह सकते हैं।
NPM Node.js मॉड्यूल प्रबंध बाहर शुरू कर दिया (जो की क्यों संकुल में जाने node_modules
डिफ़ॉल्ट रूप से), लेकिन यह सामने के अंत भी जब साथ संयुक्त के लिए काम करता Browserify या webpack ।
बोवर पूरी तरह से फ्रंट-एंड के लिए बनाया गया है और इसे ध्यान में रखते हुए अनुकूलित किया गया है।
npm सामान्य उद्देश्य जावास्क्रिप्ट (जैसे country-data
देश की जानकारी के लिए या sorts
छंटनी करने वाले कार्यों के लिए सामने के छोर या पिछले छोर पर प्रयोग करने योग्य है) सहित bpm से बहुत बड़ा है ।
बोवर में बहुत कम मात्रा में पैकेज होते हैं।
बोवर में स्टाइल आदि शामिल हैं।
npm जावास्क्रिप्ट पर केंद्रित है। शैलियाँ या तो अलग से डाउनलोड की जाती हैं या किसी चीज़ की आवश्यकता होती है npm-sass
या जैसे sass-npm
।
सबसे बड़ा अंतर यह है कि एनपीएम नेस्टेड निर्भरता (लेकिन डिफ़ॉल्ट रूप से फ्लैट है) जबकि बोवर को एक फ्लैट निर्भरता पेड़ की आवश्यकता होती है (उपयोगकर्ता पर निर्भरता संकल्प का बोझ डालता है) ।
एक नेस्टेड डिपेंडेंसी ट्री का मतलब है कि आपकी निर्भरता की अपनी निर्भरता हो सकती है जो कि उनकी अपनी हो सकती है, और इसी तरह। यह दो मॉड्यूल के लिए एक ही निर्भरता के विभिन्न संस्करणों और अभी भी काम करने की आवश्यकता है। ध्यान दें npm v3 के बाद से, निर्भरता का पेड़ डिफ़ॉल्ट रूप से (बचत स्थान) द्वारा फ्लैट होगा और केवल घोंसला जहां जरूरत हो, जैसे, अगर दो निर्भरता को अंडरस्कोर के अपने संस्करण की आवश्यकता होती है।
कुछ परियोजनाएं दोनों का उपयोग करती हैं कि वे बोवर का उपयोग फ्रंट-एंड पैकेज के लिए करते हैं और डेवलपर उपकरण जैसे कि योमन, ग्रंट, गुलप, जेएसहिंट, कॉफीस्क्रिप्ट आदि के लिए एनपीएम।
यह उत्तर सिंद्रे सोरहस के उत्तर के अतिरिक्त है। एनपीएम और बोवर के बीच प्रमुख अंतर यह है कि वे पुनरावर्ती निर्भरता का इलाज करते हैं। ध्यान दें कि उन्हें एक ही परियोजना में एक साथ उपयोग किया जा सकता है।
पर 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 अभी भी बोवर की तुलना में चीजों को अलग तरह से करता है। यह विश्व स्तर पर निर्भरता स्थापित करेगा, लेकिन केवल पहले संस्करण के लिए ही इसका सामना होता है। अन्य संस्करण पेड़ में स्थापित किए गए हैं (मूल मॉड्यूल, फिर नोड_मॉड्यूल)।
अधिक जानकारी के लिए, मैं npm 3 के डॉक्स पढ़ने का सुझाव देता हूं
npm
या न्यूनतम संसाधन भार का चयन करना चाहिए bower
।
TL; DR: रोजमर्रा के उपयोग में सबसे बड़ा अंतर नेस्टेड निर्भरता नहीं है ... यह मॉड्यूल और ग्लोबल्स के बीच का अंतर है।
मुझे लगता है कि पिछले पोस्टर्स में कुछ बुनियादी अंतरों को अच्छी तरह से कवर किया गया है। (npm की नेस्टेड निर्भरता का उपयोग वास्तव में बड़े, जटिल अनुप्रयोगों के प्रबंधन में बहुत सहायक है, हालांकि मुझे नहीं लगता कि यह सबसे महत्वपूर्ण अंतर है।)
मुझे आश्चर्य है, हालांकि, किसी ने भी स्पष्ट रूप से बावर और एनपीएम के बीच के सबसे बुनियादी भेदों में से एक को नहीं समझाया है। यदि आप ऊपर दिए गए उत्तर पढ़ते हैं, तो आप अक्सर npm के संदर्भ में 'मॉड्यूल' शब्द देखेंगे। लेकिन यह आकस्मिक रूप से उल्लिखित है, जैसे कि यह केवल एक सिंटैक्स अंतर हो सकता है।
लेकिन मॉड्यूल बनाम ग्लोबल्स (या मॉड्यूल बनाम 'स्क्रिप्ट') का यह अंतर संभवतः बोवर और एनपीएम के बीच सबसे महत्वपूर्ण अंतर है। मॉड्यूल में सब कुछ डालने का npm दृष्टिकोण आपको ब्राउज़र के लिए जावास्क्रिप्ट लिखने के तरीके को बदलने की आवश्यकता है, लगभग निश्चित रूप से बेहतर के लिए।
<script>
टैगमूल में, बोवर सादे-पुरानी स्क्रिप्ट फ़ाइलों को लोड करने के बारे में है। जो भी स्क्रिप्ट फाइलें होती हैं, बोवर उन्हें लोड करेगा। मूल रूप से जिसका अर्थ है कि बोवर सादे पुराने में अपने सभी लिपियों सहित की तरह है <script>
'में है <head>
अपने HTML के।
तो, वही मूल दृष्टिकोण जिसका आप उपयोग कर रहे हैं, लेकिन आपको कुछ अच्छी स्वचालन सुविधाएं मिलेंगी:
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 पर वापस आ गई, जब उसने यार्न की कुछ प्रमुख विशेषताओं को अपनाया।
अंत में बोवर को हटा दिया गया है । कहानी का अंत।
मैटिस पेटर जोहानसन से, स्पॉटिफ़ायर में जावास्क्रिप्ट डेवलपर :
लगभग सभी मामलों में, बोवर के ऊपर Browserify और npm का उपयोग करना अधिक उपयुक्त है। यह बस बोवर की तुलना में फ्रंट-एंड ऐप्स के लिए एक बेहतर पैकेजिंग समाधान है। Spotify पर, हम पूरे वेब मॉड्यूल (html, css, js) को पैकेज करने के लिए npm का उपयोग करते हैं और यह बहुत अच्छी तरह से काम करता है।
बोवर ब्रांड वेब के लिए पैकेज मैनेजर के रूप में खुद को विकसित करता है। अगर यह सच होता तो बहुत बढ़िया होता - एक पैकेज मैनेजर जिसने मेरे जीवन को बेहतर बनाया क्योंकि फ्रंट-एंड डेवलपर कमाल होगा। समस्या यह है कि इस उद्देश्य के लिए बोवर कोई विशेष टूलींग प्रदान नहीं करता है। यह NO टूलिंग प्रदान करता है जो मुझे पता है कि npm नहीं है, और विशेष रूप से कोई नहीं जो विशेष रूप से फ्रंट-एंड डेवलपर्स के लिए उपयोगी है। Npm पर Bower का उपयोग करने के लिए फ्रंट-एंड डेवलपर के लिए बस कोई लाभ नहीं है।
हमें bower का उपयोग करना बंद करना चाहिए और npm के आसपास समेकित करना चाहिए। शुक्र है, जो हो रहा है :
Browserify या webpack के साथ, अपने सभी मॉड्यूल्स को बड़ी minified फाइलों में समेटना सुपर-आसान हो जाता है, जो प्रदर्शन के लिए बहुत बढ़िया है, खासकर मोबाइल डिवाइसेस के लिए। बोवर के साथ ऐसा नहीं है, जिसे समान प्रभाव प्राप्त करने के लिए काफी अधिक श्रम की आवश्यकता होगी।
npm आपको एक साथ मॉड्यूल के कई संस्करणों का उपयोग करने की क्षमता भी प्रदान करता है। यदि आपने बहुत अधिक एप्लिकेशन डेवलपमेंट नहीं किया है, तो यह शुरुआत में आपको एक बुरी चीज के रूप में प्रहार कर सकता है, लेकिन एक बार जब आप डिपेंडेंसी नरक के कुछ मुकाबलों से गुजर चुके होते हैं, तो आपको एहसास होगा कि एक मॉड्यूल के कई संस्करण होने की क्षमता बहुत सुंदर है महान सुविधा। ध्यान दें कि npm में एक बहुत ही आसान डिड्यूप टूल शामिल है जो स्वचालित रूप से सुनिश्चित करता है कि आप केवल मॉड्यूल के दो संस्करणों का उपयोग करते हैं यदि आपके पास वास्तव में है - यदि दो मॉड्यूल दोनों एक ही मॉड्यूल के एक ही संस्करण का उपयोग कर सकते हैं, तो वे करेंगे। लेकिन अगर वे नहीं कर सकते हैं , तो आप बहुत आसान है।
(ध्यान दें कि वेबपैक और रोलअप को व्यापक रूप से ब्राउज़र 2016 से बेहतर माना जाता है।)
बोवर मॉड्यूल के एक एकल संस्करण को बनाए रखता है, यह केवल आपके लिए सही / सर्वश्रेष्ठ का चयन करने में आपकी सहायता करने की कोशिश करता है।
एनपीएम नोड मॉड्यूल के लिए बेहतर है क्योंकि एक मॉड्यूल सिस्टम है और आप स्थानीय स्तर पर काम कर रहे हैं। ब्राउज़र के लिए बोवर अच्छा है क्योंकि वर्तमान में केवल वैश्विक गुंजाइश है, और आप उस संस्करण के बारे में बहुत चयनात्मक होना चाहते हैं जिसके साथ आप काम करते हैं।
मेरी टीम बोवर से दूर चली गई और npm पर चली गई क्योंकि:
अधिक जानकारी के लिए, "मेरी टीम बोवर के बजाय npm का उपयोग क्यों करती है" देखें ।
Http://ng-learn.org/2013/11/Bower-vs-npm/ से यह उपयोगी विवरण मिला
एक ओर npm को नोड.जेएस वातावरण में उपयोग किए गए मॉड्यूल को स्थापित करने के लिए बनाया गया था, या नोड का उपयोग करके निर्मित विकास उपकरण जैसे कर्मा, लिंट, मिनीफायर और इतने पर। npm एक प्रोजेक्ट में स्थानीय रूप से मॉड्यूल (नोड_मॉड्यूल में) या वैश्विक रूप से कई प्रोजेक्ट्स द्वारा उपयोग किए जा सकते हैं। बड़ी परियोजनाओं में निर्भरताएँ निर्दिष्ट करने का तरीका पैकेज नामक एक फ़ाइल बनाकर है। जो कि निर्भरताओं की एक सूची है। उस सूची को npm द्वारा पहचाना जाता है जब आप npm इंस्टॉल चलाते हैं, जो तब आपके लिए उन्हें डाउनलोड और इंस्टॉल करता है।
दूसरी ओर आपके सामने की निर्भरता को प्रबंधित करने के लिए बोवर बनाया गया था। JQuery, AngularJS, underscore इत्यादि जैसे पुस्तकालय। npm के समान इसमें एक फाइल है जिसमें आप निर्भरता की एक सूची निर्दिष्ट कर सकते हैं जिसे bower.json कहा जाता है। इस स्थिति में आपके फ्रंटएंड की निर्भरताएं bower install चलाकर स्थापित की जाती हैं, जो डिफ़ॉल्ट रूप से उन्हें bower_compenders नामक फ़ोल्डर में स्थापित करता है।
जैसा कि आप देख सकते हैं, हालांकि वे एक समान कार्य करते हैं, उन्हें पुस्तकालयों के बहुत अलग सेट पर लक्षित किया जाता है।
npm dedupe
, यह थोड़ा पुराना है। मटियास का उत्तर देखें ।
नोड.जेएस के साथ काम करने वाले कई लोगों के लिए, बोवर का एक प्रमुख लाभ निर्भरता के प्रबंधन के लिए है जो जावास्क्रिप्ट बिल्कुल भी नहीं हैं। यदि वे जावास्क्रिप्ट के संकलन वाली भाषाओं के साथ काम कर रहे हैं, तो npm का उपयोग उनकी कुछ निर्भरता को प्रबंधित करने के लिए किया जा सकता है। हालाँकि, उनके सभी निर्भरता नोड.जेएस मॉड्यूल नहीं हैं। उन लोगों में से कुछ जो जावास्क्रिप्ट को संकलित करते हैं, उनके पास अजीब स्रोत भाषा विशिष्ट प्रबंधन हो सकती है जो उन्हें जावास्क्रिप्ट के लिए एक आसन्न विकल्प में संकलित करने के लिए पास करता है जब उपयोगकर्ता स्रोत कोड की उम्मीद कर रहे होते हैं।
एक npm पैकेज में सब कुछ उपयोगकर्ता-सामना करने वाली जावास्क्रिप्ट होने की आवश्यकता नहीं है, लेकिन npm लाइब्रेरी पैकेज के लिए, कम से कम कुछ होना चाहिए।