ReactJS সার্ভার-সাইড রেন্ডারিং বনাম ক্লায়েন্ট-সাইড রেন্ডারিং


120

আমি সবেমাত্র রিএ্যাকটিজেএস অধ্যয়ন শুরু করেছি এবং সন্ধান করেছি যে এটি আপনাকে পৃষ্ঠা সরবরাহ করার জন্য দুটি উপায় দেয়: সার্ভার-সাইড এবং ক্লায়েন্ট-সাইড। তবে, আমি কীভাবে এটি একসাথে ব্যবহার করব তা বুঝতে পারি না। অ্যাপ্লিকেশন তৈরির জন্য এটি কি 2 টি পৃথক উপায়, বা সেগুলি একসাথে ব্যবহার করা যেতে পারে?

যদি আমরা এটি একসাথে ব্যবহার করতে পারি, এটি কীভাবে করা যায় - আমাদের কি সার্ভারের সাইড এবং ক্লায়েন্টের পক্ষের একই উপাদানগুলির নকল করতে হবে? বা, আমরা কি সার্ভারে আমাদের অ্যাপ্লিকেশনটির স্থিতিশীল অংশগুলি এবং ক্লায়েন্ট সাইডের গতিশীল অংশগুলি ইতিমধ্যে প্রাক-রেন্ডার করা সার্ভারের সাথে কোনও সংযোগ ছাড়াই তৈরি করতে পারি?


1
সংক্ষিপ্ত উত্তর, না - আপনি decouple করতে পারেন, স্থির এইচটিএমএল প্রেরণ এবং ক্লায়েন্ট রেন্ডারে সম্পূর্ণরূপে এটি পরিবর্তন করতে পারেন। আমার উত্তরে বিশদ যুক্ত করেছেন।
কিরা

উত্তর:


108

প্রদত্ত ওয়েবসাইট / ওয়েব-অ্যাপ্লিকেশনটির জন্য, আপনি ক্লায়েন্ট-সাইড , সার্ভার-সাইড বা উভয়ই প্রতিক্রিয়া ব্যবহার করতে পারেন ।

মক্কেলের পক্ষে

