ReactJS सर्वर-साइड प्रतिपादन बनाम क्लाइंट-साइड प्रतिपादन


120

मैंने अभी ReactJS का अध्ययन करना शुरू किया है और पाया है कि यह आपको पृष्ठों को रेंडर करने के 2 तरीके देता है: सर्वर-साइड और क्लाइंट-साइड। लेकिन, मुझे समझ नहीं आ रहा है कि इसे एक साथ कैसे इस्तेमाल किया जाए। क्या यह एप्लिकेशन बनाने के 2 अलग-अलग तरीके हैं, या उन्हें एक साथ उपयोग किया जा सकता है?

यदि हम इसे एक साथ उपयोग कर सकते हैं, तो इसे कैसे करें - क्या हमें सर्वर साइड और क्लाइंट साइड पर समान तत्वों की नकल करने की आवश्यकता है? या, क्या हम सर्वर पर हमारे एप्लिकेशन के स्थैतिक भागों और क्लाइंट पक्ष पर गतिशील भागों का निर्माण कर सकते हैं, बिना सर्वर साइड के किसी कनेक्शन के जो पहले से ही पहले से रेंडर था?


1
संक्षिप्त उत्तर, NO - आप डिकम्प्लस कर सकते हैं, स्टेटिक html भेज सकते हैं और क्लाइंट रेंडर में इसे पूरी तरह से बदल सकते हैं। मेरे उत्तर में विवरण जोड़ दिया है।
किरा

जवाबों:


108

किसी दिए गए वेबसाइट / वेब-एप्लिकेशन के लिए, आप क्लाइंट-साइड , सर्वर-साइड या दोनों पर प्रतिक्रिया का उपयोग कर सकते हैं ।

ग्राहक की ओर

