Node.js पर JavaScript अनुप्रयोगों के प्रदर्शन का अनुकूलन

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

परिचय: क्यों जावास्क्रिप्ट का प्रदर्शन मायने रखता है

जावास्क्रिप्ट वह भाषा है जो आधुनिक वेब को शक्ति प्रदान करती है। फ्रंटएंड से लेकर सर्वर-साइड बैकएंड (Node.js) तक, इसका प्रदर्शन सीधे उपयोगकर्ता अनुभव, पेज लोड गति और बुनियादी ढांचे की लागत को प्रभावित करता है। उच्च-लोड अनुप्रयोगों और माइक्रोसर्विसेज के युग में, एक छोटी सी देरी भी व्यवसायों को हजारों उपयोगकर्ताओं का नुकसान करा सकती है। इस लेख में, हम Node.js पर जावास्क्रिप्ट अनुप्रयोगों को अनुकूलित करने के व्यावहारिक तरीकों का विस्तार से वर्णन करेंगे जो आपके कोड को गति देने, मेमोरी खपत को कम करने और सिस्टम प्रतिक्रिया में सुधार करने में मदद करेंगे।



1. एसिंक्रोनस प्रोग्रामिंग और इवेंट लूप के साथ कार्य करना

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



कॉलबैक के बजाय async/await और प्रॉमिस का उपयोग करें

आधुनिक जावास्क्रिप्ट एसिन्क्रोनिसिटी के साथ काम करने के लिए साफ सिंटैक्स प्रदान करता है। नेस्टेड कॉलबैक (कॉलबैक हेल) से बचें - वे कोड को जटिल बनाते हैं और मेमोरी लीक का कारण बन सकते हैं।

// ❌ बुरा: ब्लॉकिंग कॉलconst data = fs.readFileSync('file.txt', 'utf8');

// ✅ अच्छा: एसिंक्रोनस रीडिंगconst fs = require('fs/promises');async function readFile() { const data = await fs.readFile('file.txt', 'utf8'); return data;}


भारी कार्यों से इवेंट लूप को ब्लॉक न करें

यदि आपको CPU-गहन कार्य (इमेज प्रोसेसिंग, बड़े ऐरे को सॉर्ट करना) करने की आवश्यकता है, तो worker_threads या child_process का उपयोग करें। यह मुख्य थ्रेड को अनुरोधों को संभालने की अनुमति देता है।

// worker_threads के साथ उदाहरणconst { Worker } = require('worker_threads');

function runHeavyTask(data) { return new Promise((resolve, reject) => { const worker = new Worker('./heavy-worker.js', { workerData: data }); worker.on('message', resolve); worker.on('error', reject); });}


2. मेमोरी ऑप्टिमाइजेशन और गार्बेज कलेक्शन

Node.js में मेमोरी लीक एक आम समस्या है। वे लोड के तहत एप्लिकेशन की धीमी गति और क्रैश का कारण बनते हैं। सुनिश्चित करें कि ऑब्जेक्ट्स के संदर्भ क्लोजर या ग्लोबल वेरिएबल्स में नहीं रहते हैं।



ग्लोबल वेरिएबल्स से बचें

ग्लोबल ऑब्जेक्ट्स को गार्बेज कलेक्टर कभी नहीं हटाता है। लोकल वेरिएबल्स और मॉड्यूल का उपयोग करें।

// ❌ बुरा: ग्लोबल ऐरे अनिश्चित काल तक बढ़ता हैglobal.cache = [];

// ✅ अच्छा: TTL के साथ सीमित कैश का उपयोग करेंconst lruCache = new Map();const MAX_SIZE = 100;function addToCache(key, value) { if (lruCache.size >= MAX_SIZE) { const firstKey = lruCache.keys().next().value; lruCache.delete(firstKey); } lruCache.set(key, value);}


बड़े डेटा के लिए बफर और स्ट्रीम का उपयोग करें

फ़ाइलों या नेटवर्क अनुरोधों के साथ काम करते समय, सभी डेटा को एक साथ मेमोरी में लोड न करें। स्ट्रीम डेटा को टुकड़ों में प्रोसेस करती हैं, जिससे मेमोरी बचती है।

// ❌ बुरा: पूरी फ़ाइल को मेमोरी में लोड करनाconst data = fs.readFileSync('bigfile.csv', 'utf8');processData(data);

// ✅ अच्छा: स्ट्रीम का उपयोग करनाconst readStream = fs.createReadStream('bigfile.csv');readStream.on('data', (chunk) => { processData(chunk);});


3. कैशिंग और मेमोइज़ेशन

समान गणनाओं को बार-बार निष्पादित करना संसाधनों की बर्बादी है। परिणामों को कैश करना एप्लिकेशन को काफी तेज कर सकता है, खासकर डेटाबेस या APIs के साथ काम करते समय।



फंक्शन मेमोइज़ेशन

यदि किसी फंक्शन को एक ही तर्क के साथ कई बार कॉल किया जाता है, तो परिणाम को कैश में सेव करें।

function memoize(fn) {  const cache = new Map();  return function(...args) {    const key = JSON.stringify(args);    if (cache.has(key)) {      return cache.get(key);    }    const res                

ब्लॉग

पुस्तक अनुशंसाएँ