रिएक्ट के कॉन्करेंट फ़ीचर्स को जानें और प्राथमिकता-आधारित रेंडरिंग में महारत हासिल करें। ऐप के प्रदर्शन को ऑप्टिमाइज़ करें और एक सहज उपयोगकर्ता अनुभव बनाएँ।
रिएक्ट कॉन्करेंट फ़ीचर्स: बेहतर उपयोगकर्ता अनुभव के लिए प्राथमिकता-आधारित रेंडरिंग में महारत हासिल करना
रिएक्ट कॉन्करेंट फ़ीचर्स इस बात में एक महत्वपूर्ण विकास का प्रतिनिधित्व करते हैं कि रिएक्ट एप्लिकेशन अपडेट और रेंडरिंग को कैसे संभालते हैं। इसका सबसे प्रभावशाली पहलुओं में से एक प्राथमिकता-आधारित रेंडरिंग है, जो डेवलपर्स को अधिक प्रतिक्रियाशील और प्रदर्शनकारी यूजर इंटरफेस बनाने की अनुमति देता है। यह लेख आपके रिएक्ट प्रोजेक्ट्स में प्राथमिकता-आधारित रेंडरिंग को समझने और लागू करने के लिए एक व्यापक गाइड प्रदान करता है।
रिएक्ट कॉन्करेंट फ़ीचर्स क्या हैं?
प्राथमिकता-आधारित रेंडरिंग में गहराई से जाने से पहले, रिएक्ट कॉन्करेंट फ़ीचर्स के व्यापक संदर्भ को समझना महत्वपूर्ण है। रिएक्ट 16 के साथ पेश की गई ये सुविधाएँ, रिएक्ट को समवर्ती रूप से कार्य करने में सक्षम बनाती हैं, जिसका अर्थ है कि मुख्य थ्रेड को ब्लॉक किए बिना कई अपडेट समानांतर में संसाधित किए जा सकते हैं। इससे एक अधिक तरल और प्रतिक्रियाशील उपयोगकर्ता अनुभव प्राप्त होता है, खासकर जटिल अनुप्रयोगों में।
कॉन्करेंट फ़ीचर्स के प्रमुख पहलुओं में शामिल हैं:
- इंटरप्टिबल रेंडरिंग: रिएक्ट प्राथमिकता के आधार पर रेंडरिंग कार्यों को रोक, फिर से शुरू या छोड़ सकता है।
- टाइम स्लाइसिंग: लंबे समय तक चलने वाले कार्यों को छोटे-छोटे टुकड़ों में तोड़ दिया जाता है, जिससे ब्राउज़र उपयोगकर्ता इनपुट के प्रति प्रतिक्रियाशील बना रहता है।
- सस्पेंस (Suspense): डेटा फ़ेचिंग जैसे एसिंक्रोनस संचालन को संभालने के लिए एक घोषणात्मक तरीका प्रदान करता है, जिससे UI ब्लॉकिंग को रोका जा सकता है।
- प्राथमिकता-आधारित रेंडरिंग: डेवलपर्स को विभिन्न अपडेट के लिए प्राथमिकताएँ निर्दिष्ट करने की अनुमति देता है, यह सुनिश्चित करते हुए कि सबसे महत्वपूर्ण परिवर्तन पहले रेंडर किए जाएँ।
प्राथमिकता-आधारित रेंडरिंग को समझना
प्राथमिकता-आधारित रेंडरिंग वह तंत्र है जिसके द्वारा रिएक्ट यह निर्धारित करता है कि DOM में अपडेट किस क्रम में लागू किए जाते हैं। प्राथमिकताएँ निर्दिष्ट करके, आप यह नियंत्रित कर सकते हैं कि कौन से अपडेट अधिक जरूरी माने जाते हैं और दूसरों से पहले रेंडर किए जाने चाहिए। यह यह सुनिश्चित करने के लिए विशेष रूप से उपयोगी है कि महत्वपूर्ण UI तत्व, जैसे उपयोगकर्ता इनपुट फ़ील्ड या एनिमेशन, तब भी प्रतिक्रियाशील बने रहें जब पृष्ठभूमि में अन्य, कम महत्वपूर्ण अपडेट हो रहे हों।
रिएक्ट इन अपडेट्स को प्रबंधित करने के लिए आंतरिक रूप से एक शेड्यूलर का उपयोग करता है। शेड्यूलर अपडेट्स को विभिन्न लेनों (सोचिए कि वे प्राथमिकता कतारें हैं) में वर्गीकृत करता है। उच्च प्राथमिकता वाली लेनों के अपडेट को कम प्राथमिकता वालों से पहले संसाधित किया जाता है।
प्राथमिकता-आधारित रेंडरिंग क्यों महत्वपूर्ण है?
प्राथमिकता-आधारित रेंडरिंग के लाभ अनेक हैं:
- बेहतर प्रतिक्रियाशीलता: महत्वपूर्ण अपडेट को प्राथमिकता देकर, आप भारी प्रसंस्करण के दौरान UI को अनुत्तरदायी होने से रोक सकते हैं। उदाहरण के लिए, एक इनपुट फ़ील्ड में टाइप करना हमेशा प्रतिक्रियाशील होना चाहिए, भले ही एप्लिकेशन एक साथ डेटा फ़ेच कर रहा हो।
- उन्नत उपयोगकर्ता अनुभव: एक प्रतिक्रियाशील और तरल UI एक बेहतर उपयोगकर्ता अनुभव की ओर ले जाता है। उपयोगकर्ताओं को लैग या देरी का अनुभव होने की संभावना कम होती है, जिससे एप्लिकेशन अधिक प्रदर्शनकारी महसूस होता है।
- अनुकूलित प्रदर्शन: रणनीतिक रूप से अपडेट को प्राथमिकता देकर, आप अनावश्यक री-रेंडर को कम कर सकते हैं और अपने एप्लिकेशन के समग्र प्रदर्शन को अनुकूलित कर सकते हैं।
- एसिंक्रोनस ऑपरेशंस का सुंदर प्रबंधन: कॉन्करेंट फ़ीचर्स, विशेष रूप से जब सस्पेंस के साथ संयुक्त होते हैं, तो आपको UI को ब्लॉक किए बिना डेटा फ़ेचिंग और अन्य एसिंक्रोनस ऑपरेशंस को प्रबंधित करने की अनुमति देते हैं।
रिएक्ट में प्राथमिकता-आधारित रेंडरिंग कैसे काम करती है
रिएक्ट का शेड्यूलर प्राथमिकता स्तरों के आधार पर अपडेट प्रबंधित करता है। जबकि रिएक्ट हर व्यक्तिगत अपडेट पर स्पष्ट रूप से प्राथमिकता स्तर सेट करने के लिए एक सीधा API प्रदान नहीं करता है, जिस तरह से आप अपने एप्लिकेशन की संरचना करते हैं और कुछ APIs का उपयोग करते हैं, वह अप्रत्यक्ष रूप से उस प्राथमिकता को प्रभावित करता है जो रिएक्ट विभिन्न अपडेट को सौंपता है। इन तंत्रों को समझना प्राथमिकता-आधारित रेंडरिंग का प्रभावी ढंग से लाभ उठाने की कुंजी है।
इवेंट हैंडलर्स के माध्यम से अप्रत्यक्ष प्राथमिकता
उपयोगकर्ता इंटरैक्शन द्वारा ट्रिगर किए गए अपडेट, जैसे क्लिक, की प्रेस, या फ़ॉर्म सबमिशन, को आम तौर पर एसिंक्रोनस ऑपरेशंस या टाइमर द्वारा ट्रिगर किए गए अपडेट की तुलना में उच्च प्राथमिकता दी जाती है। ऐसा इसलिए है क्योंकि रिएक्ट यह मानता है कि उपयोगकर्ता इंटरैक्शन अधिक समय-संवेदनशील होते हैं और तत्काल प्रतिक्रिया की आवश्यकता होती है।
उदाहरण:
```javascript function MyComponent() { const [text, setText] = React.useState(''); const handleChange = (event) => { setText(event.target.value); }; return ( ); } ```इस उदाहरण में, handleChange फ़ंक्शन, जो text स्टेट को अपडेट करता है, को उच्च प्राथमिकता दी जाएगी क्योंकि यह सीधे उपयोगकर्ता के इनपुट द्वारा ट्रिगर होता है। रिएक्ट इस अपडेट को रेंडर करने को प्राथमिकता देगा ताकि यह सुनिश्चित हो सके कि इनपुट फ़ील्ड प्रतिक्रियाशील बना रहे।
कम प्राथमिकता वाले अपडेट के लिए useTransition का उपयोग करना
useTransition हुक कुछ अपडेट्स को स्पष्ट रूप से कम जरूरी के रूप में चिह्नित करने के लिए एक शक्तिशाली उपकरण है। यह आपको UI को ब्लॉक किए बिना एक स्टेट से दूसरे स्टेट में संक्रमण करने की अनुमति देता है। यह उन अपडेट्स के लिए विशेष रूप से उपयोगी है जो बड़े री-रेंडर या जटिल गणनाओं को ट्रिगर करते हैं जो उपयोगकर्ता अनुभव के लिए तत्काल महत्वपूर्ण नहीं हैं।
useTransition दो मान लौटाता है:
isPending: एक बूलियन जो यह इंगित करता है कि संक्रमण वर्तमान में प्रगति पर है या नहीं।startTransition: एक फ़ंक्शन जो उस स्टेट अपडेट को रैप करता है जिसे आप स्थगित करना चाहते हैं।
उदाहरण:
```javascript import React, { useState, useTransition } from 'react'; function MyComponent() { const [isPending, startTransition] = useTransition(); const [filter, setFilter] = useState(''); const [data, setData] = useState([]); const handleFilterChange = (event) => { const newFilter = event.target.value; // Defer the state update that triggers the data filtering startTransition(() => { setFilter(newFilter); }); }; // Simulate data fetching and filtering based on the 'filter' state React.useEffect(() => { // Simulate an API call setTimeout(() => { const filteredData = Array.from({ length: 1000 }, (_, i) => `Item ${i}`).filter(item => item.includes(filter)); setData(filteredData); }, 500); }, [filter]); return (Filtering...
}-
{data.map((item, index) => (
- {item} ))}
इस उदाहरण में, handleFilterChange फ़ंक्शन setFilter स्टेट अपडेट को स्थगित करने के लिए startTransition का उपयोग करता है। इसका मतलब है कि रिएक्ट इस अपडेट को कम जरूरी मानेगा और यदि कोई उच्च-प्राथमिकता वाला अपडेट आता है (जैसे, दूसरा उपयोगकर्ता इंटरैक्शन) तो इसे बाधित कर सकता है। isPending फ़्लैग आपको संक्रमण के दौरान एक लोडिंग संकेतक प्रदर्शित करने की अनुमति देता है, जिससे उपयोगकर्ता को विज़ुअल फ़ीडबैक मिलता है।
useTransition के बिना, फ़िल्टर बदलने से तुरंत पूरी सूची का री-रेंडर ट्रिगर हो जाएगा, जिससे UI अनुत्तरदायी हो सकता है, खासकर एक बड़े डेटासेट के साथ। useTransition का उपयोग करके, फ़िल्टरिंग को कम प्राथमिकता वाले कार्य के रूप में किया जाता है, जिससे इनपुट फ़ील्ड को प्रतिक्रियाशील बने रहने की अनुमति मिलती है।
बैच्ड अपडेट्स को समझना
रिएक्ट जब भी संभव हो, कई स्टेट अपडेट्स को एक ही री-रेंडर में स्वचालित रूप से बैच करता है। यह एक प्रदर्शन अनुकूलन है जो रिएक्ट को DOM को अपडेट करने की संख्या को कम करता है। हालांकि, यह समझना महत्वपूर्ण है कि बैचिंग प्राथमिकता-आधारित रेंडरिंग के साथ कैसे इंटरैक्ट करती है।
जब अपडेट्स को बैच किया जाता है, तो उन सभी को समान प्राथमिकता वाला माना जाता है। इसका मतलब है कि यदि अपडेट्स में से एक उच्च प्राथमिकता वाला है (जैसे, उपयोगकर्ता इंटरैक्शन द्वारा ट्रिगर किया गया), तो सभी बैच किए गए अपडेट्स को उस उच्च प्राथमिकता के साथ रेंडर किया जाएगा।
Suspense की भूमिका
Suspense आपको डेटा लोड होने की प्रतीक्षा करते समय एक कंपोनेंट की रेंडरिंग को “सस्पेंड” करने की अनुमति देता है। यह डेटा फ़ेच होने के दौरान UI को ब्लॉक होने से रोकता है और आपको इस बीच एक फ़ॉलबैक UI (जैसे, एक लोडिंग स्पिनर) प्रदर्शित करने की अनुमति देता है।
जब कॉन्करेंट फ़ीचर्स के साथ उपयोग किया जाता है, तो Suspense प्राथमिकता-आधारित रेंडरिंग के साथ सहजता से एकीकृत हो जाता है। जब एक कंपोनेंट सस्पेंड होता है, तो रिएक्ट उच्च प्राथमिकता के साथ एप्लिकेशन के अन्य भागों को रेंडर करना जारी रख सकता है। एक बार डेटा लोड हो जाने के बाद, सस्पेंडेड कंपोनेंट को कम प्राथमिकता के साथ रेंडर किया जाएगा, यह सुनिश्चित करते हुए कि UI पूरी प्रक्रिया के दौरान प्रतिक्रियाशील बना रहे।
उदाहरण: import('./DataComponent'));
function MyComponent() {
return (
इस उदाहरण में, DataComponent को React.lazy का उपयोग करके आलसी रूप से लोड किया गया है। जब कंपोनेंट लोड हो रहा होता है, तो Suspense कंपोनेंट fallback UI प्रदर्शित करेगा। रिएक्ट एप्लिकेशन के अन्य भागों को रेंडर करना जारी रख सकता है जबकि DataComponent लोड हो रहा है, यह सुनिश्चित करते हुए कि UI प्रतिक्रियाशील बना रहे।
व्यावहारिक उदाहरण और उपयोग के मामले
आइए कुछ व्यावहारिक उदाहरण देखें कि विभिन्न परिदृश्यों में उपयोगकर्ता अनुभव को बेहतर बनाने के लिए प्राथमिकता-आधारित रेंडरिंग का उपयोग कैसे करें।
1. बड़े डेटासेट के साथ उपयोगकर्ता इनपुट को संभालना
कल्पना कीजिए कि आपके पास एक बड़ा डेटासेट है जिसे उपयोगकर्ता इनपुट के आधार पर फ़िल्टर करने की आवश्यकता है। प्राथमिकता-आधारित रेंडरिंग के बिना, इनपुट फ़ील्ड में टाइप करने से पूरे डेटासेट का री-रेंडर ट्रिगर हो सकता है, जिससे UI अनुत्तरदायी हो सकता है।
useTransition का उपयोग करके, आप फ़िल्टरिंग ऑपरेशन को स्थगित कर सकते हैं, जिससे इनपुट फ़ील्ड को प्रतिक्रियाशील बने रहने की अनुमति मिलती है, जबकि फ़िल्टरिंग पृष्ठभूमि में की जाती है। ('useTransition का उपयोग करना' अनुभाग में पहले प्रदान किया गया उदाहरण देखें)।
2. एनिमेशन को प्राथमिकता देना
एनिमेशन अक्सर एक सहज और आकर्षक उपयोगकर्ता अनुभव बनाने के लिए महत्वपूर्ण होते हैं। यह सुनिश्चित करके कि एनिमेशन अपडेट को उच्च प्राथमिकता दी जाती है, आप उन्हें अन्य, कम महत्वपूर्ण अपडेट द्वारा बाधित होने से रोक सकते हैं।
हालांकि आप सीधे एनिमेशन अपडेट की प्राथमिकता को नियंत्रित नहीं करते हैं, यह सुनिश्चित करना कि वे सीधे उपयोगकर्ता इंटरैक्शन (जैसे, एक क्लिक इवेंट जो एक एनिमेशन को ट्रिगर करता है) द्वारा ट्रिगर होते हैं, उन्हें अप्रत्यक्ष रूप से एक उच्च प्राथमिकता देगा।
उदाहरण:
```javascript import React, { useState } from 'react'; function AnimatedComponent() { const [isAnimating, setIsAnimating] = useState(false); const handleClick = () => { setIsAnimating(true); setTimeout(() => { setIsAnimating(false); }, 1000); // Animation duration }; return (इस उदाहरण में, handleClick फ़ंक्शन सीधे isAnimating स्टेट को सेट करके एनिमेशन को ट्रिगर करता है। चूँकि यह अपडेट एक उपयोगकर्ता इंटरैक्शन द्वारा ट्रिगर किया गया है, रिएक्ट इसे प्राथमिकता देगा, यह सुनिश्चित करते हुए कि एनिमेशन सुचारू रूप से चले।
3. डेटा फ़ेचिंग और सस्पेंस
किसी API से डेटा फ़ेच करते समय, यह महत्वपूर्ण है कि डेटा लोड होने के दौरान UI को ब्लॉक होने से रोका जाए। Suspense का उपयोग करके, आप डेटा फ़ेच होने के दौरान एक फ़ॉलबैक UI प्रदर्शित कर सकते हैं, और रिएक्ट डेटा उपलब्ध होने पर स्वचालित रूप से कंपोनेंट को रेंडर करेगा।
('Suspense की भूमिका' अनुभाग में पहले प्रदान किया गया उदाहरण देखें)।
प्राथमिकता-आधारित रेंडरिंग लागू करने के लिए सर्वोत्तम अभ्यास
प्राथमिकता-आधारित रेंडरिंग का प्रभावी ढंग से लाभ उठाने के लिए, निम्नलिखित सर्वोत्तम प्रथाओं पर विचार करें:
- महत्वपूर्ण अपडेट पहचानें: अपने एप्लिकेशन का सावधानीपूर्वक विश्लेषण करें ताकि उन अपडेट्स की पहचान की जा सके जो उपयोगकर्ता अनुभव के लिए सबसे महत्वपूर्ण हैं (जैसे, उपयोगकर्ता इनपुट, एनिमेशन)।
- गैर-महत्वपूर्ण अपडेट के लिए
useTransitionका उपयोग करें:useTransitionहुक का उपयोग करके उन अपडेट्स को स्थगित करें जो उपयोगकर्ता अनुभव के लिए तत्काल महत्वपूर्ण नहीं हैं। - डेटा फ़ेचिंग के लिए
Suspenseका लाभ उठाएं: डेटा फ़ेचिंग को संभालने और डेटा लोड होने के दौरान UI को ब्लॉक होने से रोकने के लिएSuspenseका उपयोग करें। - कंपोनेंट रेंडरिंग को ऑप्टिमाइज़ करें: मेमोइज़ेशन (
React.memo) जैसी तकनीकों का उपयोग करके और अनावश्यक स्टेट अपडेट से बचकर अनावश्यक री-रेंडर को कम करें। - अपने एप्लिकेशन को प्रोफ़ाइल करें: प्रदर्शन की बाधाओं और उन क्षेत्रों की पहचान करने के लिए रिएक्ट प्रोफ़ाइलर का उपयोग करें जहाँ प्राथमिकता-आधारित रेंडरिंग सबसे प्रभावी हो सकती है।
आम नुकसान और उनसे कैसे बचें
जबकि प्राथमिकता-आधारित रेंडरिंग प्रदर्शन में काफी सुधार कर सकती है, कुछ सामान्य नुकसानों से अवगत रहना महत्वपूर्ण है:
useTransitionका अत्यधिक उपयोग: बहुत सारे अपडेट्स को स्थगित करने से UI कम प्रतिक्रियाशील हो सकता है। केवल उन अपडेट्स के लिएuseTransitionका उपयोग करें जो वास्तव में गैर-महत्वपूर्ण हैं।- प्रदर्शन बाधाओं को अनदेखा करना: प्राथमिकता-आधारित रेंडरिंग कोई जादुई गोली नहीं है। अपने कंपोनेंट्स और डेटा फ़ेचिंग लॉजिक में अंतर्निहित प्रदर्शन समस्याओं को दूर करना महत्वपूर्ण है।
Suspenseका गलत तरीके से उपयोग करना: सुनिश्चित करें कि आपकीSuspenseसीमाएँ सही ढंग से रखी गई हैं और आपका फ़ॉलबैक UI एक अच्छा उपयोगकर्ता अनुभव प्रदान करता है।- प्रोफाइलिंग की उपेक्षा: प्रदर्शन की बाधाओं की पहचान करने और यह सत्यापित करने के लिए कि आपकी प्राथमिकता-आधारित रेंडरिंग रणनीति प्रभावी है, प्रोफाइलिंग आवश्यक है।
प्राथमिकता-आधारित रेंडरिंग समस्याओं का डीबगिंग
प्राथमिकता-आधारित रेंडरिंग से संबंधित समस्याओं को डीबग करना चुनौतीपूर्ण हो सकता है, क्योंकि शेड्यूलर का व्यवहार जटिल हो सकता है। डीबगिंग के लिए यहां कुछ सुझाव दिए गए हैं:
- रिएक्ट प्रोफ़ाइलर का उपयोग करें: रिएक्ट प्रोफ़ाइलर आपके एप्लिकेशन के प्रदर्शन में बहुमूल्य जानकारी प्रदान कर सकता है और आपको उन अपडेट्स की पहचान करने में मदद कर सकता है जिन्हें रेंडर होने में बहुत अधिक समय लग रहा है।
isPendingस्टेट की निगरानी करें: यदि आपuseTransitionका उपयोग कर रहे हैं, तो यह सुनिश्चित करने के लिएisPendingस्टेट की निगरानी करें कि अपडेट अपेक्षा के अनुरूप स्थगित किए जा रहे हैं।console.logस्टेटमेंट्स का उपयोग करें: अपने कंपोनेंट्स मेंconsole.logस्टेटमेंट्स जोड़ें ताकि यह ट्रैक किया जा सके कि वे कब रेंडर हो रहे हैं और उन्हें कौन सा डेटा मिल रहा है।- अपने एप्लिकेशन को सरल बनाएं: यदि आपको एक जटिल एप्लिकेशन को डीबग करने में परेशानी हो रही है, तो अनावश्यक कंपोनेंट्स और लॉजिक को हटाकर इसे सरल बनाने का प्रयास करें।
निष्कर्ष
रिएक्ट कॉन्करेंट फ़ीचर्स, और विशेष रूप से प्राथमिकता-आधारित रेंडरिंग, आपके रिएक्ट एप्लिकेशन के प्रदर्शन और प्रतिक्रियाशीलता को अनुकूलित करने के लिए शक्तिशाली उपकरण प्रदान करते हैं। यह समझकर कि रिएक्ट का शेड्यूलर कैसे काम करता है और useTransition और Suspense जैसे APIs का प्रभावी ढंग से उपयोग करके, आप एक अधिक तरल और आकर्षक उपयोगकर्ता अनुभव बना सकते हैं। अपने एप्लिकेशन का सावधानीपूर्वक विश्लेषण करना, महत्वपूर्ण अपडेट की पहचान करना और अपने कोड को प्रोफ़ाइल करना याद रखें ताकि यह सुनिश्चित हो सके कि आपकी प्राथमिकता-आधारित रेंडरिंग रणनीति प्रभावी है। दुनिया भर के उपयोगकर्ताओं को प्रसन्न करने वाले उच्च-प्रदर्शन वाले रिएक्ट एप्लिकेशन बनाने के लिए इन उन्नत सुविधाओं को अपनाएं।
जैसे-जैसे रिएक्ट इकोसिस्टम विकसित हो रहा है, आधुनिक और प्रदर्शनकारी वेब एप्लिकेशन बनाने के लिए नवीनतम सुविधाओं और सर्वोत्तम प्रथाओं के साथ अपडेट रहना महत्वपूर्ण है। प्राथमिकता-आधारित रेंडरिंग में महारत हासिल करके, आप जटिल UIs बनाने की चुनौतियों का सामना करने और असाधारण उपयोगकर्ता अनुभव प्रदान करने के लिए अच्छी तरह से सुसज्जित होंगे।
आगे सीखने के संसाधन
- रिएक्ट डॉक्यूमेंटेशन ऑन कॉन्करेंट मोड: https://react.dev/reference/react
- रिएक्ट प्रोफ़ाइलर: प्रदर्शन बाधाओं की पहचान करने के लिए रिएक्ट प्रोफ़ाइलर का उपयोग करना सीखें।
- लेख और ब्लॉग पोस्ट: मीडियम, Dev.to, और आधिकारिक रिएक्ट ब्लॉग जैसे प्लेटफार्मों पर रिएक्ट कॉन्करेंट फ़ीचर्स और प्राथमिकता-आधारित रेंडरिंग पर लेख और ब्लॉग पोस्ट खोजें।
- ऑनलाइन पाठ्यक्रम: उन ऑनलाइन पाठ्यक्रमों को लेने पर विचार करें जो रिएक्ट कॉन्करेंट फ़ीचर्स को विस्तार से कवर करते हैं।