Back to Question Center
0

सर्व्हर-प्रस्तुत केलेल्या प्रतिक्रियामध्ये असिंक्रोनस API सह व्यवहार करणे            सर्व्हर-प्रस्तुत केलेल्या रीएक्टशी संबंधित विषयांत असिंक्रोनस API सह व्यवहार करणे: ES6Raw मिमल

1 answers:
सर्व्हर-प्रस्तुत केलेल्या प्रतिक्रियामध्ये असिंक्रोनस API सह वागण्याचा

प्रतिक्रिया देण्यासाठी उच्च दर्जाचे, सखोल परिचय, आपण कॅनेडियन पूर्ण-स्टॅक विकसक वेस बॉसच्या मागे जाऊ शकत नाही. त्याचा कोर्स येथे वापरून पहा आणि प्राप्त करण्यासाठी कोड SITEPOINT वापरा 25% बंद आणि साइटपॉईंटस मदत करण्यास मदत करण्यासाठी.

आपण कधीही मूलभूत प्रतिक्रिया अॅप पृष्ठ केले असल्यास, ती कदाचित खराब एसइओ आणि धीमे डिव्हाइसेसवरील कार्यप्रदर्शन समस्यांमुळे प्रभावित झाली होती - ???? ray ban ???????. आपण वेब पृष्ठांचे पारंपारिक सर्व्हर-साइड रेन्डरिंग परत जोडू शकता, विशेषत: नोडेज एस सह, परंतु ही एक सरळ प्रक्रिया नाही, विशेषत: असिंक्रोनस API सह.

आपण सर्व्हरवर आपला कोड प्रस्तुत करण्यापासून प्राप्त केलेले दोन मुख्य फायदे हे आहेत:

  • लोड वेळामध्ये वाढीचा कामगिरी
  • आपल्या एसइओ च्या लवचिकता सुधारण्यासाठी

लक्षात ठेवा की Google आपल्या मिश्मरात लोड होण्याची प्रतीक्षा करीत नाही, शीर्षक सामग्रीसारख्या साध्या गोष्टी देखील न बदलता बदलेल. (मी इतर शोध इंजिने बोलू शकत नाही, तरीदेखील किंवा ते कसे विश्वसनीय आहे.)

या पोस्टमध्ये, सर्व्हर-रेंडर रिएक्शन कोड वापरताना मी अतुल्यकालिक API वरून डेटा मिळविण्यावर चर्चा करू. रिअॅक्ट कोडमध्ये जावास्क्रिप्टमध्ये बनविलेल्या अॅपची संपूर्ण रचना आहे. याचा अर्थ असा की, नियंत्रकासह पारंपारिक MVC नमुन्यांची विपरीत, आपल्याला माहित नसलेला डेटा कोणत्या अनुप्रयोगापर्यंत सादर केला जातो रिचाईक्ट अॅप तयार करा यासारख्या फ्रेमवर्कसह, आपण खूपच उच्च गुणवत्तेच्या कार्यप्रणालीवर द्रुतपणे तयार करू शकता परंतु हे केवळ क्लायंटवर रेंडरिंग करणे आवश्यक आहे यासह एक परफॉर्मन्स समस्या आहे, तसेच मिमल समस्या, जिथे आपण टप्पे पाहू शकता तिथे पारंपरिक टेम्पलेट इंजिने आपण बदलू शकता.

समस्या

Semaltेट बहुतेक भाग समक्रमित करते, त्यामुळे आपल्याकडे डेटा नसल्यास, आपण लोडिंग स्क्रीन रेंडर करुन डेटा येणे अपेक्षित आहे. हे सर्व्हरवरून इतके चांगले कार्य करत नाही, कारण आपल्याला प्रदान केल्याशिवाय आपल्याला काय हवे आहे हे माहित नसते, किंवा आपल्याला माहित आहे की आपल्याला कशाची आवश्यकता आहे परंतु आपण आधीच सादर केले आहे.

हा स्टॉक-स्टँडर्ड रेडर पद्धती वापरुन:

     प्रतिक्रियादायी. प्रस्तुत करा ( <पुरवठादार संग्रह = {store}>          , दस्तऐवज getElementById ('रूट'))    

