स्टेटिक एनालिसिस द्वारा जावास्क्रिप्ट मॉड्यूल इम्पोर्ट्स को ऑप्टिमाइज़ कर वैश्विक डेवलपर्स के लिए एप्लिकेशन का प्रदर्शन और रखरखाव बढ़ाएं।
प्रदर्शन को अनलॉक करना: जावास्क्रिप्ट मॉड्यूल इम्पोर्ट्स और स्टेटिक एनालिसिस ऑप्टिमाइज़ेशन
वेब डेवलपमेंट के निरंतर विकसित हो रहे परिदृश्य में, प्रदर्शन और रखरखाव सर्वोपरि हैं। जैसे-जैसे जावास्क्रिप्ट एप्लिकेशन की जटिलता बढ़ती है, निर्भरता (dependencies) का प्रबंधन करना और कुशल कोड निष्पादन सुनिश्चित करना एक महत्वपूर्ण चुनौती बन जाता है। ऑप्टिमाइज़ेशन के लिए सबसे प्रभावशाली क्षेत्रों में से एक जावास्क्रिप्ट मॉड्यूल इम्पोर्ट्स और उन्हें संसाधित करने के तरीके में निहित है, विशेष रूप से स्टेटिक एनालिसिस के दृष्टिकोण से। यह पोस्ट मॉड्यूल इम्पोर्ट्स की जटिलताओं में गहराई से उतरेगी, अक्षमताओं की पहचान करने और उन्हें हल करने में स्टेटिक एनालिसिस की शक्ति का पता लगाएगी, और दुनिया भर के डेवलपर्स को तेज, अधिक मजबूत एप्लिकेशन बनाने के लिए कार्रवाई योग्य अंतर्दृष्टि प्रदान करेगी।
जावास्क्रिप्ट मॉड्यूल को समझना: आधुनिक विकास की नींव
ऑप्टिमाइज़ेशन में गोता लगाने से पहले, जावास्क्रिप्ट मॉड्यूल की ठोस समझ होना महत्वपूर्ण है। मॉड्यूल हमें अपने कोड को छोटे, प्रबंधनीय और पुन: प्रयोज्य टुकड़ों में तोड़ने की अनुमति देते हैं। यह मॉड्यूलर दृष्टिकोण स्केलेबल एप्लिकेशन बनाने, बेहतर कोड संगठन को बढ़ावा देने और विकास टीमों के बीच सहयोग को सुविधाजनक बनाने के लिए मौलिक है, चाहे उनका भौगोलिक स्थान कुछ भी हो।
CommonJS बनाम ES मॉड्यूल: दो प्रणालियों की कहानी
ऐतिहासिक रूप से, जावास्क्रिप्ट विकास CommonJS मॉड्यूल सिस्टम पर बहुत अधिक निर्भर था, जो Node.js वातावरण में प्रचलित है। CommonJS एक सिंक्रोनस, फ़ंक्शन-आधारित `require()` सिंटैक्स का उपयोग करता है। हालांकि यह प्रभावी है, यह सिंक्रोनस प्रकृति ब्राउज़र वातावरण में चुनौतियां पेश कर सकती है जहां प्रदर्शन के लिए अक्सर एसिंक्रोनस लोडिंग को प्राथमिकता दी जाती है।
ECMAScript मॉड्यूल (ES मॉड्यूल) के आगमन ने मॉड्यूल प्रबंधन के लिए एक मानकीकृत, घोषणात्मक दृष्टिकोण लाया। `import` और `export` सिंटैक्स के साथ, ES मॉड्यूल एक अधिक शक्तिशाली और लचीली प्रणाली प्रदान करते हैं। प्रमुख लाभों में शामिल हैं:
- स्टेटिक एनालिसिस के अनुकूल: `import` और `export` स्टेटमेंट बिल्ड समय पर हल हो जाते हैं, जिससे टूल को निर्भरता का विश्लेषण करने और कोड को निष्पादित किए बिना ऑप्टिमाइज़ करने की अनुमति मिलती है।
- एसिंक्रोनस लोडिंग: ES मॉड्यूल स्वाभाविक रूप से एसिंक्रोनस लोडिंग के लिए डिज़ाइन किए गए हैं, जो कुशल ब्राउज़र रेंडरिंग के लिए महत्वपूर्ण है।
- टॉप-लेवल `await` और डायनेमिक इम्पोर्ट्स: ये सुविधाएँ मॉड्यूल लोडिंग पर अधिक परिष्कृत नियंत्रण सक्षम करती हैं।
हालांकि Node.js धीरे-धीरे ES मॉड्यूल को अपना रहा है, फिर भी कई मौजूदा प्रोजेक्ट CommonJS का लाभ उठाते हैं। प्रभावी मॉड्यूल प्रबंधन के लिए अंतरों को समझना और यह जानना कि प्रत्येक का उपयोग कब करना है, महत्वपूर्ण है।
मॉड्यूल ऑप्टिमाइज़ेशन में स्टेटिक एनालिसिस की महत्वपूर्ण भूमिका
स्टेटिक एनालिसिस में कोड को वास्तव में निष्पादित किए बिना उसकी जांच करना शामिल है। जावास्क्रिप्ट मॉड्यूल के संदर्भ में, स्टेटिक एनालिसिस टूल कर सकते हैं:
- डेड कोड की पहचान करें: उस कोड का पता लगाएं और उसे हटाएं जिसे इम्पोर्ट तो किया गया है लेकिन कभी उपयोग नहीं किया गया।
- निर्भरता का समाधान करें: एप्लिकेशन के पूरे निर्भरता ग्राफ का नक्शा बनाएं।
- बंडलिंग को ऑप्टिमाइज़ करें: तेजी से लोडिंग के लिए संबंधित मॉड्यूल को कुशलता से समूहित करें।
- त्रुटियों का शीघ्र पता लगाएं: रनटाइम से पहले सर्कुलर निर्भरता या गलत इम्पोर्ट जैसी संभावित समस्याओं को पकड़ें।
यह सक्रिय दृष्टिकोण आधुनिक जावास्क्रिप्ट बिल्ड पाइपलाइनों का एक आधारशिला है। Webpack, Rollup, और Parcel जैसे टूल अपना जादू चलाने के लिए स्टेटिक एनालिसिस पर बहुत अधिक भरोसा करते हैं।
ट्री शेकिंग: अप्रयुक्त को हटाना
शायद ES मॉड्यूल के स्टेटिक एनालिसिस द्वारा सक्षम सबसे महत्वपूर्ण ऑप्टिमाइज़ेशन ट्री शेकिंग है। ट्री शेकिंग एक मॉड्यूल ग्राफ से अप्रयुक्त एक्सपोर्ट को हटाने की प्रक्रिया है। जब आपका बंडलर आपके `import` स्टेटमेंट का स्थिर रूप से विश्लेषण कर सकता है, तो यह निर्धारित कर सकता है कि आपके एप्लिकेशन में वास्तव में कौन से विशिष्ट फ़ंक्शन, क्लास या वैरिएबल का उपयोग किया जा रहा है। किसी भी एक्सपोर्ट को जो संदर्भित नहीं किया गया है, उसे अंतिम बंडल से सुरक्षित रूप से छाँटा जा सकता है।
एक ऐसे परिदृश्य पर विचार करें जहां आप एक पूरी यूटिलिटी लाइब्रेरी इम्पोर्ट करते हैं:
// utils.js
export function usefulFunction() {
// ...
}
export function anotherUsefulFunction() {
// ...
}
export function unusedFunction() {
// ...
}
और आपके एप्लिकेशन में:
// main.js
import { usefulFunction } from './utils';
usefulFunction();
ट्री शेकिंग करने वाला एक बंडलर यह पहचान लेगा कि केवल `usefulFunction` इम्पोर्ट और उपयोग किया गया है। `anotherUsefulFunction` और `unusedFunction` को अंतिम बंडल से बाहर रखा जाएगा, जिससे एक छोटा, तेजी से लोड होने वाला एप्लिकेशन बनेगा। यह उन लाइब्रेरियों के लिए विशेष रूप से प्रभावशाली है जो कई यूटिलिटीज को एक्सपोज करती हैं, क्योंकि उपयोगकर्ता केवल वही इम्पोर्ट कर सकते हैं जिसकी उन्हें आवश्यकता है।
मुख्य सीख: ट्री शेकिंग क्षमताओं का पूरी तरह से लाभ उठाने के लिए ES मॉड्यूल (`import`/`export`) अपनाएं।
मॉड्यूल रेजोल्यूशन: आपको जो चाहिए उसे खोजना
जब आप एक `import` स्टेटमेंट लिखते हैं, तो जावास्क्रिप्ट रनटाइम या बिल्ड टूल को संबंधित मॉड्यूल का पता लगाने की आवश्यकता होती है। इस प्रक्रिया को मॉड्यूल रेजोल्यूशन कहा जाता है। स्टेटिक एनालिसिस यहां एक महत्वपूर्ण भूमिका निभाता है, यह सम्मेलनों को समझकर जैसे:
- फ़ाइल एक्सटेंशन: क्या `.js`, `.mjs`, `.cjs` अपेक्षित हैं।
- `package.json` में `main`, `module`, `exports` फ़ील्ड्स: ये फ़ील्ड्स बंडलर्स को एक पैकेज के लिए सही एंट्री पॉइंट के लिए मार्गदर्शन करते हैं, जो अक्सर CommonJS और ES मॉड्यूल संस्करणों के बीच अंतर करते हैं।
- इंडेक्स फ़ाइलें: निर्देशिकाओं को मॉड्यूल के रूप में कैसे माना जाता है (उदाहरण के लिए, `import 'lodash'` `lodash/index.js` में हल हो सकता है)।
- मॉड्यूल पाथ एलियास: इम्पोर्ट पाथ को छोटा करने या उपनाम देने के लिए बिल्ड टूल में कस्टम कॉन्फ़िगरेशन (जैसे, `../../components/Button` के बजाय `@/components/Button`)।
स्टेटिक एनालिसिस यह सुनिश्चित करने में मदद करता है कि मॉड्यूल रेजोल्यूशन नियतात्मक और पूर्वानुमानित हो, रनटाइम त्रुटियों को कम करता है और अन्य ऑप्टिमाइज़ेशन के लिए निर्भरता ग्राफ की सटीकता में सुधार करता है।
कोड स्प्लिटिंग: ऑन-डिमांड लोडिंग
`import` स्टेटमेंट का सीधे तौर पर ऑप्टिमाइज़ेशन न होते हुए भी, कोड स्प्लिटिंग के लिए स्टेटिक एनालिसिस महत्वपूर्ण है। कोड स्प्लिटिंग आपको अपने एप्लिकेशन के बंडल को छोटे टुकड़ों में तोड़ने की अनुमति देता है जिन्हें मांग पर लोड किया जा सकता है। यह प्रारंभिक लोड समय में भारी सुधार करता है, विशेष रूप से बड़े, सिंगल-पेज एप्लिकेशन (SPAs) के लिए।
डायनेमिक `import()` सिंटैक्स यहां महत्वपूर्ण है:
// Load a component only when needed, e.g., on button click
button.addEventListener('click', async () => {
const module = await import('./heavy-component');
const HeavyComponent = module.default;
// Render HeavyComponent
});
Webpack जैसे बंडलर इम्पोर्ट किए गए मॉड्यूल के लिए अलग-अलग चंक्स बनाने के लिए इन डायनेमिक `import()` कॉल्स का स्थिर रूप से विश्लेषण कर सकते हैं। इसका मतलब है कि उपयोगकर्ता का ब्राउज़र केवल वर्तमान दृश्य के लिए आवश्यक जावास्क्रिप्ट डाउनलोड करता है, जिससे एप्लिकेशन बहुत अधिक प्रतिक्रियाशील महसूस होता है।
वैश्विक प्रभाव: धीमी इंटरनेट कनेक्शन वाले क्षेत्रों में उपयोगकर्ताओं के लिए, कोड स्प्लिटिंग एक गेम-चेंजर हो सकता है, जो आपके एप्लिकेशन को सुलभ और प्रदर्शनकारी बनाता है।
मॉड्यूल इम्पोर्ट्स को ऑप्टिमाइज़ करने के लिए व्यावहारिक रणनीतियाँ
मॉड्यूल इम्पोर्ट ऑप्टिमाइज़ेशन के लिए स्टेटिक एनालिसिस का लाभ उठाने के लिए आपको अपने कोड की संरचना और अपने बिल्ड टूल को कॉन्फ़िगर करने के तरीके में एक सचेत प्रयास की आवश्यकता है।
1. ES मॉड्यूल (ESM) अपनाएं
जहां संभव हो, अपने कोडबेस को ES मॉड्यूल का उपयोग करने के लिए माइग्रेट करें। यह ट्री शेकिंग जैसी स्टेटिक एनालिसिस सुविधाओं से लाभ उठाने का सबसे सीधा रास्ता प्रदान करता है। कई आधुनिक जावास्क्रिप्ट लाइब्रेरी अब ESM बिल्ड प्रदान करती हैं, जो अक्सर उनके `package.json` में `module` फ़ील्ड द्वारा इंगित की जाती हैं।
2. ट्री शेकिंग के लिए अपने बंडलर को कॉन्फ़िगर करें
अधिकांश आधुनिक बंडलर (Webpack, Rollup, Parcel, Vite) में ES मॉड्यूल का उपयोग करते समय ट्री शेकिंग डिफ़ॉल्ट रूप से सक्षम होती है। हालांकि, यह सुनिश्चित करना और इसकी कॉन्फ़िगरेशन को समझना एक अच्छी प्रथा है:
- Webpack: सुनिश्चित करें कि `mode` `'production'` पर सेट है। Webpack का प्रोडक्शन मोड स्वचालित रूप से ट्री शेकिंग को सक्षम करता है।
- Rollup: ट्री शेकिंग एक मुख्य विशेषता है और यह डिफ़ॉल्ट रूप से सक्षम है।
- Vite: प्रोडक्शन बिल्ड के लिए हुड के तहत Rollup का लाभ उठाता है, जो उत्कृष्ट ट्री शेकिंग सुनिश्चित करता है।
आपके द्वारा बनाए रखी गई लाइब्रेरियों के लिए, सुनिश्चित करें कि आपकी बिल्ड प्रक्रिया आपके उपभोक्ताओं के लिए ट्री शेकिंग को सक्षम करने के लिए ES मॉड्यूल को सही ढंग से एक्सपोर्ट करती है।
3. कोड स्प्लिटिंग के लिए डायनेमिक इम्पोर्ट्स का उपयोग करें
अपने एप्लिकेशन के उन हिस्सों की पहचान करें जिनकी तुरंत आवश्यकता नहीं है (जैसे, कम बार एक्सेस की जाने वाली सुविधाएँ, बड़े कंपोनेंट्स, रूट्स) और उन्हें आलस्य से लोड करने के लिए डायनेमिक `import()` का उपयोग करें। यह कथित प्रदर्शन में सुधार के लिए एक शक्तिशाली तकनीक है।
उदाहरण: React Router जैसे फ्रेमवर्क में रूट-आधारित कोड स्प्लिटिंग:
import React, { Suspense, lazy } from 'react';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
const HomePage = lazy(() => import('./pages/HomePage'));
const AboutPage = lazy(() => import('./pages/AboutPage'));
const ContactPage = lazy(() => import('./pages/ContactPage'));
function App() {
return (
Loading...
इस उदाहरण में, प्रत्येक पेज कंपोनेंट अपने स्वयं के जावास्क्रिप्ट चंक में है, जो केवल तभी लोड होता है जब उपयोगकर्ता उस विशिष्ट रूट पर नेविगेट करता है।
4. थर्ड-पार्टी लाइब्रेरी उपयोग को ऑप्टिमाइज़ करें
बड़ी लाइब्रेरियों से इम्पोर्ट करते समय, ट्री शेकिंग को अधिकतम करने के लिए आप जो इम्पोर्ट करते हैं उसके बारे में विशिष्ट रहें।
इसके बजाय:
import _ from 'lodash';
_.debounce(myFunc, 300);
इसे प्राथमिकता दें:
import debounce from 'lodash/debounce';
debounce(myFunc, 300);
यह बंडलर्स को पूरी Lodash लाइब्रेरी के बजाय, केवल `debounce` फ़ंक्शन को अधिक सटीक रूप से पहचानने और शामिल करने की अनुमति देता है।
5. मॉड्यूल पाथ एलियास कॉन्फ़िगर करें
Webpack, Vite, और Parcel जैसे टूल आपको पाथ एलियास कॉन्फ़िगर करने की अनुमति देते हैं। यह आपके `import` स्टेटमेंट को सरल बना सकता है और पठनीयता में सुधार कर सकता है, साथ ही आपके बिल्ड टूल के लिए मॉड्यूल रेजोल्यूशन प्रक्रिया में भी सहायता करता है।
`vite.config.js` में उदाहरण कॉन्फ़िगरेशन:
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
export default defineConfig({
plugins: [react()],
resolve: {
alias: {
'@': '/src',
'@components': '/src/components',
},
},
});
यह आपको लिखने की अनुमति देता है:
import Button from '@/components/Button';
इसके बजाय:
import Button from '../../components/Button';
6. साइड इफेक्ट्स के प्रति सचेत रहें
ट्री शेकिंग स्थिर `import` और `export` स्टेटमेंट का विश्लेषण करके काम करता है। यदि किसी मॉड्यूल में साइड इफेक्ट्स हैं (जैसे, वैश्विक ऑब्जेक्ट्स को संशोधित करना, प्लगइन्स को पंजीकृत करना) जो सीधे एक एक्सपोर्टेड मूल्य से नहीं जुड़े हैं, तो बंडलर्स को इसे सुरक्षित रूप से हटाने में संघर्ष करना पड़ सकता है। लाइब्रेरियों को अपने `package.json` में `"sideEffects": false` प्रॉपर्टी का उपयोग करना चाहिए ताकि बंडलर्स को स्पष्ट रूप से बताया जा सके कि उनके मॉड्यूल में कोई साइड इफेक्ट नहीं है, जिससे अधिक आक्रामक ट्री शेकिंग सक्षम हो सके।
लाइब्रेरियों के उपभोक्ता के रूप में, यदि आप एक ऐसी लाइब्रेरी का सामना करते हैं जिसे प्रभावी ढंग से ट्री-शेक नहीं किया जा रहा है, तो `sideEffects` प्रॉपर्टी के लिए उसके `package.json` की जांच करें। यदि यह `false` पर सेट नहीं है या अपने साइड इफेक्ट्स को सटीक रूप से सूचीबद्ध नहीं करता है, तो यह ऑप्टिमाइज़ेशन में बाधा डाल सकता है।
7. सर्कुलर निर्भरता को समझें
सर्कुलर निर्भरता तब होती है जब मॉड्यूल A मॉड्यूल B को इम्पोर्ट करता है, और मॉड्यूल B मॉड्यूल A को इम्पोर्ट करता है। जबकि CommonJS कभी-कभी इन्हें सहन कर सकता है, ES मॉड्यूल अधिक सख्त होते हैं और अप्रत्याशित व्यवहार या अपूर्ण आरंभीकरण का कारण बन सकते हैं। स्टेटिक एनालिसिस टूल अक्सर इनका पता लगा सकते हैं, और बिल्ड टूल में इनसे संबंधित विशिष्ट रणनीतियाँ या त्रुटियाँ हो सकती हैं। एक स्वस्थ मॉड्यूल ग्राफ के लिए सर्कुलर निर्भरता को हल करना (अक्सर रिफैक्टरिंग या सामान्य तर्क निकालकर) महत्वपूर्ण है।
वैश्विक डेवलपर अनुभव: संगति और प्रदर्शन
दुनिया भर के डेवलपर्स के लिए, इन मॉड्यूल ऑप्टिमाइज़ेशन तकनीकों को समझना और लागू करना एक अधिक सुसंगत और प्रदर्शनकारी विकास अनुभव की ओर ले जाता है:
- तेज बिल्ड समय: कुशल मॉड्यूल प्रोसेसिंग विकास के दौरान तेज फीडबैक लूप का कारण बन सकती है।
- कम बंडल आकार: छोटे बंडलों का मतलब है तेज डाउनलोड और तेज एप्लिकेशन स्टार्टअप, जो विभिन्न नेटवर्क स्थितियों पर उपयोगकर्ताओं के लिए महत्वपूर्ण है।
- बेहतर रनटाइम प्रदर्शन: पार्स और निष्पादित करने के लिए कम कोड सीधे एक तेज उपयोगकर्ता अनुभव में तब्दील हो जाता है।
- बढ़ी हुई रखरखाव क्षमता: एक अच्छी तरह से संरचित, मॉड्यूलर कोडबेस को समझना, डीबग करना और विस्तारित करना आसान होता है।
इन प्रथाओं को अपनाकर, विकास दल यह सुनिश्चित कर सकते हैं कि उनके एप्लिकेशन वैश्विक दर्शकों के लिए प्रदर्शनकारी और सुलभ हों, चाहे उनकी इंटरनेट स्पीड या डिवाइस क्षमता कुछ भी हो।
भविष्य के रुझान और विचार
जावास्क्रिप्ट पारिस्थितिकी तंत्र लगातार नवाचार कर रहा है। यहां मॉड्यूल इम्पोर्ट और ऑप्टिमाइज़ेशन के संबंध में कुछ रुझान दिए गए हैं जिन पर नज़र रखनी चाहिए:
- HTTP/3 और सर्वर पुश: नए नेटवर्क प्रोटोकॉल मॉड्यूल वितरित करने के तरीके को प्रभावित कर सकते हैं, संभावित रूप से कोड स्प्लिटिंग और बंडलिंग की गतिशीलता को बदल सकते हैं।
- ब्राउज़रों में नेटिव ES मॉड्यूल: व्यापक रूप से समर्थित होने के बावजूद, ब्राउज़र-नेटिव मॉड्यूल लोडिंग की बारीकियां विकसित होती रहती हैं।
- बिल्ड टूल का विकास: Vite जैसे टूल तेज बिल्ड समय और अधिक बुद्धिमान ऑप्टिमाइज़ेशन के साथ सीमाओं को आगे बढ़ा रहे हैं, अक्सर स्टेटिक एनालिसिस में प्रगति का लाभ उठाते हैं।
- WebAssembly (Wasm): जैसे-जैसे Wasm कर्षण प्राप्त कर रहा है, यह समझना कि मॉड्यूल Wasm कोड के साथ कैसे इंटरैक्ट करते हैं, तेजी से महत्वपूर्ण हो जाएगा।
निष्कर्ष
जावास्क्रिप्ट मॉड्यूल इम्पोर्ट्स केवल सिंटैक्स से कहीं अधिक हैं; वे आधुनिक एप्लिकेशन आर्किटेक्चर की रीढ़ हैं। ES मॉड्यूल की ताकत को समझकर और परिष्कृत बिल्ड टूल के माध्यम से स्टेटिक एनालिसिस की शक्ति का उपयोग करके, डेवलपर्स महत्वपूर्ण प्रदर्शन लाभ प्राप्त कर सकते हैं। ट्री शेकिंग, कोड स्प्लिटिंग और ऑप्टिमाइज़्ड मॉड्यूल रेजोल्यूशन जैसी तकनीकें केवल ऑप्टिमाइज़ेशन के लिए ऑप्टिमाइज़ेशन नहीं हैं; वे तेज, स्केलेबल और रखरखाव योग्य एप्लिकेशन बनाने के लिए आवश्यक प्रथाएं हैं जो दुनिया भर के उपयोगकर्ताओं को एक असाधारण अनुभव प्रदान करती हैं। अपने विकास वर्कफ़्लो में मॉड्यूल ऑप्टिमाइज़ेशन को प्राथमिकता दें, और अपने जावास्क्रिप्ट प्रोजेक्ट्स की वास्तविक क्षमता को अनलॉक करें।
कार्रवाई योग्य अंतर्दृष्टि:
- ES मॉड्यूल अपनाने को प्राथमिकता दें।
- आक्रामक ट्री शेकिंग के लिए अपने बंडलर को कॉन्फ़िगर करें।
- गैर-महत्वपूर्ण सुविधाओं के लिए कोड स्प्लिटिंग के लिए डायनेमिक इम्पोर्ट लागू करें।
- थर्ड-पार्टी लाइब्रेरियों से इम्पोर्ट करते समय विशिष्ट रहें।
- स्वच्छ इम्पोर्ट के लिए पाथ एलियास का पता लगाएं और कॉन्फ़िगर करें।
- सुनिश्चित करें कि आपके द्वारा उपयोग की जाने वाली लाइब्रेरी "sideEffects" को सही ढंग से घोषित करती हैं।
इन पहलुओं पर ध्यान केंद्रित करके, आप वैश्विक उपयोगकर्ता आधार के लिए अधिक कुशल और प्रदर्शनकारी एप्लिकेशन बना सकते हैं।