यहाँ पर, आप पूरी तरह से ब्राउज़र पर ReactJS चला रहे हैं। यह सबसे सरल सेटअप है और इसमें अधिकांश उदाहरण ( http://reactjs.org पर शामिल हैं ) शामिल हैं। सर्वर द्वारा प्रदान किया गया प्रारंभिक HTML एक प्लेसहोल्डर है और आपके सभी लिपियों के लोड होते ही संपूर्ण UI ब्राउज़र में प्रदान किया जाता है।

सर्वर साइड

ReactJS को सर्वर-साइड टेंपलेटिंग इंजन (जैसे जेड, हैंडलबार, आदि ...) के रूप में सोचें। सर्वर द्वारा प्रदान किए गए HTML में UI होना चाहिए जैसा कि होना चाहिए और आप किसी भी स्क्रिप्ट के लोड होने का इंतजार नहीं करते हैं। आपका पृष्ठ एक खोज इंजन द्वारा अनुक्रमित किया जा सकता है (यदि कोई जावास्क्रिप्ट को निष्पादित नहीं करता है)।

चूंकि UI सर्वर पर प्रदान किया गया है, आपका कोई भी ईवेंट हैंडलर काम नहीं करेगा और कोई अन्तरक्रियाशीलता नहीं है (आपके पास एक स्थिर पृष्ठ है)।

दोनों

यहां, प्रारंभिक रेंडर सर्वर पर है। इसलिए, ब्राउज़र द्वारा प्राप्त HTML में UI होना चाहिए जैसा कि होना चाहिए। एक बार स्क्रिप्ट लोड होने के बाद, वर्चुअल DOM को आपके घटकों के ईवेंट हैंडलर को सेट करने के लिए एक बार फिर से प्रस्तुत किया जाता है।

यहाँ पर, आपको यह सुनिश्चित करने की आवश्यकता है कि आप उसी वर्चुअल डोम (रूट रिएक्टजेएस घटक) को उसी के साथ फिर से प्रस्तुत करें जो आप propsसर्वर पर प्रस्तुत करते थे। अन्यथा, ReactJS शिकायत करेगा कि सर्वर-साइड और क्लाइंट-साइड वर्चुअल DOMs मेल नहीं खाते हैं।

चूंकि ReactJS री-रेंडरर्स के बीच वर्चुअल DOM को अलग करता है, इसलिए वास्तविक DOM म्यूट नहीं किया गया है। केवल ईवेंट हैंडलर वास्तविक DOM तत्वों के लिए बाध्य हैं।


1
तो "दोनों" के मामले में मुझे सर्वर रेंडरिंग के लिए एक ही कोड को दो बार लिखना होगा ", और क्लाइंट के लिए इस DOM को पुन: पेश करने के लिए? सही?
Simcha

10
आपको एक ही कोड को दो बार चलाना होगा। एक बार सर्वर पर और एक बार क्लाइंट पर। हालाँकि, आपको इसे ध्यान में रखने के लिए अपने घटकों को लिखने की आवश्यकता है - जैसे कि आपको किसी भी async डेटा को लाने नहीं देना चाहिए componentWillMount(), क्योंकि यह क्लाइंट और सर्वर दोनों को चलाएगा। आपको सर्वर पर सामने डेटा लाने और क्लाइंट पर प्रारंभिक रेंडर के लिए उपलब्ध कराने के लिए एक रणनीति की आवश्यकता होगी, यह सुनिश्चित करने के लिए कि आप एक ही आउटपुट प्राप्त करें।
जॉनी बुकानन

3
आप यह भी देख सकते हैं कि निष्पादित किया जा रहा कोड सर्वर-साइड या क्लाइंट-साइड का उपयोग कर रहा है या नहीं typeof window == "undefined"और फिर उसी के अनुसार अपना डेटा प्राप्त करें।
गौतम बद्रीनाथन

क्या आपके पास एक उदाहरण का लिंक है जो आपके कार्यान्वयन पर फिट बैठता है?
Sawtaytoes

1
@ आमतौर पर इस मामले में सर्वर द्वारा लौटाया गया HTML बहुत "नंगी हड्डियां" है, बस अपने जावास्क्रिप्ट और शैलियों को आयात करें और जिसमें एक <div>रिएक्ट लिखा होगा।
मैट हॉलैंड

48

छवि स्रोत: वॉलमार्ट लैब्स इंजीनियरिंग ब्लॉग

एसएसआर

सीएसआर

एनबी: एसएसआर (सर्वर साइड रेंडरिंग), सीएसआर (क्लाइंट साइड रेंडरिंग)।

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

एक नकारात्मक पहलू यह है कि SSR TTFB (टाइम टू फर्स्ट बाइट) थोड़ी लंबी हो सकती है। ऐसा इसलिए है क्योंकि सर्वर को HTML डॉक्यूमेंट बनाने में कुछ समय लगता है, जिससे सर्वर का रिस्पॉन्स साइज बढ़ता है।


4

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

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

फिर से, एक क्लीनर समाधान के बारे में जानने के लिए खुश।


2

क्या यह एप्लिकेशन बनाने के 2 अलग-अलग तरीके हैं, या उन्हें एक साथ उपयोग किया जा सकता है?

इन्हें एक साथ इस्तेमाल किया जा सकता है।

यदि हम इसे एक साथ उपयोग कर सकते हैं, तो इसे कैसे करें - क्या हमें सर्वर साइड और क्लाइंट साइड पर समान तत्वों की नकल करने की आवश्यकता है? या, क्या हम सर्वर पर हमारे एप्लिकेशन के स्थैतिक भागों और क्लाइंट पक्ष पर गतिशील भागों का निर्माण कर सकते हैं, बिना सर्वर साइड के किसी कनेक्शन के जो पहले से ही पहले से रेंडर था?

रिफ्लेक्स और रिपेंट ऑपरेशंस, कम झिलमिलाहट / ब्लिंक से बचने के लिए एक ही लेआउट दिया जाना बेहतर है, आपका पेज स्मूथ होगा। हालाँकि, यह कोई सीमा नहीं है। आप SSR html को बहुत अच्छी तरह से कैश कर सकते हैं (कुछ इलेक्ट्रोड प्रतिक्रिया समय में कटौती करने के लिए करता है) / एक स्थिर html भेजें जो CSR (क्लाइंट साइड रेंडर) द्वारा अधिलेखित हो जाती है।

यदि आप अभी SSR से शुरुआत कर रहे हैं, तो मैं अनुशंसा करूँगा कि आप सरल शुरुआत करें, SSR बहुत जल्दी जटिल हो सकता है। सर्वर पर html बनाने का अर्थ है खिड़की, दस्तावेज़ जैसी वस्तुओं तक पहुंच खोना (आपके पास ये क्लाइंट पर है), async ऑपरेशंस (बॉक्स से बाहर) को शामिल करने की क्षमता खोना, और आमतौर पर आपके कोड को SSR संगत करने के लिए बहुत सारे कोड संपादन ( चूंकि आपको अपने बंडल को पैक करने के लिए वेबपैक का उपयोग करना होगा)। सीएसएस आयात, आवश्यकता बनाम आयात जैसी चीजें अचानक आपको काटने लगती हैं (यह वेबपैक के बिना डिफ़ॉल्ट रिएक्ट ऐप में मामला नहीं है)।

एसएसआर का सामान्य पैटर्न इस तरह दिखता है। एक एक्सप्रेस सर्वर अनुरोधों की सेवा:

const app = Express();
const port = 8092;

// This is fired every time the server side receives a request
app.use(handleRender);
function handleRender(req, res) {
    const fullUrl = req.protocol + '://' + req.get('host') + req.originalUrl;
    console.log('fullUrl: ', fullUrl);
    console.log('req.url: ', req.url);

    // Create a new Redux store instance
    const store = createStore(reducerFn);

    const urlToRender = req.url;
    // Render the component to a string
    const html = renderToString(
        <Provider store={store}>
            <StaticRouter location={urlToRender} context={{}}>
                {routes}
            </StaticRouter>
        </Provider>
    );
    const helmet = Helmet.renderStatic();

    // Grab the initial state from our Redux store
    const preloadedState = store.getState();

    // Send the rendered page back to the client
    res.send(renderFullPage(helmet, html, preloadedState));
}

SSR से शुरू होने वाले लोगों के लिए मेरा सुझाव स्थिर html की सेवा करना होगा। आप CSR SPA ऐप चलाकर स्थिर HTML प्राप्त कर सकते हैं:

document.getElementById('root').innerHTML

मत भूलना, SSR का उपयोग करने का एकमात्र कारण होना चाहिए:

  1. एसईओ
  2. तेजी से लोड (मैं यह छूट होगी)

हैक: https://medium.com/@gagan_goku/react-and-server-side-rendering-ssr-444d8c48abfc

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.