7 छिपे हुए JavaScript Bottlenecks और उन्हें ठीक करने के तरीके
धीमी वेब ऐप्स शायद ही कभी खराब एल्गोरिदम के कारण विफल होती हैं। वे इसलिए विफल होती हैं क्योंकि आपका कोड ब्राउज़र के साथ कैसे संवाद (communicate) करता है।
मैंने 300 प्रोडक्शन एप्लिकेशन का प्रोफाइलिंग किया। 73% परफॉरमेंस संबंधी समस्याएं इन 7 स्रोतों से आती हैं।
- Layout thrashing यह तब होता है जब आप किसी प्रॉपर्टी को पढ़ते हैं, DOM में कुछ लिखते हैं, और फिर से पढ़ते हैं। यह ब्राउज़र को बार-बार लेआउट को recalculate करने के लिए मजबूर करता है।
- समाधान: पहले सभी reads को बैच में करें। फिर requestAnimationFrame का उपयोग करके सभी writes को बैच में करें।
- Unbounded event listeners किसी event listener को हटाए बिना जोड़ना memory leaks पैदा करता है। यह single-page apps में एक बड़ी समस्या है।
- समाधान: जब components unmount हों, तो listeners को साफ़ करने के लिए AbortController का उपयोग करें।
- लूप में Synchronous DOM reads लूप के अंदर offsetWidth या getBoundingClientRect को पढ़ने से लगातार reflows होते हैं।
- समाधान: लूप शुरू करने से पहले layout values को एक variable में कैश (cache) कर लें।
- requestAnimationFrame batching की कमी scroll या resize events पर सीधे DOM बदलाव बहुत बार होते हैं। इससे jank होता है।
- समाधान: अपडेट्स को paint cycle के साथ सिंक करने के लिए एक ticking variable और requestAnimationFrame का उपयोग करें।
- बड़े JSON.parse payloads बड़ी फाइलों को पार्स (parse) करना main thread को ब्लॉक कर देता है। इससे input lag होता है।
- समाधान: main thread से अलग डेटा पार्स करने के लिए Web Workers का उपयोग करें।
- जटिल CSS selector matching गहराई से नेस्टेड या जटिल selectors स्टाइल recalculations को धीमा कर देते हैं।
- समाधान: layout shifts खोजने के लिए Lighthouse का उपयोग करें और अपने selectors को सरल बनाएं।
- Duplicate bundle chunks बड़े, अनऑप्टिमाइज़्ड (unoptimized) bundles ट्रांसफर समय बर्बाद करते हैं।
- समाधान: डुप्लिकेट कोड खोजने और हटाने के लिए webpack-bundle-analyzer का उपयोग करें।
अपनी प्रगति को कैसे मापें:
- Chrome DevTools खोलें।
- Performance tab पर जाएं।
- 5-सेकंड का सेशन रिकॉर्ड करें।
- Main flame chart में 50ms से लंबे कार्यों (tasks) को देखें।
- एक समाधान लागू करें और Rendering और Painting समय की तुलना करें।
इन क्षेत्रों को ठीक करने से आपके Core Web Vitals में सुधार होता है, विशेष रूप से Largest Contentful Paint और Interaction to Next Paint में।