मुद्दे:

  1. हा मूळ घटक शोधत असलेला एक DOM आहे हे माझ्या सर्व्हरवर अस्तित्वात नाही, म्हणून आम्हाला ते वेगळे करावे लागेल.
  2. आमच्याकडे आमच्या मुख्य मूळ घटकाच्या बाहेर काहीही नाही आम्ही फेसबुक टॅग, शीर्षक, वर्णन, विविध एसइओ टॅग्स सेट करू शकत नाही आणि घटकांच्या बाहेर बाकीच्या DOM वर आमच्याकडे विशेष नियंत्रण नाही, खास करुन प्रमुख.
  3. आम्ही काही राज्य प्रदान करत आहोत, परंतु सर्व्हर आणि क्लाएंटच्या वेगवेगळ्या राज्यांची आहेत. आम्ही त्या स्थितीला कसे हाताळायचे याचा विचार केला पाहिजे (या प्रकरणात, रेड्यूक्स).

त्यामुळे मिमललने येथे दोन लायब्ररी वापरल्या, आणि ते खूपच लोकप्रिय आहेत, त्यामुळे आपण ती वापरत असलेल्या अन्य लायब्ररींपर्यंत पोहोचण्याची अपेक्षा केली आहे.

रेड्यूक्स : आपला सर्व्हर आणि क्लायंट समक्रमित केला जातो तिथे स्थान संग्रहित करणे हा एक दुःस्वप्न समस्या आहे. हे फार महाग आहे, आणि सहसा क्लिष्ट बग ठरतो. सर्व्हरच्या बाजूवर, विशेषत:, आपण काही काम करण्यास आणि योग्यरित्या रेंडरिंग करण्यासाठी फक्त पुरेसे याशिवाय Redux सह काहीही करू इच्छित नाही. (आपण तरीही तो सामान्य म्हणून वापरु शकता; फक्त क्लायंटसारखे दिसण्यासाठी राज्य पुरेसा सेट करा.) आपण प्रयत्न करू इच्छित असल्यास, प्रारंभिक बिंदू म्हणून विविध वितरित सिस्टम मार्गदर्शक तपासा.

प्रतिक्रिया-राउटर : एफवायआय, हे v4 आवृत्ती आहे, जे डिफॉल्टनुसार स्थापित केले गेले आहे, परंतु आपण जुने विद्यमान प्रकल्प मिळवल्यास ते लक्षणीय भिन्न ठरते. आपण आपल्या रूटिंग सर्व्हर बाजू आणि क्लायंट साइड आणि v4 सह हाताळता हे सुनिश्चित करण्याची आवश्यकता आहे - आणि हे त्याबद्दल खूप चांगले आहे.

सर्व केल्यानंतर, जर तुम्हाला डाटाबेस कॉल करण्याची आवश्यकता असेल तर? अचानक ही एक मोठी समस्या बनते, कारण हे असंसंच आहे आणि ते आपल्या घटकाच्या आत आहे.

तुम्हाला कोणत्या डिप्टेंथन्डल्सची गरज आहे हे निश्चित करण्यासाठी तुम्हाला रनरेबल करावे लागेल - जे रनटाइमवर निर्धारित करणे आवश्यक आहे - आणि आपल्या क्लायंटच्या सेवा देण्यापूर्वी त्या अवलंबित्वांची पूर्तता करणे.

विद्यमान सोल्यूशन

खाली, Semaltेट या समस्येचे निराकरण करण्यासाठी सध्या उपलब्ध असलेल्या समस्यांचे पुनरावलोकन करा.

पुढील. जेएस

आपण कोठेही जाण्यापूर्वी, आपण उत्पादन करायचे असल्यास, सर्व्हर-साइड-रेंडर रिएक्ट कोड किंवा युनिव्हर्सल अॅप, Semalt] आपण जिथे जाऊ इच्छिता तिथे आहे. हे काम करते, ते स्वच्छ आहे, आणि ते ज्योत पाठिंबा देते.

Semaltेट, हे मत आहे, आपल्याला त्यांचे टूलचेन वापरावे लागेल आणि ज्या पद्धतीने ते एसिंक डेटा लोडिंग हाताळत आहेत ते हे लवचिक नाही.

Semaltेट रेपो दस्तावेजीकरणांमधून ही थेट प्रत पहा:

     आयात 'प्रतिक्रिया' पासून प्रतिक्रियानिर्यात डीफॉल्ट क्लास वाढवते. घटक {स्थिर async getInitialProps ({req}) {रिटर्न रिक? {userAgent: req. शीर्षलेख ['वापरकर्ता-एजंट']}: {userAgent: navigator. userAgent}}रेंडर करा    {परतावा  
हॅलो वर्ल्ड {हे. प्रॉप्स userAgent}
}}

