आपकी वेबसाइट धीमी है? JavaScript प्रोफाइलिंग का समय आ गया है
\nक्या आपने कभी यह दर्द महसूस किया है: साइट लोड होती है, एनिमेशन स्मूथ हैं, लेकिन जैसे ही यूज़र पेज के साथ इंटरैक्ट करना शुरू करता है - सब कुछ रुक जाता है। बटन रिस्पॉन्स नहीं करते, स्क्रॉल हिचकिचाता है, और कंसोल में कोई एरर नहीं। परिचित लग रहा है? सबसे अधिक संभावना है कि समस्या JavaScript प्रदर्शन में है। यह भाषा आधुनिक वेब की आत्मा है, लेकिन उचित ऑप्टिमाइज़ेशन के बिना, यह आपकी कृति को एक धीमे राक्षस में बदल सकती है।
\nइस लेख में हम उबाऊ लेक्चर नहीं पढ़ेंगे। हम असली कोड लेंगे, प्रोफाइलिंग के साथ उसे टुकड़ों में तोड़ेंगे, और दिखाएंगे कि हर लूप से अधिकतम कैसे निकाला जाए। अपनी साइट को फॉर्मूला-1 कार में बदलने के लिए तैयार हैं? चलिए शुरू करते हैं!
\n\nJavaScript धीमा क्यों होता है: समस्या की जड़
\nटूल्स पकड़ने से पहले, आइए समझें कि प्रदर्शन को क्या चुराता है। अक्सर तीन चीज़ें जिम्मेदार होती हैं:
\n- \n
- मुख्य थ्रेड का ब्लॉक होना — JavaScript एक ही थ्रेड (Event Loop) में चलता है। यदि आप कोई भारी सिंक्रोनस ऑपरेशन चलाते हैं, तो इंटरफ़ेस उसके पूरा होने तक फ्रीज़ रहेगा। \n
- मेमोरी लीक — भूले हुए इवेंट हैंडलर, क्लोज़र रेफरेंस और ग्लोबल वेरिएबल। मेमोरी बढ़ती है, साइट धीमी होती है, और फिर क्रैश हो जाती है। \n
- अकुशल एल्गोरिदम — बड़े ऐरे पर डबल लूप, बार-बार DOM मैनिपुलेशन, अनऑप्टिमाइज़्ड डेटा स्ट्रक्चर। \n
लेकिन थ्योरी बहुत हो गई। आइए देखते हैं यह प्रैक्टिस में कैसा दिखता है।
\n\nप्रोफाइलिंग टूल्स: आपका झूठ पकड़ने वाला डिटेक्टर
\nChrome DevTools — प्रोफाइलर का स्विस नाइफ
\nकोई भी पेज खोलें, F12 दबाएं और Performance टैब पर जाएं। रिकॉर्ड बटन दबाएं, पेज पर कोई एक्शन करें (जैसे बटन पर क्लिक करें) और रिकॉर्ड रोकें। आपको एक टाइमलाइन दिखेगी जहां हर सेकंड फ्रेम्स में बंटा है। लाल पट्टियाँ आपकी दुश्मन हैं। इनका मतलब है कि ब्राउज़र 16.6 ms (60 FPS) में फ्रेम रेंडर नहीं कर पाया।
\n// उदाहरण: सरल लेकिन समस्याग्रस्त फंक्शन\nfunction heavyCalculation() {\n let result = 0;\n for (let i = 0; i < 100000000; i++) {\n result += Math.sqrt(i) * Math.sin(i);\n }\n return result;\n}\n\ndocument.getElementById('btn').addEventListener('click', () => {\n const start = performance.now();\n heavyCalculation(); // इंटरफ़ेस 2-3 सेकंड के लिए फ्रीज़ हो जाएगा!\n console.log('समय:', performance.now() - start);\n});\n\nप्रोफाइलिंग शुरू करें और बटन पर क्लिक करें। आप देखेंगे कि मुख्य थ्रेड पूरे एक सेकंड के लिए heavyCalculation कॉल में व्यस्त है। यही bottleneck है।
Memory — लीक का शिकार
\nMemory टैब पर जाएं और हीप का स्नैपशॉट लें। फिर पेज पर कुछ बार एक्शन करें और दूसरा स्नैपशॉट लें। दोनों की तुलना करें। यदि एक ही प्रकार की ऑब्जेक्ट्स की संख्या लगातार बढ़ रही है — तो आपके पास लीक है।
\n// क्लासिक लीक: भूला हुआ हैंडलर\nfunction createButton() {\n const btn = document.createElement('button');\n btn.textContent = 'Click me';\n document.body.appendChild(btn);\n \n // हैंडलर btn का रेफरेंस रखता है, भले ही btn हटा दिया जाए\n btn.addEventListener('click', function onClick() {\n console.log('Clicked');\n });\n \n // बटन हटाते हैं, लेकिन हैंडलर मेमोरी में रहता है\n document.body.removeChild(btn);\n}\n\n\nऑप्टिमाइज़ेशन तकनीकें: थ्योरी से प्रैक्टिस तक
\n1. async/await से मुख्य थ्रेड को हल्का करें
\nयदि आपके पास कोई भारी काम है, तो थ्रेड को ब्लॉक न करें। Web Workers का उपयोग करें या काम को माइक्रोटास्क में बांटें। लेकिन सबसे आसान तरीका है — जीरो डिले वाला setTimeout या requestIdleCallback।
// बुरा: सिंक्रोनस लोडिंग\nfunction loadBigData() {\n const data = [];\n for (let i = 0; i < 1000000; i++) {\n data.push({ id: i, value: Math.random() });\n }\n render(data);