Npm में सामान्य निर्भरता पर बंडलड डिपेंडेंसी के लाभ


85

npm हमें निर्दिष्ट करने की अनुमति देता है bundledDependencies, लेकिन ऐसा करने के क्या फायदे हैं? मुझे लगता है कि अगर हम यह सुनिश्चित करना चाहते हैं कि हम जिस मॉड्यूल का संदर्भ देते हैं, उसे सही संस्करण मिल जाए, तो भी, या शायद बंडलिंग से गति का कोई लाभ है?

किसी को bundledDependenciesभी सामान्य निर्भरता से अधिक के फायदे पता है ?


16
'अगर यह "बंडलडिपेंडेंसी" वर्तनी है, तो वह भी सम्मानजनक है।' महान प्रलेखन!
कर्नल पैनिक

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

3
"मुझे लगता है कि अगर हम यह सुनिश्चित करना चाहते हैं कि हम सही संस्करण प्राप्त करें, भले ही हम जिस मॉड्यूल को संदर्भित करते हैं वह नष्ट हो जाए" अचानक बहुत अधिक भार वहन करता है: blog.npmjs.org/post/141577284765/kik-left-pad-and-npm
जोसे

1
इसके अलावा stackoverflow.com/questions/11459475/… देखें ।
अनोन

जवाबों:


49

नोड के साथ अभी सबसे बड़ी समस्याओं में से एक है कि यह कितनी तेजी से बदल रहा है। इसका मतलब है कि उत्पादन प्रणाली बहुत नाजुक हो सकती है और npm updateआसानी से चीजों को तोड़ सकती है।

बंडल्ड डिपेंडेंसी का उपयोग करना इस मुद्दे को सुनिश्चित करने का एक तरीका है, जैसा कि आप सही ढंग से सुनिश्चित करते हैं, कि आप हमेशा सही निर्भरता को वितरित करेंगे चाहे कोई भी बदलाव हो।

आप इसका उपयोग अपने स्वयं के, निजी बंडलों को बंडल करने और उन्हें स्थापित करने के लिए भी कर सकते हैं।


1
यह हमेशा सही निर्भरता कैसे देता है? इसका मतलब यह है कि npm updateबंडलड निर्भरता में किसी भी निर्भरता को प्रभावित नहीं करेगा?
केविन घडियानी

2
हाँ सही। ध्यान दें कि बंडल की निर्भरता किसी भी मौलिक तरीके से "सही" नहीं हो सकती है। वे सिर्फ वही हैं जो SAID को बंडल करने वाला व्यक्ति सही था।
जूलियन नाइट

7
शायद इसलिए कि आप एक जवाब देख रहे हैं जो साढ़े पाँच साल पुराना है ! उस समय Node.JS ने जो राशि ली है वह अभूतपूर्व है। शायद आप इसके बजाय टिप्पणी के रूप में कुछ उपयोगी जोड़ना चाहेंगे?
जूलियन नाइट

105

त्वरित रीडर के लिए : यह QA पैकेज के बारे में है पैकेज के बारे में नहीं , बल्कि बंडल की गई निर्भरता क्षेत्र।

बंडल्ड डिपेंडेंसी क्या करते हैं

"बंडल्ड डिपेंडेंसीज़" वास्तव में उनका नाम क्या है। निर्भरताएँ जो आपके प्रोजेक्ट के अंदर होनी चाहिए। तो कार्यक्षमता मूल रूप से सामान्य निर्भरता के समान है। दौड़ते समय उन्हें पैक भी किया जाएगा npm pack

उनका उपयोग कब करना है

सामान्य निर्भरता आमतौर पर npm रजिस्ट्री से स्थापित की जाती है। इस प्रकार बंडल निर्भरताएं उपयोगी होती हैं जब:

  • आप तीसरे पक्ष के पुस्तकालय का फिर से उपयोग करना चाहते हैं जो npm रजिस्ट्री से नहीं आता है या जिसे संशोधित किया गया था
  • आप मॉड्यूल के रूप में अपनी खुद की परियोजनाओं का फिर से उपयोग करना चाहते हैं
  • आप अपने मॉड्यूल के साथ कुछ फ़ाइलों को वितरित करना चाहते हैं

इस तरह, आपको अपनी खुद की npm रिपॉजिटरी बनाने (और बनाए रखने) की ज़रूरत नहीं है, लेकिन वही लाभ प्राप्त करें जो आपको npm पैकेज से मिलते हैं।

जब बंडल निर्भरता का उपयोग करने के लिए नहीं

विकास करते समय, मुझे नहीं लगता कि मुख्य बिंदु हालांकि आकस्मिक अपडेट को रोकना है। हमारे पास इसके लिए बेहतर उपकरण हैं, अर्थात् कोड रिपोजिटरी (git, मर्क्यूरियल, svn ...) या अब लॉक फाइलें।

