सभी को नमस्कार! मुझे यकीन है कि आपने विभिन्न पैकेज प्रबंधकों का उपयोग करते हुए देखा होगा, जैसे: Node.js प्रोजेक्ट्स को (डिफ़ॉल्ट) एनपीएम धागा पीएनपीएम मैंने खुद भी ऐसा देखा है और ऊपर बताए गए सभी तरीकों के साथ काम किया है, लेकिन मेरे मन में हमेशा एक सवाल रहता था - लोगों/टीमों को के बजाय या उपयोग करने के लिए क्या प्रेरित करता है? इसके क्या फायदे हैं? क्या कोई नुकसान भी है? npm यार्न pnpm का खैर... चलो पता लगाते हैं! प्रदर्शन तुलना नियम मैंने , और उनकी "गति" के संदर्भ में तुलना करने का निर्णय लिया... एनपीएम यार्न पीएनपीएम की आपको नीचे 3 उपाय दिखाई देंगे: बिना किसी कैश के लॉक फ़ाइल उत्पन्न करें. किसी भी कैश के बिना मौजूदा लॉक फ़ाइलों से निर्भरताएं स्थापित करें। वैश्विक कैश के साथ मौजूदा लॉक फ़ाइलों से निर्भरताएँ स्थापित करें। कैश दो प्रकार के होते हैं: वैश्विक। आमतौर पर उपयोगकर्ता की होम निर्देशिका (fe, ) में संग्रहीत किया जाता है। ~/.yarn/berry/cache स्थानीय। प्रोजेक्ट निर्देशिका (fe, ) में संग्रहीत. <project-dir>/.yarn जबकि मेरे अनुभव में और सबसे आम उपयोग के मामले हैं, मैंने सिर्फ मामले में भी लिया (हालांकि यह एक बहुत ही दुर्लभ मामला है)। #2 #3 #1 मैंने बेंचमार्क के लिए उदाहरण के रूप में से एक नमूना प्रोजेक्ट का उपयोग किया। create-react-app NPM यह इकोसिस्टम के लिए एक डिफ़ॉल्ट पैकेज मैनेजर है - और क्या कहें? यह इंस्टॉलेशन पैकेज के साथ आता है, इसलिए यह मूल रूप से उपयोग के लिए तैयार है जब आप अपनी मशीन पर इंस्टॉल करते हैं (या किसी भी प्रदाता में यदि आपने वहां सेट किया है)। Node.js Node.js CI Node.js को मेरे विचार में यह एक बहुत बड़ी "सुविधा" है - आपको इसे अलग से स्थापित करने की आवश्यकता नहीं है! इसमें कुछ भी खास नहीं है - यह बस... काम करता है! और मैंने पिछले कई सालों में कोई बड़ी बग नहीं देखी है - यह काफी स्थिर लगता है और काम पूरा कर देता है। की वे विशेषताएं जो मैंने अब तक उपयोग की हैं: एनपीएम निर्भरताएं प्रबंधित करें (इंस्टॉल करें, हटाएं, अपडेट करें) पैकेज प्रकाशित करें (निजी, सार्वजनिक) लिंक-स्थानीय पैकेज कार्यस्थान प्रबंधित करें. निर्भरताएँ प्रबंधित करें आपके प्रोजेक्ट रूट के फ़ोल्डर में निर्भरताएँ संग्रहीत करता है। बहुत सरल है। npm node_modules ℹ️ सूचीबद्ध पैकेजों के लिए रजिस्ट्री के बारे में जानकारी संग्रहीत करता है - यह उपयोगी है यदि आपके पास एक ही दायरे से पैकेज हैं, यानी विभिन्न रजिस्ट्री में (उदाहरण के लिए - और ): package-lock.json बहुत @example-company npm GitHub पैकेज अब, आइए देखें कि यह इंस्टॉलेशन स्पीड के मामले में कैसा प्रदर्शन करता है... बिना किसी कैश के package-lock.json उत्पन्न करें इसमें के लिए उत्पन्न करना और बिना किसी कैश के निर्भरताएं स्थापित करना। 1 मिनट npm package-lock.json प्रयुक्त आदेश: npm i पैकेज-lock.json से बिना किसी कैश के निर्भरताएँ स्थापित करें इसमें के लिए से बिना किसी कैश के निर्भरताएं स्थापित करना। 18 सेकंड npm package-lock.json प्रयुक्त आदेश: npm ci वैश्विक कैश के साथ package-lock.json से निर्भरताएँ स्थापित करें इसमें के लिए वैश्विक कैश के साथ से निर्भरताएं स्थापित करना। 8 सेकंड npm package-lock.json प्रयुक्त आदेश: npm ci कार्यस्थान प्रबंधित करें मैं एक बार में संपूर्ण बनाने और उसके लिए तथा विशिष्ट परियोजनाओं के लिए अलग से निर्भरताओं का प्रबंधन करने में सक्षम था। कार्यक्षेत्र दूसरे शब्दों में - यह बिना किसी बग/समस्या के काम पूरा कर देता है, और आधिकारिक दस्तावेज बहुत सरल है। कार्यक्षेत्र सुविधाएँ जिनका मैंने अब तक उपयोग किया है: कार्यक्षेत्र के भीतर सभी परियोजनाओं के लिए निर्भरताएँ स्थापित करें. किसी एक विशिष्ट परियोजना के लिए निर्भरताएँ स्थापित करें. सभी परियोजनाओं के लिए एक ही स्क्रिप्ट को एक साथ पुनरावर्ती रूप से चलाएं। धागा ईमानदारी से कहूँ तो, मैंने की कुछ विशेषताओं को ज़्यादा नहीं आजमाया है। मेरा मतलब है, मैंने कुछ प्रोजेक्ट पर काम करते समय "निर्भरता स्थापित करने" के मामले में इसका बहुत उपयोग किया है, और बस इतना ही। यार्न इंस्टॉलर के साथ नहीं आता है, इसलिए आपको इसे अलग से इंस्टॉल करना होगा। इसका मतलब है कि आपके पाइपलाइन में एक अतिरिक्त चरण होगा - आपको अपनी परियोजना निर्भरताएँ इंस्टॉल करने से पहले सेट करना होगा। यार्न Node.js CI यार्न को निर्भरताएँ प्रबंधित करें निर्भरता स्थापित करने के लिए के दो तरीके हैं: यार्न “ ” (डिफ़ॉल्ट) - फ़ोल्डर बनाता है और और फ़ाइलों में पैकेजों को सूचीबद्ध करता है। शून्य इंस्टॉल .yarn yarn.lock .pnp.cjs एक नियमित - के समान, निर्भरता को में संग्रहीत करता है और उन्हें फ़ाइल में सूचीबद्ध करता है। npm node_modules yarn.lock ℹ️ लॉक फ़ाइलें सभी सूचीबद्ध पैकेजों के लिए रजिस्ट्री के बारे में जानकारी संग्रहीत करती हैं तभी जब आप पुराने (नियमित) स्थापना दृष्टिकोण का उपयोग करते हैं। यार्न केवल ⚠️ ध्यान रखें कि " " स्थानीय कैश में पैकेज संग्रहीत करता है और आपकी लॉक फ़ाइलों के लिंक प्रदान करता है: शून्य इंस्टॉल यह आपके लिए महत्वपूर्ण हो सकता है यदि आपके पास एक या पाइपलाइन है जहां आप एक स्वच्छ वातावरण में निर्भरताएं स्थापित करते हैं और फिर इसे दूसरे में ले जाना चाहते हैं (आपको फ़ोल्डर और स्थानीय कैश दोनों की प्रतिलिपि बनानी होगी)। Dockerfile CI .yarn चूंकि अब यार्न के लिए डिफ़ॉल्ट दृष्टिकोण " " है और पुराने दृष्टिकोण की तुलना में इसका प्रदर्शन बेहतर है - हम केवल इसी दृष्टिकोण के साथ बेंचमार्क रिकॉर्ड करने जा रहे हैं। शून्य इंस्टॉल बिना किसी कैश के लॉक फ़ाइलें उत्पन्न करें इसमें के लिए फ़ाइल उत्पन्न करना और कैश के बिना निर्भरताएँ स्थापित करना। 16.5 सेकंड यार्न yarn.lock प्रयुक्त आदेश: yarn install बिना किसी कैश के मौजूदा लॉक फ़ाइलों से निर्भरताएँ स्थापित करें इसमें के लिए "शून्य इंस्टॉल" दृष्टिकोण और बिना किसी कैश के निर्भरताएं स्थापित करना। 11 सेकंड यार्न प्रयुक्त आदेश: yarn install --frozen-lockfile ग्लोबल कैश के साथ मौजूदा लॉक फ़ाइलों से निर्भरताएँ स्थापित करें इसमें के लिए "शून्य इंस्टॉल" दृष्टिकोण और वैश्विक कैश के साथ निर्भरताएं स्थापित करना। 8 सेकंड यार्न प्रयुक्त आदेश: yarn install --frozen-lockfile कार्यस्थान प्रबंधित करें मैं बनाने और सभी परियोजनाओं के लिए एक साथ तथा विशिष्ट परियोजनाओं के लिए अलग से निर्भरताओं का प्रबंधन करने में सक्षम था। एक कार्यक्षेत्र कार्यक्षेत्र सुविधाएँ जिनका मैंने अब तक उपयोग किया है: कार्यक्षेत्र के भीतर सभी परियोजनाओं के लिए निर्भरताएँ स्थापित करें. किसी एक विशिष्ट परियोजना के लिए निर्भरताएँ स्थापित करें. सभी परियोजनाओं के लिए एक ही स्क्रिप्ट को एक साथ पुनरावर्ती रूप से चलाएं। दस्तावेज़ीकरण तो ठीक है, लेकिन कमांड नाम और फ़्लैग कुछ हद तक भ्रामक हैं। उदाहरण के लिए, मुझे ( ) और नेस्टेड प्रोजेक्ट में स्क्रिप्ट चलाने के लिए इसे निष्पादित करना होगा: रूट . b2b test yarn workspaces foreach -A --include '{.,b2b}' run test की तुलना में: एनपीएम npm run test --workspace=b2b --include-workspace-root पीएनपीएम वर्तमान में काफी लोकप्रिय है - । pnpm बहुत सारी कंपनियां और ओपन सोर्स परियोजनाएं इसका उपयोग करती हैं की तरह ही - इंस्टॉलर के साथ नहीं आता है, इसलिए आपको इसे अलग से इंस्टॉल करना होगा। इसका मतलब है कि आपकी पाइपलाइन में एक अतिरिक्त चरण होगा - आपको अपनी प्रोजेक्ट निर्भरताएँ इंस्टॉल करने से पहले सेट करना होगा। यार्न pnpm Node.js CI pnpm निर्भरताएँ प्रबंधित करें माना जाता है ... pnpm को " " तेज़, डिस्क स्थान कुशल पैकेज प्रबंधक वास्तव में, मैं स्थानीय स्तर पर निर्भरताओं के प्रबंधन के संदर्भ में कथन से सहमत हूं। "डिस्क स्थान कुशल" डिफ़ॉल्ट रूप से, साझा निर्भरताओं को डी-डुप्लिकेट करता है। उन पैकेजों के लिए सिम्बलिंक बनाता है जो कई निर्भरताओं में उपयोग किए जाते हैं। यानी, अगर पैकेज और निर्भरता के रूप में पैकेज का उपयोग करते हैं - पैकेज एक एकल प्रतिलिपि के रूप में संग्रहीत करेगा और पैकेज और के लिए सिम्बलिंक बनाएगा। इस तरह, पैकेज प्रबंधक हार्ड कॉपी नहीं बनाता है और आपके SSD/HDD पर मेमोरी बचाता है। pnpm pnpm a b c pnpm c a b ℹ️ सूचीबद्ध पैकेजों के लिए रजिस्ट्री के बारे में जानकारी संग्रहीत नहीं करता है। pnpm-lock.yaml ⚠️ ध्यान रखें कि कभी-कभी निर्भरता को प्रोजेक्ट के रूप में रखने के बजाय वैश्विक कैश में संग्रहीत करता है। pnpm बिना किसी कैश के pnpm-lock.yaml उत्पन्न करें इसमें के लिए उत्पन्न करना और बिना किसी कैश के निर्भरताएं स्थापित करना। 31 सेकंड pnpm pnpm-lock.yaml प्रयुक्त आदेश: pnpm install वैश्विक कैश के बिना pnpm-lock.yaml से निर्भरताएँ स्थापित करें इसमें के लिए कैश के बिना से निर्भरताएं स्थापित करना। 16 सेकंड pnpm pnpm-lock.yaml प्रयुक्त आदेश: pnpm i --frozen-lockfile ग्लोबल कैश के साथ मौजूदा लॉक फ़ाइल से निर्भरताएँ स्थापित करें इसमें के लिए वैश्विक कैश के साथ से निर्भरताएं स्थापित करना। 5 सेकंड pnpm pnpm-lock.yaml प्रयुक्त आदेश: pnpm i --frozen-lockfile कार्यस्थान प्रबंधित करें अब, यहीं से चीजें वास्तव में दिलचस्प हो जाती हैं... में बहुत सारे कॉन्फ़िगरेशन विकल्प हैं, लेकिन कुछ मुख्य कार्यक्षमताएं काम नहीं करतीं! pnpm आइये उन कुछ त्रुटियों की समीक्षा करें जिनका मुझे सामना करना पड़ा: pnpm इंस्टॉल --फ़िल्टर केवल विशिष्ट परियोजनाओं के लिए निर्भरताएं स्थापित करने में सक्षम होना महत्वपूर्ण है - यह मोनोरेपो के लिए काफी उपयोगी है जब आप कार्यक्षेत्र के भीतर विशिष्ट परियोजनाओं से संबंधित पाइपलाइन बनाते हैं। यानी, कल्पना करें कि आपके कार्यस्थल में यह है: एक वेब ऐप, बैकएंड सर्वर, परीक्षण परियोजना (अंत-से-अंत परीक्षण)। ये सभी अलग-अलग परियोजनाएं हैं, लेकिन वे एक ही रेपो का हिस्सा हैं ☝️ एनपीएम अब, आप केवल एंड-टू-एंड टेस्ट चलाने के लिए पाइपलाइन चाहते हैं। तो, आपको केवल एंड-टू-एंड टेस्ट निर्भरता की आवश्यकता है, है ना? खैर, आप ऐसा नहीं कर पाएंगे - आपको संपूर्ण कार्यक्षेत्र के लिए निर्भरताएं स्थापित करने के लिए बाध्य कर रहा है! pnpm केवल चयनित परियोजनाओं के लिए निर्भरताएं स्थापित करनी थी, लेकिन यह काम नहीं करता है। pnpm install --filter <project-name> यह एक साल पुराना बग है और इसे हाल ही में एक गैर-कार्यशील फिक्स के साथ बंद कर दिया गया है। पुनरावर्ती-स्थापना=झूठ जब आप चलाते हैं तो डिफ़ॉल्ट रूप से संपूर्ण कार्यक्षेत्र (सभी प्रोजेक्ट) के लिए निर्भरताएँ स्थापित करता है pnpm install pnpm यदि आप अपने कार्यस्थान रूट में में सेट करते हैं तो आप इस व्यवहार को वैकल्पिक कर सकते हैं। .npmrc recursive-install=false लेकिन । इसमें एक और बग शामिल है जो लगभग 2 साल पुराना है साझा-कार्यस्थान-लॉकफ़ाइल=गलत डिफ़ॉल्ट रूप से निर्भरता सूची को एकल लॉक फ़ाइल में संग्रहीत करता है ( और के समान)। pnpm npm यार्न यदि आप अपने वर्कस्पेस रूट में में सेट करते हैं, तो आप इस व्यवहार को वैकल्पिक भी कर सकते हैं। .npmrc shared-workspace-lockfile=false इससे हमें वर्कस्पेस सुविधा को बनाए रखने और किसी विशिष्ट परियोजना के लिए निर्भरताएं स्थापित करने के लिए ध्वज का उपयोग करने की अनुमति मिल जाएगी। --ignore-workspace वैसे, यह सेटिंग कुछ और समस्याएं भी उत्पन्न करती है: और मेरे पाइपलाइनों में त्रुटि फेंकते हैं। eslint tsc --noEmit GitHub Actions "JavaScript Heap Out of Memory" कुछ निर्भरताएँ वैश्विक कैश में संग्रहीत हैं और में सिमलिंक की गई हैं। node_modules/.pnpm प्रदर्शन तुलना परिणाम # NPM धागा पीएनपीएम लॉक फ़ाइल बनाएं 60 सेकंड 16.5 सेकंड 31 सेकंड बिना किसी कैश के निर्भरताएँ स्थापित करें 18 सेकंड 11 सेकंड 8 सेकंड वैश्विक कैश के साथ निर्भरताएँ स्थापित करें 8 सेकंड 8 सेकंड 5 सेकंड उपरोक्त बेंचमार्क के अनुसार, सबसे धीमा पैकेज मैनेजर है ☝️ npm खैर, आइए इन परिणामों की व्याख्या करें... लॉक फ़ाइल बनाएं यह एक दुर्लभ मामला है। आम तौर पर, प्रोजेक्ट आरंभीकरण पर एक लॉक फ़ाइल बनाई जाती है और फिर जब आप पैकेज स्थापित/अपडेट करते हैं तो विस्तारित होती है। इसे ध्यान में रखते हुए - ऐसा नहीं लगता कि पैकेज मैनेजर चुनते समय इस पर भरोसा करना बहुत महत्वपूर्ण बात है। निर्भरताएँ स्थापित करें अधिकांश मामलों में, आपकी परियोजनाएं निर्भरताओं की एक विशिष्ट सूची रखती हैं और आप शायद ही कभी कुछ जोड़ते/हटाते हैं। सबसे अधिक संभावना यह है कि आप समय-समय पर अपने पैकेजों के संस्करणों में बदलाव करते रहेंगे - ये परिवर्तन छोटे होते हैं और आप कैश से शेष पैकेजों का पुनः उपयोग करेंगे। दूसरे शब्दों में, सामान्य उपयोग मामला है - पैकेज रजिस्ट्री से नए पैकेज लाना और शेष को कैश से प्राप्त करना। (5-8 सेकंड) मध्य में (8-11 सेकंड) के साथ (8-18 सेकंड) की तुलना में लगभग दोगुना तेज है। pnpm यार्न npm निष्कर्ष तथ्य वास्तव में पैकेज प्रबंधक है - यह वर्तमान समीक्षा में बिल्कुल स्पष्ट है! pnpm "एक तेज़ और डिस्क कुशल" वर्कस्पेस सुविधा में खामियां हैं और कुछ खामियां वर्षों से अनसुलझी हैं। pnpm और दोनों को CI पाइपलाइनों में अतिरिक्त सेटअप की आवश्यकता होती है, जबकि इसकी आवश्यकता नहीं होती। pnpm यार्न npm को और दोनों ही अपने लॉक फाइलों में पैकेज रजिस्ट्री जानकारी संग्रहीत नहीं करते हैं, जबकि ऐसा करता है। pnpm यार्न npm लेखक के विचार मुझे लगता है कि यदि पैकेज मैनेजर के लिए आपकी आवश्यकता "केवल निर्भरताएं स्थापित करें" जैसी सरल है, तो सबसे अच्छा काम करता है। pnpm भले ही इंस्टॉलर के साथ नहीं आता है, फिर भी इसे या के साथ CI पाइपलाइनों में सेट करना आसान है। pnpm Node.js कोरपैक मौजूदा एक्शन मैं प्राथमिकता देता हूं, क्योंकि: npm को यह स्थिर है (विशेषकर कार्यस्थलों पर), के साथ आता है और CI पाइपलाइन में अतिरिक्त सेटअप की आवश्यकता नहीं होती है, Node.js पैकेज रजिस्ट्री को में संग्रहीत करता है ताकि आप विभिन्न रजिस्ट्री से एकल स्कोप के साथ निर्भरताएं स्थापित कर सकें। package-lock.json ये फायदे उस गति और डिस्क स्थान के सेकंड से अधिक हैं जो मैं या के साथ बचा सकता था। यार्न पीएनपीएम पैकेज मैनेजर चुनने के लिए आपके मानदंड क्या हैं? संकोच न करें, और नीचे टिप्पणी अनुभाग में मुझे अपने विचार बताएं! 👇😊