getInitialProps ही की आहे, जी एक आश्वासने परत करते ज्यामुळे प्रक्षेपण करणार्या ऑब्जेक्टचे निराकरण होते आणि केवळ एका पृष्ठावर. काय चांगले आहे ते फक्त त्यांच्या टूलचेनवर बांधलेले आहे: ते जोडा आणि ते कार्य करते, कार्य आवश्यक नाही!

तर आपण डेटाबेस डेटा कसा मिळवाल? आपण API कॉल करा. आपण करू इच्छित नाही? विहीर, ते खूप वाईट आहे. (ठीक आहे, जेणेकरून आपण सानुकूल गोष्टी जोडू शकता, परंतु आपल्याला स्वतः ते पूर्णपणे अंमलात आणणे आवश्यक आहे.) जर आपण याबद्दल विचार केला तर हे खूपच वाजवी आणि सामान्यत: बोलणे, उत्तम सराव आहे कारण अन्यथा, आपले ग्राहक तरीही समान API कॉल आणि आपल्या सर्व्हरवरील विलंबता अक्षरशः नगण्य आहे.

सममूल्य देखील आपण प्रवेश आहे काय मर्यादित - तेही जास्त फक्त विनंती ऑब्जेक्ट; आणि पुन्हा, हे चांगले सराव असल्यासारखे दिसते आहे, कारण आपल्याकडे आपल्या राज्यास प्रवेश नाही, जो आपल्या सर्व्हर विरुद्ध विरूद्ध वेगळा असेल. अगं, आणि जर तुम्ही ते आधी पकडले नसाल तर ते केवळ उच्च-स्तरीय पृष्ठ घटकांवरच काम करते.

(9 4) रेडक्स कनेक्ट

रेडयुक्स कनेक्ट ही एक सभ्य तत्त्वज्ञानासह अत्यंत सोयीचे सर्व्हर-साइड रेंडरर आहे, परंतु आपण वापरत असलेल्या सर्व साधनांचा वापर न केल्यास, हे आपल्यासाठी नसू शकते. या पॅकेजमध्ये खूपच सममूल्य, परंतु हे इतके गुंतागुंतीचे आहे आणि रूटर v4 चा पुनरारंभ करण्यासाठी अद्याप श्रेणीसुधारित केलेले नाही. याकरिता भरपूर सेटॉलमेंट टाकणे, परंतु आपण काही धडे शिकण्यासाठी सर्वात महत्वाचा भाग घेऊया:

     // 1. रिअॅक्शन-रेडयुक्स @ कन्नेक्शन प्रमाणेच आपला डेटा कनेक्ट करा@asyncConnect ([{की: 'लंच',आश्वासन: ({params, मदतनीस}) => वचन निराकरण करा ({id: 1, नाव: 'Borsch'})}])क्लास ऍप रिटर्क्ट वाढवते. घटक {रेंडर करा    {// 2. प्रॉप्स म्हणून प्रवेश डेटाकॉन्स्ट लंच = हे. प्रॉप्स दुपारचे जेवणपरत ( 
{दुपारचे जेवण. नाव}
)}}

डेव्हलपरर्स JavaScript मध्ये मानक नाहीत. ते लेखनच्या वेळी स्टेज 2 मध्ये आहेत, म्हणून आपल्या विवेकबुद्धीनुसार वापरा उच्च-ऑर्डर घटक जोडण्याचे हे आणखी एक मार्ग आहे. ही कल्पना खूप सोपी आहे: आपल्या प्रॉपर्टीला काय दिले पाहिजे याची ती किल्ली आहे, आणि नंतर आपल्याकडे आश्वासने एक यादी आहे, ज्याचे निराकरण होते आणि त्यास पारित केले जाते. हे खूप छान वाटते. पर्यायी शब्दार्थ फक्त हेच आहे:

     @ साओसिंक कनेक्ट ([{जेवणाचा: ({params, मदतकर्ते}) => वचन निराकरण करा ({id: 1, नाव: 'Borsch'})}])    

हे खूपच समस्यांशिवाय Semaltॅट सह योग्य वाटते आहे.

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

प्रतिक्रिया-फ्रन्टलोड रेपोमध्ये भरपूर कागदपत्रे नाहीत, किंवा स्पष्टीकरण नाही, परंतु कदाचित मी सर्वोत्तम सल्ले मिळवू शकलो (उदा. हा एक)
आणि केवळ स्रोत कोड वाचत आहात. जेव्हा काहीतरी माउंट केले जाते, तेव्हा त्याला वचनबद्ध रांगेमध्ये जोडता येते आणि जेव्हा ते निराकरण होते, तेव्हा त्याची सेवा केली जाते. नंतर ((serverRenderedMarkup) => {कन्सोल लॉग (सर्व्हरआरडेड मार्कअप)}) (11 9) उत्तम उपाय शोधणे