अपने पैकेज संस्करणों को पिन करने के लिए, आप उपयोग कर सकते हैं:

  • Option1: नोड के साथ आने वाले नए NPM संस्करण 5 का उपयोग करें। यह एक package-lock.jsonफाइल का उपयोग करता है ( नोड ब्लॉग और नोड 8 रिलीज देखें)

  • विकल्प 2: के बजाय यार्न का उपयोग करें npm। यह फेसबुक से एक पैकेज मैनेजर है, इससे तेज npmऔर यह एक yarn.lockफाइल का उपयोग करता है । यह package.jsonअन्यथा का उपयोग करता है ।

यह बुंडलर या कार्गो जैसे अन्य पैकेज प्रबंधकों में लॉकफाइल्स के लिए तुलनीय है। यह npm के npm-संकोwrap.json के समान है, हालांकि यह हानिपूर्ण नहीं है और यह प्रतिलिपि प्रस्तुत करने योग्य परिणाम बनाता है।

npmवास्तव में उस सुविधा को yarnअन्य चीजों के बीच से कॉपी किया गया है ।

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

यह सभी देखें

यह प्रश्न के दायरे से थोड़ा बाहर है, लेकिन मैं अंतिम प्रकार की निर्भरता (जो मुझे पता है) का उल्लेख करना चाहूंगा: सहकर्मी निर्भरता । इसके अलावा इस संबंधित एसओ प्रश्न और संभवतः बंडलड डिपेंडेंसीyarn पर डॉक्स देखें


6
"द नोड_मॉडल फ़ोल्डर सहित" - यह एक बहुत ही अजीब बात है जो आपके रेपो को उत्पन्न कोड के साथ प्रदूषित करता है ... खासकर जब आप मूल मॉड्यूल के साथ काम कर रहे हैं ...
ओलेकेंडर

@ ऑलेक्ज़ेंडर उस बीच और जोखिम में पड़ते हुए कि एक पैकेज आपको ऐप तोड़ देता है, मुझे लगता है कि विकल्प आसान है। ध्यान दें कि आप एक अलग शाखा में डाल सकते हैं (उदाहरण के लिए गिट का उपयोग करते हुए)। सहमत, यह एक आदर्श समाधान से दूर है।
न्हा।

3
मैं उदाहरण के लिए phantomjs जैसे पैकेजों के कारण नोड_मॉड्यूल में जाँच के खिलाफ सिफारिश करूँगा, जो वर्तमान प्रणाली के लिए उपयुक्त बाइनरी स्थापित करते हैं। इसका मतलब यह है कि अगर एक देव लिनक्स पर npm इंस्टॉल करता है और नोड_मॉड्यूल्स में जांच करता है - यह विंडोज पर रेपो क्लोन करने वाले दूसरे देव के लिए काम नहीं करेगा। टारबॉल में यह जांचना बेहतर है कि कौन से एनपीएम डाउनलोड डाउनलोड करते हैं और उन पर एनपीएम-सिक्योरवैप.जॉन को इंगित करते हैं। आप npm install -g shrinkpackटूल का उपयोग करके इस प्रक्रिया को स्वचालित कर सकते हैं ।
जेमी मेसन

1
धन्यवाद @, आपकी सिक्योरिटी के साथ उस से भी सुरक्षित रहें, क्योंकि रजिस्ट्री टारबॉल आपके प्रोजेक्ट रिपॉजिटरी में होगा।
जेमी मेसन

1
@fold_left हाँ वास्तव में, इसे इंगित करने के लिए धन्यवाद (और संकोचन बनाने के लिए)। मैं सिर्फ यह कह रहा था कि अगर npm रजिस्ट्री एक अपरिवर्तनीय डेटास्टोर की तरह काम कर रही थी तो यह सब टाला जा सकता था।
नहा

22

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

यदि / जब वे इस बिंदु पर परिपक्व हो जाते हैं तो वे अलग-अलग मॉड्यूल के रूप में रह सकते हैं, आप अपने कोड को संशोधित किए बिना, उन्हें आसानी से npm पर रख सकते हैं।


3

मुझे आश्चर्य है कि मैंने इसे यहाँ पहले से ही नहीं देखा था, लेकिन जब ध्यान से चुना जाता है, तो bundledDependenciesएक वितरण योग्य पैकेज का उत्पादन करने के लिए इस्तेमाल किया जा सकता है npm packजो उस सिस्टम पर चलेगा जहां npmकॉन्फ़िगर नहीं किया गया है। यह उपयोगी है यदि आपके पास उदाहरण के लिए एक सिस्टम है जो नेटवर्क पर नहीं है / इंटरनेट पर नहीं है: अपने पैकेज को एक अंगूठे ड्राइव (या जो कुछ भी) पर लाएं और टारबॉल को अनपैक करें, तब npm runया node index.jsयह बस काम करता है।

हो सकता है कि "ऑफ़लाइन" चलाने के लिए आपके एप्लिकेशन को बंडल करने का एक बेहतर तरीका है, लेकिन अगर वहाँ है तो मैंने इसे नहीं पाया है।


0

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.