Back to Question Center
0

सर्वर-प्रतिपादित प्रतिक्रिया में एसिंक्रोनस एपीआई के साथ लेनदेन            सर्वर-रेंडर किए गए रिएक्टसंबंधित विषयों में एसिंक्रोनस एपीआई के साथ लेनदेन: ES6Raw मिमल

1 answers:
सर्वर-प्रतिपादित प्रतिक्रिया में एसिंक्रोनस एपीआई के साथ लेनदेन

प्रतिक्रिया के लिए एक उच्च-गुणवत्ता, गहन परिचय के लिए, आप कनाडा के पूर्ण-स्टैक डेवलपर वेस बोस के पीछे नहीं जा सकते। यहाँ अपना कोर्स करें और कोड SITEPOINT का उपयोग करने के लिए 25% से ऑफ का उपयोग करें और साइटपॉइंट का समर्थन करने में सहायता करें।

यदि आपने कभी भी एक ऐप पेज बनाया है, तो संभवतः धीमी उपकरणों पर खराब एसईओ और प्रदर्शन के मुद्दों पर इसका सामना करना पड़ा। आप वेब पेजों की परंपरागत सर्वर-साइड रेंडरिंग को वापस जोड़ सकते हैं, आमतौर पर नोडजेएस के साथ, लेकिन यह एक सरल प्रक्रिया नहीं है, खासकर अतुल्यकालिक एपीआई के साथ।

आपको सर्वर पर अपना कोड प्रदान करने से प्राप्त दो मुख्य लाभ हैं:

  • लोड बार में प्रदर्शन में वृद्धि
  • अपने एसईओ के लचीलेपन में सुधार

याद रखें कि Google आपके मील का लोड करने के लिए इंतजार करता है, इसलिए शीर्षक सामग्री जैसी सरल चीजें बिना समस्या के बदले बदलेगी। (मैं अन्य खोज इंजन के लिए बात नहीं कर सकता, यद्यपि, या यह कितना विश्वसनीय है।)

इस पोस्ट में, मैं एसरिन्रस एपीआई से डेटा प्राप्त करने पर चर्चा करूंगा, जब सर्वर-रेंडर किए गए रिएक्ट कोड का इस्तेमाल किया जाए। प्रतिक्रिया कोड में जावास्क्रिप्ट में निर्मित ऐप की संपूर्ण संरचना है। इसका मतलब यह है कि, एक नियंत्रक के साथ परंपरागत MVC पैटर्न के विपरीत, आप नहीं जानते कि ऐप के प्रस्तुत किए जाने तक आपको कौन सा डेटा चाहिए। रिएक्ट ऐप बनाने की तरह एक फ्रेमवर्क के साथ, आप बहुत ही उच्च गुणवत्ता के कामकाज एप्लिकेशन को जल्दी से बना सकते हैं, लेकिन इसके लिए आपको क्लाइंट पर केवल रेंडर करने की ज़रूरत है इस के साथ एक प्रदर्शन मुद्दा है, साथ ही साथ एक मिमल अंक, जहां पारंपरिक टेम्पलिंग इंजन आप फिट को देखते हुए सिर को बदल सकते हैं।

समस्या

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

इस स्टॉक-मानक रेंडर विधि को समाप्त करना:

     रिएक्टडोम प्रस्तुत करना( <प्रदाता स्टोर = {store}>    <एप्लिकेशन>        , दस्तावेज़ getElementById ( 'जड़'))    

मुद्दे:

  1. यह एक डोम मूल तत्व की तलाश में प्रस्तुत करना है। यह मेरे सर्वर पर मौजूद नहीं है, इसलिए हमें इसे अलग करना होगा।
  2. हमारे पास मुख्य रूट तत्व के बाहर कुछ भी नहीं है हम फेसबुक टैग, शीर्षक, विवरण, विभिन्न एसईओ टैग सेट नहीं कर सकते हैं, और हमारे पास तत्व के बाहर बाकी सभी विशेषकर डोम पर नियंत्रण नहीं है, खासकर सिर।
  3. हम कुछ राज्य प्रदान कर रहे हैं, लेकिन सर्वर और क्लाइंट के पास अलग-अलग राज्य हैं। हम उस स्थिति को कैसे संभालना चाहते हैं (इस मामले में, रेड्यूक्स)।