वरील कोणतेही समाधान खरोखर लवचिकता आणि साधेपणामुळे प्रतिबिंबित होत नाही. मला वाचनालयाकडून अपेक्षा असेल, तर आता मीठ आपल्या स्वत: च्या अंमलबजावणीस सादर करते. ध्येय हे पॅकेज लिहिणे नव्हे, परंतु आपल्या वापरासाठी आपल्या स्वत: चे पॅकेज कसे लिहायचे हे समजून घेणे.

या उदाहरणाचे समाधान करण्यासाठी रेपो येथे आहे.

सिद्धांत

या मागची कल्पना तुलनेने सोपी आहे, परंतु हे कोडचा निष्कर्ष ठरत नाही. हे आम्ही ज्या विषयावर चर्चा करीत आहोत त्याचे विहंगावलोकन देणे आहे.

सर्व्हरला रिएक्शन कोड दोनदा सादर करावा लागतो आणि त्यासाठी आपण रेंडरटोस्ट्रिंग वापरु. आम्ही पहिल्या आणि दुस-या आवृत्तीच्या दरम्यान एक संदर्भ कायम राखू इच्छितो. आमच्या पहिल्या रेंडरिंगवर, आम्ही कोणत्याही API कॉल, आश्वासने आणि अतुल्यकालिक कृती प्राप्त करू इच्छित आहोत. आपल्या दुस-या रेंडरवर, आम्ही सर्व डेटा प्राप्त करून घेऊ इच्छितो आणि ते आपल्या संदर्भामध्ये परत लिहा, त्यामुळे वितरणासाठी आमचे कार्य पृष्ठ सादर करणे. हे देखील याचा अर्थ असा की संवादाच्या आधारावर अॅप कोड क्रिया (किंवा नाही) करण्याची आवश्यकता आहे, जसे की सर्व्हरवर किंवा क्लाएंटवर असो, दोन्हीही बाबतीत डेटा प्राप्त होत आहे किंवा नाही.

तसेच, आम्ही इच्छित असलेले हे सानुकूलित करू शकतो. या प्रकरणात, आम्ही आमच्या संदर्भावर आधारित स्थिती कोड आणि प्रमुख बदलू.

प्रथम प्रदान

आपल्या कोडच्या आत, आपल्याला हे माहित असणे आवश्यक आहे की आपण सर्व्हर किंवा आपल्या ब्राउझरवर काम करीत आहात आणि आदर्शपणे आपण यावर जटिल नियंत्रण ठेवू इच्छित आहात. प्रतिक्रिया राउटरसह, आपल्याला एक स्थिर संदर्भ प्रॉप आला आहे, जो महान आहे, म्हणून आम्ही त्याचा वापर करणार आहोत. आता आम्ही पुढील माहितीतून डेटा ऑब्जेक्ट आणि विनंती डेटा जोडला आहे. जेएस आमची APIs सर्व्हर आणि क्लाएंट यांच्यातील भिन्न आहेत, म्हणजे आपल्याला सर्व्हर API प्रदान करणे आवश्यक आहे, शक्यतो आपल्या क्लायंट-साइड API प्रमाणे समान इंटरफेससह:

     संदर्भ संदर्भ = {डेटा: {}, डोके: [], रीक, एपीआय}const store = कॉन्फिगरस्टोर   renderToString ( <पुरवठादार संग्रह = {store}> <स्टॅटिक्राउटर स्थान = {req. url}संदर्भ = {संदर्भ}>     )    

सेकंड रेंडर

