Node.js कमांड लाइन तर्कों को कैसे संसाधित करता है: process.argv से स्रोत कोड तक
\n\nकल्पना करें: आपने Node.js पर एक शानदार स्क्रिप्ट लिखी है जो इमेज को कन्वर्ट करती है। लेकिन हर बार फ़ाइल का नाम बताने के लिए कोड में बदलाव करना अच्छा नहीं है। इससे कहीं बेहतर है चलाना: node convert.js --input photo.jpg --format webp और परिणाम प्राप्त करना। ऐसा जादू कैसे करें? हम आज अपना समय इसी प्रश्न पर समर्पित करेंगे, जो Stack Overflow पर सबसे लोकप्रिय में से एक है।
ऐसा लगता है, इससे आसान क्या हो सकता है? लेकिन Node.js (और स्वयं V8) के हुड के नीचे कई परतें छिपी हैं, जिनके बारे में हर डेवलपर को जानना उपयोगी है। हम केवल यह नहीं दिखाएंगे कि process.argv कैसे प्राप्त करें - हम Node.js के स्रोत कोड में झांकेंगे और जानेंगे कि तर्क आपके टर्मिनल से प्रक्रिया के पर्यावरण चर में कैसे यात्रा करते हैं। चलिए शुरू करते हैं!
कमांड लाइन तर्कों की आवश्यकता क्यों है?
\nकमांड लाइन तर्क (CLI arguments) आपके प्रोग्राम को कोड बदले बिना लचीला और पुन: प्रयोज्य बनाने का मुख्य तरीका है। हार्डकोडिंग के बजाय, आप इनपुट के रूप में डेटा पास करते हैं। यह लगभग सभी DevOps टूल्स, बिल्डर (Webpack, Vite) और उपयोगिताओं का आधार है। उनके साथ काम करना जानना एक JavaScript डेवलपर का बुनियादी कौशल है जो ब्राउज़र से आगे जाना चाहता है।
\n\nस्तर 1: मूल बातें - process.argv
\nNode.js में तर्क प्राप्त करने का सबसे सरल और मूल तरीका वैश्विक ऑब्जेक्ट process.argv का उपयोग करना है। यह स्ट्रिंग्स की एक सरणी है। आइए एक उदाहरण से शुरू करें।
फ़ाइल: args-demo.js
\n// args-demo.js\nconsole.log(process.argv);\n\nतर्कों के साथ चलाएं:
\nnode args-demo.js hello --name=World 42\n\nकंसोल आउटपुट:
\n[\n '/usr/local/bin/node', // 0: Node.js निष्पादन योग्य फ़ाइल का पथ\n '/home/user/args-demo.js', // 1: आपकी स्क्रिप्ट का पथ\n 'hello', // 2: पहला उपयोगकर्ता तर्क\n '--name=World', // 3: दूसरा तर्क\n '42' // 4: तीसरा तर्क\n]\n\nयही सब जादू है। process.argv केवल उस चीज़ का एक स्लाइस है जो ऑपरेटिंग सिस्टम ने प्रक्रिया को दिया। पहले दो तत्व सेवा जानकारी हैं। इंडेक्स 2 के बाद जो कुछ भी आता है वह आपके तर्क हैं। महत्वपूर्ण: ये सभी स्ट्रिंग्स हैं। संख्या 42 स्ट्रिंग "42" के रूप में आई है।
पहले दो तत्वों को कैसे हटाएं?
\nसुविधा के लिए अक्सर डिस्ट्रक्चरिंग का उपयोग किया जाता है:
\n// केवल उपयोगकर्ता तर्क प्राप्त करें\nconst [, , ...userArgs] = process.argv;\nconsole.log(userArgs); // ['hello', '--name=World', '42']\nया बस process.argv.slice(2)।
स्तर 2: मैन्युअल रूप से पार्स करना - अपना खुद का पहिया
\nकच्ची स्ट्रिंग सरणी के साथ काम करना असुविधाजनक है। हमें फ़्लैग्स (--name) को मानों (World) से अलग करना होगा। आइए तर्क को समझने के लिए एक सरल पार्सर लिखें।
// simple-parser.js\nconst args = process.argv.slice(2);\nconst parsed = {};\n\nfor (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg.startsWith('--')) {\n // '--' हटाएं और मान खोजें\n const key = arg.slice(2);\n const next = args[i + 1];\n // यदि अगला तर्क '--' से शुरू नहीं होता है, तो यह मान है\n if (next && !next.startsWith('--')) {\n parsed[key] = next;\n i++; // अगले पुनरावृत्ति चरण को छोड़ें\n } else {\n parsed[key] = true; // बूलियन फ़्लैग\n }\n } else if (arg.startsWith('-')) {\n // छोटे फ़्लैग्स, उदाहरण के लिए -v\n const key = arg.slice(1);\n parsed[key] = true;\n } else {\n // बस एक स्थितीय तर्क\n if (!parsed._) {\n parsed._ = [];\n }\n parsed._.push(arg);\n }\n}\n\nconsole.log(parsed);\n// node simple-parser.js --name World -v hello\n// { name: 'World', v: true, _: ['hello'] }\n\nयह कोड minimist जैसी लाइब्रेरीज़ का आधार है। जैसा कि आप देख सकते हैं, इसमें कुछ भी जटिल नहीं है। लेकिन वास्तविक परियोजनाओं में तैयार