तो साम्मल ने यहां दो पुस्तकालयों का उपयोग किया, और वे बहुत लोकप्रिय हैं, इसलिए उम्मीद है कि यह आपके द्वारा उपयोग किए जा रहे अन्य लाइब्रेरीयों का उपयोग करता है।

रेड्यूक्स : जहां आपके सर्वर और क्लाइंट को सिंक कर दिया जाता है वहां संग्रहीत स्थिति एक दुःस्वप्न समस्या है। यह बहुत महंगा है, और आमतौर पर जटिल कीड़े की ओर जाता है सर्वर साइड पर, आदर्श रूप से, आप कुछ काम करना और सही तरीके से काम करने के लिए पर्याप्त रूप से रेडक्स के साथ कुछ भी नहीं करना चाहते हैं। (आप अभी भी इसे सामान्य के रूप में उपयोग कर सकते हैं, बस ग्राहक की तरह दिखने के लिए पर्याप्त राज्य सेट करें।) यदि आप कोशिश करना चाहते हैं, तो विभिन्न वितरित सिस्टम गाइडों को प्रारंभ बिंदु के रूप में देखें।

रिएक्ट-राउटर : एफवाईआई, यह वी 4 संस्करण है, जो कि डिफ़ॉल्ट रूप से इंस्टॉल किया गया है, लेकिन यदि आपके पास एक पुराने मौजूदा प्रोजेक्ट है तो यह काफी अलग है आपको यह सुनिश्चित करना होगा कि आप अपने रूटिंग सर्वर साइड और क्लाइंट साइड और वी 4 के साथ - और यह इस पर बहुत अच्छा है।

आखिरकार, अगर आपको एक डाटाबेस कॉल करना है तो क्या होगा? अचानक यह एक बड़ा मुद्दा बन जाता है, क्योंकि यह एसिंक है और यह आपके घटक के अंदर है.

आपको यह निर्धारित करने के लिए प्रस्तुत करना होगा कि आपको किस निर्भरता की जरूरत है - जो कि रनटाइम पर निर्धारित करने की आवश्यकता होती है - और अपने ग्राहक की सेवा करने से पहले उन निर्भरता लाने के लिए।

मौजूदा समाधान

नीचे, Semaltेट समीक्षा इस समस्या को हल करने के लिए प्रस्ताव पर वर्तमान में समाधान कर रहे हैं।

अगला जेएस

हम कहीं भी जाने से पहले, यदि आप उत्पादन चाहते हैं, तो सर्वर-साइड-रिडेक्ट कोड या सार्वभौमिक ऐप, Semalt] आप जहां जाना चाहते हैं। यह काम करता है, यह साफ है, और यह जियत का समर्थन कर रहा है।

Semaltेट, यह राय है, आपको अपने टूलकेन का उपयोग करना पड़ता है, और जिस तरह से वे एसिंक डेटा लोडिंग को नियंत्रित करते हैं, वह लचीला नहीं है।

सेमाल्ट रेपो दस्तावेज़ीकरण से इस सीधी प्रति देखें:

     आयात 'प्रतिक्रिया' से प्रतिक्रियानिर्यात डिफ़ॉल्ट क्लास प्रतिक्रिया बढ़ाता है घटक {स्थिर async getInitialProps ({req}) {वापसी अनुरोध? {userAgent: req हेडर ['उपयोगकर्ता-एजेंट']}: {userAgent: नेविगेटर उपभोक्ता अभिकर्ता }}प्रस्तुत करना    {वापसी  
हैलो वर्ल्ड {यह रंगमंच की सामग्री। उपभोक्ता अभिकर्ता}
}}

getInitialProps वह चाबी है, जो एक ऐसा वादा देता है जो किसी वस्तु को हल करता है जो कि प्रोप को पॉप्युलेट करती है, और केवल एक पृष्ठ पर। क्या अच्छा है कि वह सिर्फ अपने टूलचैन में बनाया गया है: इसे जोड़ो और यह काम करता है, कोई काम की आवश्यकता नहीं है!

तो आप डेटाबेस डेटा कैसे प्राप्त करते हैं? आप एक एपीआई कॉल करते हैं। आप नहीं चाहते हैं? ठीक है, यह बहुत बुरा है (ठीक है, तो आप कस्टम चीजें जोड़ सकते हैं, लेकिन आपको खुद को पूरी तरह कार्यान्वित करना होगा।) यदि आप इसके बारे में सोचते हैं, हालांकि, यह एक बहुत ही उचित और सामान्यतः बोलने वाला, अच्छा अभ्यास है, क्योंकि अन्यथा, आपका ग्राहक अभी भी वही एपीआई कॉल, और आपके सर्वर पर विलंबता लगभग नगण्य है

