प्रतिक्रिया में कक्षा बनाम कार्यात्मक घटक, और सुपर-गुप्त तीसरा विकल्प

मैं च्यवनप्राश पसंद करता हूं।

जैसा कि मैंने रिएक्ट में अपना फ़ॉरेस्ट शुरू किया है, मैं जो सवाल सबसे अधिक बार सुनता हूं वह यह है कि "मैं सिर्फ हर चीज के लिए क्लास के घटक का उपयोग क्यों नहीं करूंगा?" क्यों कार्यात्मक घटकों के साथ भी परेशान?

कुछ कार्यात्मक प्रोग्रामिंग डाई-हार्ड क्या कह सकते हैं, इसके बावजूद यह जरूरी नहीं कि एक बुरा सवाल है। आखिरकार, कक्षा के घटक हमें इतना अधिक लचीलापन देते हैं, एक साधारण, class गूंगा ’घटक की तुलना में बहुत अधिक क्षमता। निश्चित रूप से कुछ अच्छे कारण हैं कि हम भी शुरू करने के लिए कार्यात्मक (या ’स्टेटलेस’) घटकों से परेशान हैं।

खैर, कुछ खुदाई के बाद, उत्तर है ...

व्यक्तिपरक।

तो चलो जल्दी से दो प्रकारों पर चलते हैं और आप एक से दूसरे का उपयोग क्यों करना चाहते हैं।

कार्यात्मक घटक

शायद रिएक्ट समुदाय में known स्टेटलेस ’घटकों के रूप में बेहतर जाना जाता है, ये वही हैं जो टिन पर कहते हैं: स्टेटलेस फ़ंक्शन। इसकी स्वयं की विधियाँ या इसको संदर्भित करने में असमर्थता के कारण, सभी स्टेटलेस घटक वास्तव में कुछ JSX (या React.createElement) (यदि आप पुराने स्कूल हैं) वापस करके एक रेंडर कर सकते हैं।

उनके पास इसकी कोई पहुंच नहीं है, इसलिए उनके पास अपना राज्य नहीं हो सकता है, न ही उनके पास उसी कारण से जीवनचक्र के तरीके हो सकते हैं। उन लोगों के लिए, आपको…

कक्षा के घटक

रिएक्ट के ढांचे की रोटी और मक्खन, क्लास के घटक यह सब कर सकते हैं: राज्य, जीवनचक्र की विधियाँ, नियमित तरीके और रेंडरिंग, सभी एक सुव्यवस्थित वर्ग निकाय के अंदर लिपटे हुए।

साफ! अब, कौन सा उपयोग करें?

पसंद का भ्रम

क्या एक चिंताजनक उपशीर्षक! इनमें से प्रत्येक के बारे में पढ़ने के बाद, आप शायद "स्पष्ट रूप से सोच रहे हैं, एक सांख्यिकीय घटक का उपयोग करें यदि आपको केवल सहारा के आधार पर कुछ प्रस्तुत करने की आवश्यकता है!" और आप सही हैं आमतौर पर, यह ठीक यही है कि आप एक सांख्यिकीय घटक का उपयोग करने के बारे में क्यों सोचते हैं, लेकिन प्रदर्शन के बारे में क्या? स्मृति?

ये ज्यादातर वर्ग घटक के आकार पर निर्भर करते हैं। ध्यान रखें कि इन दोनों प्रकारों को स्थानांतरित करने की आवश्यकता होगी, जो स्वयं स्मृति को प्रभावित करने वाला है। स्पष्ट रूप से एक अधिक विस्तृत फ़ाइल अधिक मेमोरी का उपयोग करने वाली है और एक साधारण स्टेटलेस घटक की तुलना में अधिक प्रदर्शन को प्रभावित करती है, जो कि इसके गुण से, यह केवल इतना बड़ा हो सकता है इससे पहले कि आप शायद इसका पुनर्मूल्यांकन करें यदि यह केवल एक घटक या अधिक होना चाहिए।

तो उस डरावने उपशीर्षक के बारे में क्या? आइए हम रिएक्ट एक्सपर्ट डैन अब्रामोव से पूछें।

इसे नमक के एक दाने के साथ लें, क्योंकि यह इस बिंदु पर थोड़ा दिनांकित है और इस मामले पर अपडेट को खोदना मुश्किल है और रिएक्ट टीम के अन्य डेवलपर्स ने कहा है कि कार्यात्मक घटकों की गति में कुछ सुधार किए गए हैं। काफी समय से स्टेटलेस घटकों के अनुकूलन के लिए भी बात की जा रही है ताकि वे रेखा से अधिक उपयोगी साबित हों।

मेरे स्वयं के कुछ बेंचमार्क परीक्षण के बाद, ऐसा लगता है कि कार्यात्मक घटकों में औसतन लगभग 20% तेजी से चलने की क्षमता है, जो कि छड़ी को हिलाकर रख देने के लिए कुछ भी नहीं है।

और फिर भी ... एक और तरीका है ...

स्पोइलर अलर्ट: असली जावास्क्रिप्ट है

मैं इसका स्पष्ट रूप से पालन-पोषण करता हूं, फिलिप लेहोक्स के मीडियम आर्टिकल 45% फास्टर रीएक्ट फंक्शनल फंक्शनल कंपोनेंट्स का अवलोकन करना। इस कारण से कि कार्यात्मक घटक तुरंत वर्ग घटकों की तुलना में बहुत तेज नहीं होते हैं, क्योंकि वे अभी भी React.Component का विस्तार कर रहे हैं और इसके अलावा, वर्ग घटक के सभी तर्क अभी भी लोड हो रहे हैं!

तो इन गूंगे घटकों को तेज करने के लिए, हमें अनावश्यक बैगेज को बायपास करने की आवश्यकता है जो कि React.Component हमें सौंपता है, और अगर हमें रिएक्ट से गुजरना पड़ता है, तो जवाब अच्छा है 'जेएस।

बूम।

मुझे पता है। यह इतना सरल है, फिर भी इतना सुंदर है। इसके अलावा, मेरे बेंचमार्क परीक्षणों में, इसने सामान्य वर्ग के घटक को 51% से हरा दिया। 51!

आइए ट्रांसप्लिमेंटेशन को देखें और देखें कि यह क्यों है।

डायरेक्ट फंक्शन कॉल बनाम घटक इंस्टेंटेशन

हमारे सामान्य घटक तात्कालिकता में, हमने अपने DOM ट्री को बनाने के लिए नेस्टेड .createElement () कॉल किया है, लेकिन सीधे फ़ंक्शन कॉल के साथ हम बस अपने फ़ंक्शन के रिटर्न वैल्यू में ड्रॉप कर सकते हैं।

तो, सच क्या है?

(क्षमा करें मुझे अवसोस नहीं है)

दिन के अंत में, takeaways क्या हैं?

  1. कक्षाएं अधिक शक्तिशाली और लचीली होती हैं,
  2. स्टेटमलेस थोड़ा तेज़ हैं (और कम टाइपिंग की आवश्यकता है!), अनुकूलन की हवा पर कुछ वादों के साथ,
  3. यदि आपके द्वारा प्राप्त किए जा सकने वाले सभी प्रदर्शनों को निचोड़ने की आवश्यकता है, तो आपके लिए उपलब्ध (कुछ अप्राप्य) स्पीड-हैक है।
  4. दिन के अंत में, घटक के लिए नंगे न्यूनतम जो भी हो। यह शायद सही विकल्प है