এখানে, আপনি ব্রাউজারে পুরোপুরি ReactJS চালাচ্ছেন। এটি সহজতম সেটআপ এবং এতে বেশিরভাগ উদাহরণ অন্তর্ভুক্ত রয়েছে ( http://reactjs.org- এ অন্তর্ভুক্ত )। সার্ভার দ্বারা রেন্ডার করা প্রাথমিক এইচটিএমএল হ'ল একটি স্থানধারক এবং আপনার সমস্ত স্ক্রিপ্ট লোড হয়ে গেলে পুরো ইউআই ব্রাউজারে রেন্ডার হয়।

সার্ভার সাইড

ReactJS কে এখানে সার্ভার-সাইড টেম্প্লেটিং ইঞ্জিন হিসাবে ভাবেন (যেমন জেড, হ্যান্ডেলবারগুলি, ইত্যাদি ...)। সার্ভার দ্বারা রেন্ডার করা HTMLটিতে UI যেমন রয়েছে তেমন রয়েছে এবং আপনি কোনও স্ক্রিপ্ট লোড হওয়ার জন্য অপেক্ষা করবেন না। আপনার পৃষ্ঠাটি কোনও অনুসন্ধান ইঞ্জিন দ্বারা সূচিযুক্ত করা যেতে পারে (যদি কোনও জাভাস্ক্রিপ্ট চালায় না)।

যেহেতু ইউআইটি সার্ভারে রেন্ডার করা হয়েছে, আপনার ইভেন্ট হ্যান্ডলারের কোনওটিই কাজ করবে না এবং কোনও ইন্টারঅ্যাক্টিভিটি নেই (আপনার একটি স্ট্যাটিক পৃষ্ঠা রয়েছে)।

উভয়

এখানে, প্রাথমিক রেন্ডারটি সার্ভারে রয়েছে। সুতরাং, ব্রাউজারের দ্বারা প্রাপ্ত এইচটিএমএলটির ইউআই যেমন রয়েছে তেমন। স্ক্রিপ্টগুলি লোড হয়ে গেলে আপনার উপাদানগুলির ইভেন্ট হ্যান্ডলারগুলি সেট আপ করতে ভার্চুয়াল ডিওএম আবার একবার রেন্ডার হয়।

এখানে, আপনাকে নিশ্চিত করতে হবে যে আপনি ঠিক একই ভার্চুয়াল ডিওএম (রুট রিএ্যাকটিজেএস উপাদান) propsসার্ভারে রেন্ডার করার জন্য একই ব্যবহার করেছিলেন। অন্যথায়, রিঅ্যাক্টজেএস অভিযোগ করবে যে সার্ভার-সাইড এবং ক্লায়েন্ট-সাইড ভার্চুয়াল ডোমগুলি মেলে না।

যেহেতু রিঅ্যাক্টজেএস পুনরায় রেন্ডারগুলির মধ্যে ভার্চুয়াল ডোমগুলিকে পৃথক করে, আসল DOM রূপান্তরিত হয় না। কেবল ইভেন্ট হ্যান্ডলারগুলিই আসল DOM উপাদানগুলির সাথে আবদ্ধ।


1
সুতরাং "উভয়" ক্ষেত্রে সার্ভার রেন্ডারিংয়ের জন্য আমার একই কোডটি দু'বার লিখতে হবে, এবং অন্যটি ক্লায়েন্টে এই ডমটির পুনরুত্পাদন করতে? ডান?
সিমচা

10
আপনার একই কোডটি দু'বার চালানো দরকার । একবার সার্ভারে এবং একবার ক্লায়েন্টে। তবে এটিকে বিবেচনায় নেওয়ার জন্য আপনার উপাদানগুলি লিখতে হবে - উদাহরণস্বরূপ আপনার কোনও অ্যাসিঙ্ক ডেটা আনতে componentWillMount()হবে না কারণ এটি ক্লায়েন্ট এবং সার্ভার উভয়ই চালিত করবে। আপনি একই আউটপুট পাচ্ছেন তা নিশ্চিত করার জন্য আপনার সার্ভারে ডেটা আনার এবং ক্লায়েন্টকে প্রাথমিক রেন্ডারের জন্য এটি উপলব্ধ করার জন্য আপনার একটি কৌশলও প্রয়োজন।
জনি বুচানান

3
এক্সিকিউট করা হচ্ছে কোডটি সার্ভার-সাইডে বা ক্লায়েন্ট-সাইডে ব্যবহার করে কিনা তাও পরীক্ষা করে দেখতে পারেন typeof window == "undefined"এবং তারপরে সেই অনুযায়ী আপনার ডেটা আনতে পারেন।
গৌতম বধ্রিনাথন

আপনার প্রয়োগের সাথে খাপ খায় এমন কোনও উদাহরণের সাথে কি আপনার কোনও লিঙ্ক আছে?
সাওতাটোস

1
@ আইএনডব্লিউ সাধারণত এই ক্ষেত্রে সার্ভার দ্বারা ফিরিয়ে দেওয়া এইচটিএমএল খুব "খালি হাড়", কেবল আপনার জাভাস্ক্রিপ্ট এবং স্টাইলগুলি আমদানি করে এবং এতে একটি <div>প্রতিক্রিয়া লেখা থাকে।
ম্যাট হল্যান্ড

48

চিত্র উত্স: ওয়ালমার্ট ল্যাবস ইঞ্জিনিয়ারিং ব্লগ

SSR

সিএসআর

এনবি: এসএসআর (সার্ভার সাইড রেন্ডারিং), সিএসআর (ক্লায়েন্ট সাইড রেন্ডারিং)।

মূল পার্থক্য হ'ল এসএসআরের সাথে, ক্লায়েন্ট ব্রাউজারের সার্ভারের প্রতিক্রিয়াটিতে, পৃষ্ঠার রেন্ডার করা HTML অন্তর্ভুক্ত রয়েছে। এটি লক্ষ করাও গুরুত্বপূর্ণ যে যদিও এসএসআর সহ, পৃষ্ঠাটি আরও দ্রুত সরবরাহ করে। জেএস ফাইলগুলি ডাউনলোড না করা এবং ব্রাউজারটি প্রতিক্রিয়া কার্যকর না করা পর্যন্ত পৃষ্ঠা ব্যবহারকারীদের ইন্টারঅ্যাক্টের জন্য প্রস্তুত হবে না।

একটি খারাপ দিকটি হ'ল এসএসআর টিটিএফবি (টাইম টু ফার্স্ট বাইট) কিছুটা দীর্ঘ হতে পারে। বোধগম্য তাই, কারণ সার্ভারটি এইচটিএমএল ডকুমেন্ট তৈরি করতে কিছুটা সময় নেয় যা ফলস্বরূপ সার্ভারের প্রতিক্রিয়ার আকার বাড়ায়।


4

আমি আসলে একই গবেষণাটি বেশ খানিকটা ভাবছিলাম এবং আপনি যে উত্তরটি খুঁজছেন তা মন্তব্যগুলিতে দেওয়া হয়েছিল তবে আমি মনে করি এটি আরও সুস্পষ্ট হওয়া উচিত তাই আমি এই পোস্টটি লিখছি (যা আমি একবার আপডেট করে আসব আমি একবার এসে হাজির হতে পারলে) কমপক্ষে প্রশ্নবিদ্ধভাবে স্থপতি হিসাবে সমাধানটি আমি খুঁজে পেতে এর আরও ভাল উপায়।

আপনি আপনার উপাদান লিখতে হবে মনে উভয় উপায় এইভাবে মূলত নির্বাণ ifসুইচ সর্বত্র কিনা তা নির্ধারণ করতে আপনি ক্লায়েন্ট বা সার্ভারে এবং তারপর উপর ডিবি অনুসন্ধান (অথবা যাই হোক না কেন সার্ভারে উপযুক্ত) অথবা বিশ্রাম কল হিসাবে পারেন না ( ক্লায়েন্ট)। তারপরে আপনাকে এন্ডপয়েন্টগুলি লিখতে হবে যা আপনার ডেটা তৈরি করে এবং ক্লায়েন্টের কাছে এটি প্রকাশ করে এবং আপনি সেখানে যান।

আবার, একটি ক্লিনার সমাধান সম্পর্কে জানতে পেরে খুশি।


2

অ্যাপ্লিকেশন তৈরির জন্য এটি কি 2 টি পৃথক উপায়, বা সেগুলি একসাথে ব্যবহার করা যেতে পারে?

তারা একসাথে ব্যবহার করা যেতে পারে।

যদি আমরা এটি একসাথে ব্যবহার করতে পারি, এটি কীভাবে করা যায় - আমাদের কি সার্ভারের সাইড এবং ক্লায়েন্টের পক্ষের একই উপাদানগুলির নকল করতে হবে? বা, আমরা কি সার্ভারে আমাদের অ্যাপ্লিকেশনটির স্থিতিশীল অংশগুলি এবং ক্লায়েন্ট সাইডের গতিশীল অংশগুলি ইতিমধ্যে প্রাক-রেন্ডার করা সার্ভারের সাথে কোনও সংযোগ ছাড়াই তৈরি করতে পারি?

রিফ্লো এবং পুনরায় রঙ অপারেশন এড়ানোর জন্য একই লেআউটটি রেন্ডার করা ভাল, কম ঝাঁকুনি / ব্লিঙ্কস, আপনার পৃষ্ঠাটি মসৃণ হবে। তবে এটি কোনও সীমাবদ্ধতা নয়। আপনি খুব ভাল ক্যাশে পারে SSR HTML (কিছু বিদ্যুদ্বাহক প্রতিক্রিয়া সময় কেটে ফেলতে করে) / একটি স্ট্যাটিক এইচটিএমএল যা সিএসআর (ক্লায়েন্ট সাইড রেন্ডার) দ্বারা ওভাররাইট পরার পাঠান।

আপনি যদি কেবল এসএসআর দিয়ে শুরু করছেন তবে আমি সহজ শুরু করার সুপারিশ করব, এসএসআর খুব দ্রুত জটিল হয়ে উঠতে পারে। সার্ভারে এইচটিএমএল তৈরির অর্থ উইন্ডো, ডকুমেন্টের (যেমন আপনার ক্লায়েন্টের মধ্যে রয়েছে) অ্যাক্সেস হারিয়ে যাওয়া, অ্যাসিঙ্ক অপারেশনগুলি (বাক্সের বাইরে) অন্তর্ভুক্ত করার ক্ষমতা হারাতে এবং আপনার কোড এসএসআরকে সামঞ্জস্য করার জন্য সাধারণত প্রচুর কোড সম্পাদনা ( যেহেতু আপনার বান্ডেল.জেগুলি প্যাক করতে আপনাকে ওয়েবপ্যাকটি ব্যবহার করতে হবে)। সিএসএস আমদানির মতো বিষয়গুলি হ'ল বনাম আমদানি হঠাৎ আপনাকে কামড় দেওয়া শুরু করে (ওয়েবপ্যাক ছাড়াই ডিফল্ট প্রতিক্রিয়া অ্যাপ্লিকেশনটিতে এটি নয়)।

এসএসআরের সাধারণ প্যাটার্নটি দেখতে এটির মতো। একটি এক্সপ্রেস সার্ভার অনুরোধ পরিবেশন করছে:

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));
}

এসএসআর দিয়ে শুরু হওয়া লোকদের আমার পরামর্শ হ'ল স্থির এইচটিএমএল সরবরাহ করা। আপনি সিএসআর এসপিএ অ্যাপ্লিকেশন চালিয়ে স্থির এইচটিএমএল পেতে পারেন:

document.getElementById('root').innerHTML

ভুলে যাবেন না, এসএসআর ব্যবহারের একমাত্র কারণগুলি হ'ল:

  1. এসইও
  2. দ্রুত বোঝা (আমি এটি ছাড় দেব)

হ্যাক: https://medium.com/@gagan_goku/react-and-server-side-rendering-ssr-444d8c48abfc

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.