Semalt्ट भी आप तक पहुंच में सीमित है - बहुत ज्यादा सिर्फ अनुरोध ऑब्जेक्ट; और फिर, यह अच्छा अभ्यास की तरह लगता है, क्योंकि आपके पास आपके राज्य तक पहुंच नहीं है, जो कि आपके सर्वर बनाम वैसे भी अलग होगा। ओह, और यदि आप इसे पहले नहीं पकड़ते, तो यह केवल शीर्ष-स्तरीय पेज घटकों पर काम करता है

रेडयुक्स कनेक्ट

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

     // 1. अपने डेटा से कनेक्ट करें, प्रतिक्रिया-रेड्यूक्स @ कन्नेक्शन के समान@asyncConnect ([{कुंजी: 'लंच',वादा करें: ({पैराम्स, हेल्पर्स}) => वादा संकल्प ({आईडी: 1, नाम: 'बोर्श'})}])क्लास ऐप रिएक्ट बढ़ाता है घटक {प्रस्तुत करना   {// 2 - mt3 evod replacement coils. प्रॉपर्टी के रूप में पहुंच डेटाकॉन्स्ट लंच = यह। रंगमंच की सामग्री। दोपहर का भोजनवापसी ( 
{दोपहर का भोजन। नाम}
)}}

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

     @ एसिंनक कनेक्ट ([{दोपहर का भोजन: ({params, सहायकों}) => वादा संकल्प ({आईडी: 1, नाम: 'बोर्श'})}])    

यह बहुत सारे मुद्दों के बिना Semaltट के साथ संभव है

प्रतिक्रिया-फ्रंटलोड

प्रतिक्रिया-फ्रंटलोड रेपो में बहुत सारे दस्तावेज या स्पष्टीकरण नहीं होते हैं, लेकिन शायद सबसे अच्छी समझ मुझे मिल सकती है (जैसे कि यह एक)
और सिर्फ स्रोत कोड पढ़ना जब कुछ माउंट किया जाता है, यह एक वादे कतार में जोड़ा जाता है, और जब यह हल हो जाता है, यह सेवा प्रदान करता है. तब ((सर्वररेन्ड मार्कअप) => {कंसोल। लॉग इन करें (serverRenderedMarkup)})

एक बेहतर समाधान ढूँढना

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

इस उदाहरण के समाधान के लिए रेपो यहां है।

सिद्धांत

इसके पीछे का विचार अपेक्षाकृत सरल है, हालांकि यह कोड का निष्पक्ष बिट होने में समाप्त होता है। यह उन विचारों का एक सिंहावलोकन देना है जो हम चर्चा कर रहे हैं।

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

इसके अलावा, हम इसे अनुकूलित कर सकते हैं हालांकि हम चाहते हैं। इस मामले में, हम हमारे संदर्भ के आधार पर स्थिति कोड और सिर बदलते हैं।

पहले रेंडर

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

     कॉन्स्ट संदर्भ = {डेटा: {}, सिर: [], रेक, एपीआई}const store = configureStore   renderToString ( <प्रदाता स्टोर = {store}> <स्टैटिक्राफ्टर स्थान = {पुनः। url}संदर्भ = {} संदर्भ> <एप्लिकेशन>      )    

दूसरा रेंडर

आपके पहले रेंडर के बाद Semaltेट, हम उन लंबित वादों को पकड़ लेंगे और तब तक इंतजार करेंगे जब तक कि उन वादों को पूरा नहीं किया जाता है, फिर से प्रस्तुत करना, संदर्भ को अद्यतन करना:

     कॉन्स्ट कुंजी = ऑब्जेक्ट चाबियाँ (संदर्भ डेटा)const वादा = चाबियाँ मानचित्र (k => संदर्भ। डेटा [k])प्रयत्न {const संकल्पित = प्रतीक्षा वादा सभी (वादों)संकल्प लिया। के लिए हर ((आर, आई) => संदर्भ। डेटा [कुंजी [आई]] = आर)} पकड़ (त्रुटि) {/ उस से बेहतर पृष्ठ प्रस्तुत करना? या सिर्फ मूल मार्कअप भेज दें, फ्रंट एंड को इसे संभाल दें। यहां कई विकल्प हैंरिटर्न रिज़ स्थिति (400)। जेसन ({संदेश: "उह्ह, कुछ काम नहीं किया"})}कॉन्स्ट मार्कअप = रेंडरटोस्ट्रिंग ( <प्रदाता स्टोर = {store}> <स्टैटिक्राफ्टर स्थान = {पुनः। url}संदर्भ = {} संदर्भ> <एप्लिकेशन>      )    