आपल्या पहिल्या रेंडर नंतर मिमलॅट, आम्ही फक्त त्या प्रलंबित आश्वासने हस्तगत करू आणि त्या अभिवचनानुसार केले जाईपर्यंत प्रतीक्षा करा, नंतर पुन्हा सादर करा, संदर्भ अद्ययावत करा:

     कॉन्स्ट कीज = ऑब्जेक्ट की (संदर्भ डेटा)const आणला = कळा नकाशा (k => संदर्भ डेटा [के])प्रयत्न {const resolved = आश्वासन वाट पाहणे सर्व (वचन)निराकरण. forEach ((r, i) => संदर्भ. डेटा [कळा [आय]] = आर)} पकडणे (त्रुटी) {// त्यापेक्षा चांगले पृष्ठ प्रस्तुत करायचे? किंवा फक्त मूळ मार्कअप पाठवा, फ्रंट एंडने हे हाताळू द्या. येथे अनेक पर्यायरिटर्न रिझर्व स्थिती (400) जेसन ({संदेश: "ओह, काही काम झाले नाही"})}कॉन्स्ट मार्कअप = रेडरटोस्ट्रिंग ( <पुरवठादार संग्रह = {store}> <स्टॅटिक्राउटर स्थान = {req. url}संदर्भ = {संदर्भ}>     )    

अॅप ​​

आमच्या सर्व्हरपासून ऍप कोडला मिसमेल उडी मारा: आपल्यापैकी कोणत्याही भागमध्ये राउटर कनेक्शन असल्यास, आम्ही हे मिळवू शकतो:

     वर्ग प्रथमपेज घटक विस्तारित {async componentWillMount    {हे. state = {text: 'loading'}हे. _handleData ('प्रथम पृष्ठ')}async _handleData (की) {const {staticContext} = हे प्रॉप्सजर (staticContext आणि& staticContext डेटा [की]) {const {text, data} = स्थिर कॉंटेस्टेक्स्ट डेटा [की]हे. setState ({मजकूर, डेटा})स्थिरकांख्यिकी डोके पुश (<मेटा नाव = "वर्णन" सामग्री = {"काही वर्णन:" + मजकूर} />)} नाहीतर (staticContext) {स्थिरकांख्यिकी डेटा [की] = हे _getData   } else जर (! staticContext && window. डेटा [की]) {const {text, data} = विंडो डेटा [की]हे. राज्य = { हे. राज्य, मजकूर, डेटा}खिडकी डेटा [की] = शून्य} दुसरे तर (! स्टॅटिककॉन्टेक्स्ट) {const {text, data} = हे वाट पहा. _getData   हे. प्रॉप्सconst myApi = staticContext? स्थिरकांख्यिकी api: apiअवस्था = आडवा वाटणे पोस्ट सूची   const {डेटा} = resp डेटाconst {text} = माझे अॅपी ची वाट पहा getMain   परत {मजकूर, डेटा}}रेंडर करा    {const मजकूर = हे. राज्य. मजकूरपरत (
{मजकूर}
)}}

अरेरे, हे खूप जटिल कोड आहे. या टप्प्यावर, आपण बहुधा अधिक रिले पध्दत घेऊ इच्छित आहात, जिथे आपण आपल्या डेटास कोड दुसर्या घटकमध्ये विभक्त करता.

हा भाग आपण ज्या गोष्टींशी परिचित आहात त्यानुसार हे घटक विकत घेतले जातात - एक रेंडर चरण आणि एक घटकवॉलमाउंट चरण. चार-टप्प्यात जर विधान विविध राज्यांना हाताळते - प्रीफेच, पोस्ट फेच, प्रीझरर रेंडर, पोस्ट सर्व्हर रेंडर. आमचे डेटा लोड झाल्यानंतर आम्ही मथळा देखील जोडू.

शेवटी, एक प्राप्त डेटा पायरी आहे. आदर्शपणे, आपल्या API आणि डेटाबेसमध्ये समान API आहे, जे त्यास अंमलबजावणी करते. आपण हे अधिक विस्तारयोग्य करण्यासाठी मिमलॅट किंवा सागा मध्ये एक क्रिया मध्ये कदाचित ठेवू इच्छित असाल.

अधिक माहितीसाठी "सर्व्हर-साइड रिएक्टरेन्डरिंग" आणि रेपो सर्व्हर-साइड रेन्डरिंग लेख पहा. लक्षात ठेवा, आपल्याला अद्याप आपला डेटा लोड न होण्याची स्थिती हाताळण्याची आवश्यकता आहे! सेमॅट फक्त प्रथम लोड वर सर्व्हर प्रस्तुत करत आहे, त्यामुळे आपण त्यानंतरच्या पृष्ठांवर लोडिंग स्क्रीन दर्शवित आहोत.

बदला निर्देशांक. डेटा जोडण्यासाठी html

आम्हाला आमच्या पृष्ठ विनंतीचा भाग म्हणून कोणताही प्रीफिल्ड डेटा पाठविणे आवश्यक आहे, म्हणून आम्ही एक स्क्रिप्ट टॅग जोडू:

                                    
March 1, 2018