ऐप

Semalt्ट हमारे सर्वर से ऐप कोड के लिए दूर हो जाओ: हमारे किसी भी घटक में राउटर कनेक्शन है, हम इसे प्राप्त कर सकते हैं:

     वर्ग फर्स्टपेज घटक प्रदान करता है {async घटक WillMount    {इस। राज्य = {टेक्स्ट: 'लोड'}इस। _handleData ( 'firstPage')}async _handle डेटा (कुंजी) {const {staticContext} = यह रंगमंच की सामग्रीif (staticContext && staticContext। डेटा [कुंजी]) {const {text, data} = staticContext। डेटा [कुंजी]इस। सेटस्टेट ({टेक्स्ट, डेटा})staticContext। सिर। धक्का दें(<मेटा नाम = "विवरण" सामग्री = {"कुछ विवरण:" + पाठ} />)} और अगर (स्थिरिकांटेक्स्ट) {staticContext। डेटा [कुंजी] = यह। _डेटा प्राप्त करें  } else if (! staticContext && window। डेटा [कुंजी]) {const {text, data} = विंडो आंकड़े [कुंजी]इस। राज्य = {। । । इस। राज्य, पाठ, डेटा}खिड़की। डेटा [कुंजी] = नल} और अगर (! staticContext) {const {text, data} = इस का इंतजार है _डेटा प्राप्त करें  इस. रंगमंच की सामग्रीconst myApi = staticContext? staticContext। एपीआई: एपीआईconst resp = मक्खन का इंतजार पद। सूची  const {डेटा} = resp डेटाconst {text} = मेरी एपीआई का इंतजार करें getMain   वापसी {पाठ, डेटा}}प्रस्तुत करना   {कॉन्स्ट टेक्स्ट = यह राज्य। टेक्स्टवापसी (
{पाठ}
)}}

वाह, यह बहुत जटिल कोड है इस स्तर पर, आप संभवतः एक अधिक रिले दृष्टिकोण लेना चाहते हैं, जहां आप अपने डेटा को दूसरे घटक में ला सकते हैं।

इस घटक को उन चीजों से बंटिज़ किया गया है जिनके बारे में आप परिचित हैं - एक रेंडर स्टेप और ए कंपोनेंट वॉलमाउंट चरण। चार चरण यदि बयान विभिन्न राज्यों को संभालता है - प्रीफैच, पोस्ट फ़ेच, प्रेजरवर रेंडर, पोस्ट सर्वर रेंडर। हमारे डेटा लोड होने के बाद हम सिर में भी जोड़ते हैं।

अंत में, एक डेटा प्राप्त करने का चरण है। आदर्श रूप से, आपके एपीआई और डाटाबेस में एक ही एपीआई है, जो एक ही निष्पादन करता है। आप संभवत: इन्हें सेमील्ट या सागा में एक एक्शन में डाल देना चाहेंगे ताकि इसे और अधिक एक्स्टेंसिबल बनाया जा सके।

अधिक जानकारी के लिए "सर्वर साइड रिएक्ट रेंडरिंग" और रेपो प्रतिक्रिया सर्वर-साइड रेंडरिंग लेख को चेक करें। याद रखें, आपको अभी भी उस स्थिति को संभालना होगा जहां आपका डेटा लोड नहीं हुआ है! Semalt्ट केवल पहले लोड पर एक सर्वर रेंडर कर रहा है, इसलिए आप बाद के पृष्ठों पर लोडिंग स्क्रीन दिखेंगे।

बदलें सूचकांक डेटा जोड़ने के लिए html

हमें हमारे पृष्ठ अनुरोध के हिस्से के रूप में कोई प्रीफ़ेड डेटा भेजने की आवश्यकता है, इसलिए हम एक स्क्रिप्ट टैग जोड़ेंगे:

                                    
March 1, 2018