এসিনক্রোনাসলি আর্কিটাইজড React.js উপাদানগুলির সার্ভার-সাইড রেন্ডারিংয়ের কৌশলসমূহ


114

সবচেয়ে বড় সুবিধার একটি React.js হতে অনুমিত হয় সার্ভার সাইড রেন্ডারিং । সমস্যাটি হ'ল মূল ফাংশনটি React.renderComponentToString()সিঙ্ক্রোনাস যা কোনও অ্যাসিনক্রোনাস ডেটা লোড করা অসম্ভব করে দেয় কারণ উপাদান ক্রিয়াকলাপটি সার্ভারে রেন্ডার হয়।

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

আমি সত্যিই মত সর্দি স্থাপত্য কারণ এটি জিনিস অনেক অনেক সহজ করে তোলে, এবং তার দোকানে সার্ভার ও ক্লায়েন্টের মধ্যে রাষ্ট্র ভাগ করে নেওয়ার জন্য নিখুঁত। মন্তব্যগুলি সম্বলিত আমার স্টোরটি একবার শুরু হয়ে গেলে, আমি কেবল এটি সিরিয়ালাইজ করতে পারি এবং এটি সার্ভার থেকে ক্লায়েন্টে পাঠাতে পারি যেখানে এটি সহজে পুনরুদ্ধার হয় is

আমার দোকানটি জনপ্রিয় করার সবচেয়ে ভাল উপায়টি হল প্রশ্ন। বিগত দিনগুলিতে আমি প্রচুর পরিমাণে গুগল করছি এবং আমি কয়েকটি কৌশল নিয়ে এসেছি, যার মধ্যে রিয়াকের এই বৈশিষ্ট্যটি "প্রচারিত" হচ্ছে কত তা বিবেচনা করে সত্যই ভাল লাগেনি।

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

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

  3. আমি নিজে থেকে একটু ভাবছিলাম। আমি বাস্তবায়নের বিশদটি সত্যই ভাবি নি তবে সাধারণ ধারণাটি হ'ল আমি উপাদানগুলি একই রকমভাবে রিঅ্যাক্ট-অ্যাসিঙ্ক হিসাবে প্রসারিত করব এবং তারপরে আমি বারবার মূল উপাদানটিতে React.renderComp घटकToString () কল করব। প্রতিটি পাসের সময় আমি প্রসারিত কলব্যাকগুলি সংগ্রহ করতাম এবং তারপরে স্টোরগুলিকে জনপ্রিয় করার জন্য তাদের পাস এবং পাসে কল করতাম। আমি বর্তমান পদক্ষেপের পুনরাবৃত্তি করব যতক্ষণ না বর্তমান উপাদানগুলির শ্রেণিবিন্যাসের জন্য প্রয়োজনীয় সমস্ত স্টোর পপুলেটে যায়। সমাধানের জন্য অনেকগুলি বিষয় রয়েছে এবং আমি অভিনয় সম্পর্কে বিশেষত অনিশ্চিত uns

আমি কি কিছু রেখে গেলাম? অন্য কোন পন্থা / সমাধান আছে? এই মুহূর্তে আমি প্রতিক্রিয়া-অ্যাসিঙ্ক / ফাইবারের পথে যাওয়ার কথা ভাবছি তবে দ্বিতীয় দফায় বর্ণিত হিসাবে এটি সম্পর্কে আমি পুরোপুরি নিশ্চিত নই।

গিটহাব সম্পর্কিত সম্পর্কিত আলোচনা । স্পষ্টতই, কোনও অফিসিয়াল পদ্ধতির বা এমনকি কোনও সমাধান নেই। সম্ভবত আসল প্রশ্নটি কীভাবে প্রতিক্রিয়া উপাদানগুলি ব্যবহার করার উদ্দেশ্যে তৈরি করা হয়। সাধারণ দর্শনের স্তরটির মতো (আমার পরামর্শের এক নম্বর বেশ) বা বাস্তব স্বাধীন এবং স্বতন্ত্র উপাদানগুলির মতো?


কেবল জিনিসগুলি পেতে: অ্যাসিক্রোনাস কলগুলি সার্ভার-সাইডেও ঘটবে? এই ক্ষেত্রে সুবিধাগুলি কিছু অংশ খালি রেখে ভিউ রেন্ডার করার বিরোধিতা হিসাবে এবং অ্যাসিঙ্ক্রোনাস প্রতিক্রিয়া থেকে ফলাফল আসার সাথে সাথে এটি পূরণ করার পক্ষে আমি বুঝতে পারি না। সম্ভবত কিছু অনুপস্থিত, দুঃখিত!
phtrivier

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

অবশ্যই, তবে আপনি কি পুরো পৃষ্ঠাটি রেন্ডার করার চেষ্টা করছেন (একবারে সমস্ত অ্যাসিনক্রোনাস ডিবি ক্যোয়ারী প্রতিক্রিয়া জানায়)? কোন ক্ষেত্রে, আমি নির্লিপ্তভাবে এটি 1 হিসাবে আলাদা করে / সমস্ত ডেটা আনয়নকালে 2 / এনে আনার পরে, এটি একটি "বোবা" প্রতিক্রিয়া দর্শনে প্রেরণ করব এবং অনুরোধটির প্রতিক্রিয়া জানাব। অথবা আপনি উভয়ই সার্ভার-সাইড রেন্ডারিংয়ের চেষ্টা করছেন, তারপরে একই কোডের সাথে ক্লায়েন্ট-সাইড (এবং আপনাকে অ্যাসিঙ্ক কোডটি প্রতিক্রিয়ার দৃশ্যের কাছাকাছি হওয়া দরকার?) দুঃখিত, যদি এটি নির্বোধ মনে হয়, আমি ঠিক নিশ্চিত নই যে আমি পেয়েছি তুমি কি করছ.
phtrivier

কোনও সমস্যা নেই, সম্ভবত অন্যান্য লোকদেরও বুঝতে সমস্যা রয়েছে :) আপনি যা বর্ণনা করেছেন সেটি সমাধান নম্বর দুটি। তবে প্রশ্ন থেকে মন্তব্য করার জন্য উপাদানটির উদাহরণস্বরূপ নিন। সাধারণ ক্লায়েন্ট-সাইড অ্যাপ্লিকেশনটিতে আমি সেই উপাদানটিতে সমস্ত কিছু করতে পারি (মন্তব্যগুলি লোড করা / যুক্ত করা)। উপাদানটি বাইরের বিশ্ব থেকে পৃথক হবে এবং বহিরাগতকে এই উপাদানটির যত্ন নিতে হবে না। এটি সম্পূর্ণ স্বাধীন এবং একক হবে। তবে একবার আমি সার্ভার-সাইড রেন্ডারিং চালু করতে চাইলে আমাকে অ্যাসিক্রোনাস স্টাফ বাইরে পরিচালনা করতে হবে। এবং এটি পুরো নীতিটি ভঙ্গ করে।
tobik

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

উত্তর:


15

আপনি যদি প্রতিক্রিয়া-রাউটার ব্যবহার করেন , আপনি কেবলমাত্র willTransitionToউপাদানগুলির মধ্যে একটি পদ্ধতি নির্ধারণ করতে পারেন , যা Transitionআপনি কল করতে পারেন এমন একটি অবজেক্টটি পাস হয়ে .waitযায়।

রেন্ডারটোস্ট্রিং সিঙ্ক্রোনাস হয় কিনা তাতে কিছু আসে যায় না কারণ Router.runসমস্ত .waitএড প্রতিশ্রুতি সমাধান না হওয়া পর্যন্ত কলব্যাক কল করা হবে না , সুতরাং renderToStringমিডলওয়্যারের মাধ্যমে সময়ের মধ্যে আপনি স্টোরগুলি পপুলেট করতে পারবেন। এমনকি যদি স্টোরগুলি সিলেটন হয় তবে আপনি সিঙ্ক্রোনাস রেন্ডারিং কল করার আগে অস্থায়ীভাবে কেবলমাত্র তাদের ডেটা সেট করতে পারেন এবং উপাদানটি এটি দেখতে পাবে।

মিডওয়্যারের উদাহরণ:

var Router = require('react-router');
var React = require("react");
var url = require("fast-url-parser");

module.exports = function(routes) {
    return function(req, res, next) {
        var path = url.parse(req.url).pathname;
        if (/^\/?api/i.test(path)) {
            return next();
        }
        Router.run(routes, path, function(Handler, state) {
            var markup = React.renderToString(<Handler routerState={state} />);
            var locals = {markup: markup};
            res.render("layouts/main", locals);
        });
    };
};

routesবস্তু (যা যাত্রাপথ অনুক্রমের বর্ণনা) ক্লায়েন্ট এবং সার্ভারের সাথে ধারণকৃত ভাগ করা হয়


ধন্যবাদ। জিনিসটি যতদূর আমি জানি, কেবল রুটের উপাদানগুলি এই willTransitionToপদ্ধতিটিকে সমর্থন করে । যার অর্থ হ'ল আমি এখনও প্রশ্নের মধ্যে বর্ণিত মত সম্পূর্ণরূপে স্ট্যান্ডেলোন পুনরায় ব্যবহারযোগ্য উপাদানগুলি রচনা করা সম্ভব নয়। তবে আমরা যদি ফাইবার্সের সাথে যেতে রাজি না হই তবে সার্ভার-সাইড রেন্ডারিং বাস্তবায়নের জন্য এটি সম্ভবত সেরা এবং সর্বাধিক প্রতিক্রিয়াজনক উপায়।
tobik

এটা মজার. কীভাবে উইল ট্রান্সসনটিও পদ্ধতির বাস্তবায়ন অ্যাসিঙ্ক ডেটা লোড হওয়ার মতো দেখায়?
হায়রা

আপনি transitionপরামিতি হিসাবে অবজেক্টটি পাবেন , তাই আপনি কেবল কল করবেন transition.wait(yourPromise)। অবশ্যই এর অর্থ এই যে প্রতিশ্রুতিগুলি সমর্থন করার জন্য আপনাকে আপনার এপিআই প্রয়োগ করতে হবে। এই পদ্ধতির আর একটি অসুবিধা হ'ল ক্লায়েন্টের পক্ষে "লোডিং ইন্ডিকেটর" প্রয়োগের কোনও সহজ উপায় নেই। সমস্ত প্রতিশ্রুতি সমাধান না হওয়া পর্যন্ত রূপান্তর হ্যান্ডলার উপাদানটিতে স্যুইচ করবে না।
টোবিক

তবে আমি আসলে "ইন-টাইম" পদ্ধতির বিষয়ে নিশ্চিত নই about একাধিক নেস্টেড রুট হ্যান্ডলাররা একটি ইউআরএল মিলতে পারে যার অর্থ একাধিক প্রতিশ্রুতি সমাধান করতে হবে। এগুলি একই সাথে শেষ হবে এমন কোনও গ্যারান্টি নেই। স্টোরগুলি যদি একক হয় তবে এটি দ্বন্দ্বের কারণ হতে পারে। @ এসাইলিজা আপনি কি নিজের উত্তরটি কিছুটা ব্যাখ্যা করতে পারবেন?
tobik

আমার জায়গায় স্বয়ংক্রিয় নদীর গভীরতানির্ণয় রয়েছে যা সমস্ত প্রতিশ্রুতি সংগ্রহ করে যা .waitedএকটি রূপান্তরের জন্য। সবগুলি পূরণ হয়ে গেলে .runকলব্যাক কল করা হয়। .render()প্রতিশ্রুতি থেকে সমস্ত ডেটা একসাথে সংগ্রহ করার আগে এবং সিনগেলটন স্টোরের রাজ্যগুলি সেট করার ঠিক আগে , তারপরে রেন্ডার কলের পরের পরের লাইনে আমি সিঙ্গলটন স্টোরগুলি আবার শুরু করি। এটি বেশ হ্যাকি তবে এটি সমস্তই স্বয়ংক্রিয়ভাবে ঘটে এবং উপাদান এবং স্টোর অ্যাপ্লিকেশন কোডটি কার্যত একই থাকে।
ইসাইলিজা

0

আমি জানি এটি সম্ভবত আপনি যা চান ঠিক তা নয়, এবং এটি বোধগম্য হতে পারে না, তবে আমি মনে করি উভয়কে সামলানোর জন্য উপাদানটি সামান্য সংশোধন করেই পেয়েছি:

  • সার্ভার সাইডে রেন্ডারিং, ইতিমধ্যে পুনরুদ্ধার করা সমস্ত প্রারম্ভিক অবস্থা সহ, প্রয়োজনে অ্যাসিঙ্ক্রোনিক্যালি)
  • প্রয়োজনে এজাক্স সহ ক্লায়েন্টের পক্ষে রেন্ডারিং

সুতরাং যেমন কিছু:

/** @jsx React.DOM */

var UserGist = React.createClass({
  getInitialState: function() {

    if (this.props.serverSide) {
       return this.props.initialState;
    } else {
      return {
        username: '',
        lastGistUrl: ''
      };
    }

  },

  componentDidMount: function() {
    if (!this.props.serverSide) {

     $.get(this.props.source, function(result) {
      var lastGist = result[0];
      if (this.isMounted()) {
        this.setState({
          username: lastGist.owner.login,
          lastGistUrl: lastGist.html_url
        });
      }
    }.bind(this));

    }

  },

  render: function() {
    return (
      <div>
        {this.state.username}'s last gist is
        <a href={this.state.lastGistUrl}>here</a>.
      </div>
    );
  }
});

// On the client side
React.renderComponent(
  <UserGist source="https://api.github.com/users/octocat/gists" />,
  mountNode
);

// On the server side
getTheInitialState().then(function (initialState) {

    var renderingOptions = {
        initialState : initialState;
        serverSide : true;
    };
    var str = Xxx.renderComponentAsString( ... renderingOptions ...)  

});

আমি দুঃখিত আমি হাতে সঠিক কোড নেই, তাই এটি বাক্স থেকে কার্যকর না হতে পারে, কিন্তু আমি আলোচনার আগ্রহ পোস্ট করছি।

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


1
ধন্যবাদ. আমি ধারণাটি পাই, তবে আমি যা চাই তা আসলে তা নয়। ধরা যাক আমি বিবিসি ডটকমের মতো প্রতিক্রিয়া ব্যবহার করে আরও কিছু জটিল ওয়েবসাইট তৈরি করতে চাই । পৃষ্ঠাটির দিকে তাকিয়ে আমি সর্বত্র "উপাদানগুলি" দেখতে পাচ্ছি। একটি বিভাগ (খেলাধুলা, ব্যবসা ...) একটি সাধারণ উপাদান। আপনি কীভাবে এটি বাস্তবায়ন করবেন? আপনি কোথায় সমস্ত তথ্য উপস্থাপন করবেন? এই জাতীয় একটি জটিল সাইট ডিজাইন করার জন্য, উপাদানগুলি (নীতি হিসাবে, ছোট এমভিসি পাত্রে যেমন) খুব ভাল (যদি কেবলমাত্র একমাত্র) যেতে যেতে পারে। উপাদানটি সাধারণ পদ্ধতির সার্ভার-সাইড ফ্রেমওয়ার্কের জন্য সাধারণ। প্রশ্নটি: আমি কি তার জন্য প্রতিক্রিয়া ব্যবহার করতে পারি?
tobik

আপনি সার্ভার-সাইডে ডেটাটি প্রিফেস করবেন (সম্ভবত এটি "প্রথাগত" সার্ভার-সাইড টেম্পলেট সিস্টেমে প্রেরণের আগে এই ক্ষেত্রে এটি ঘটেছে); কেবলমাত্র তথ্য প্রদর্শনটি মডুলার হওয়া থেকে উপকারে আসে, এর অর্থ কি ডেটারের গণনাটি একই কাঠামোটি অনুসরণ করতে হয়? আমি এখানে কিছুটা শয়তানের উকিল খেলছি, ওম চেক করার সময় আপনার একই সমস্যা হয়েছিল। এবং আমি নিশ্চিত যে এরপরে কারও সম্পর্কে আরও অন্তর্দৃষ্টি রয়েছে তবে আমি করি - তারের যে কোনও দিকে নির্বিঘ্নে স্টোপগুলি রচনা করা অনেক সহায়তা করবে।
phtrivier

1
কোড দ্বারা যেখানে আমি মানে। কন্ট্রোলারে? সুতরাং বিবিসি-র হোম পেজ পরিচালনা করার নিয়ন্ত্রক পদ্ধতিতে প্রতিটি বিভাগের জন্য একাধিক অনুরূপ কোয়েরি থাকবে? এটাই তো জাহান্নামের পথ way তাই হ্যাঁ, আমি কি করতে মনে করে যে, গণনার পাশাপাশি মডুলার হওয়া উচিত। একটি এমভিসি পাত্রে একটি উপাদান, প্যাক করা সমস্ত কিছুই। এইভাবে আমি স্ট্যান্ডার্ড সার্ভার-সাইড অ্যাপ্লিকেশনগুলি বিকাশ করি এবং আমি দৃ pretty়ভাবে আত্মবিশ্বাসী যে এই পদ্ধতিটি ভাল। এবং আমি কেন রিঅ্যাক্ট.জেএস সম্পর্কে এতটাই উচ্ছ্বসিত তা হ'ল দুর্দান্ত ক্লাসিক এবং সার্ভার উভয় দিকেই দুর্দান্ত পদ্ধতিতে অ্যাপস তৈরির জন্য এই পদ্ধতির ব্যবহারের দুর্দান্ত সম্ভাবনা রয়েছে।
tobik

1
যে কোনও সাইটে (বৃহত্তর / ছোট), আপনাকে কেবল সার্ভার-সাইড রেন্ডার করতে হবে (এসএসআর) বর্তমান পৃষ্ঠাকে এর ইআরআই রাষ্ট্রের সাথে; আপনার প্রতিটি পৃষ্ঠার জন্য আরআইডি রাষ্ট্রের প্রয়োজন নেই। সার্ভারটি ডিআইজি রাষ্ট্রটি ধরে ফেলে, এটি সরবরাহ করে এবং ক্লায়েন্টের কাছে দেয় <script type=application/json>{initState}</script>; এই ভাবে ডেটা এইচটিএমএল থাকবে। ক্লায়েন্টকে রেন্ডার কল করে পৃষ্ঠায় রিহাইড্রেট / বাঁধাই UI ইভেন্টগুলি। পরবর্তী পৃষ্ঠাগুলি ক্লায়েন্টের জেএস কোড দ্বারা তৈরি করা হয়েছে (প্রয়োজনীয় হিসাবে ডেটা আনছে) এবং ক্লায়েন্ট দ্বারা রেন্ডার করা হয়েছে। এইভাবে যে কোনও রিফ্রেশ তাজা এসএসআর পৃষ্ঠা লোড করবে এবং একটি পৃষ্ঠায় ক্লিক করা হবে সিএসআর। = আইসোমরফিক এবং এসইও বান্ধব
ফেডেরিকো

0

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

সুতরাং আমি কেবলমাত্র একটি সিদ্ধান্ত নিয়েছি যে প্রাথমিক ডেটা যা লোডে ফ্লাক্স স্টোরে রেন্ডার করা দরকার, আমি একটি এজেএক্স অনুরোধ সম্পাদন করব এবং স্টোরের মধ্যে প্রাথমিক ডেটা পাস করব

আমি এই উদাহরণের জন্য ফ্লাক্সক্সর ব্যবহার করছিলাম।

সুতরাং আমার এক্সপ্রেস রুটে, এই ক্ষেত্রে একটি /productsরুট:

var request = require('superagent');
var url = 'http://myendpoint/api/product?category=FI';

request
  .get(url)
  .end(function(err, response){
    if (response.ok) {    
      render(res, response.body);        
    } else {
      render(res, 'error getting initial product data');
    }
 }.bind(this));

তারপরে আমার রেন্ডার পদ্ধতিটি আরম্ভ করুন যা ডেটা স্টোরকে দেয়।

var render = function (res, products) {
  var stores = { 
    productStore: new productStore({category: category, products: products }),
    categoryStore: new categoryStore()
  };

  var actions = { 
    productActions: productActions,
    categoryActions: categoryActions
  };

  var flux = new Fluxxor.Flux(stores, actions);

  var App = React.createClass({
    render: function() {
      return (
          <Product flux={flux} />
      );
    }
  });

  var ProductApp = React.createFactory(App);
  var html = React.renderToString(ProductApp());
  // using ejs for templating here, could use something else
  res.render('product-view.ejs', { app: html });

0

আমি জানি এই প্রশ্নটি এক বছর আগে জিজ্ঞাসা করা হয়েছিল কিন্তু আমাদের একই সমস্যা ছিল এবং আমরা নীড় প্রতিশ্রুতি দিয়ে সমাধান করি যা রেন্ডার হতে চলেছে এমন উপাদানগুলি থেকে উদ্ভূত হয়েছিল। শেষ পর্যন্ত আমাদের কাছে অ্যাপটির জন্য সমস্ত ডেটা ছিল এবং কেবল এটি পাঠিয়ে দেওয়া sent

উদাহরণ স্বরূপ:

var App = React.createClass({

    /**
     *
     */
    statics: {
        /**
         *
         * @returns {*}
         */
        getData: function (t, user) {

            return Q.all([

                Feed.getData(t),

                Header.getData(user),

                Footer.getData()

            ]).spread(
                /**
                 *
                 * @param feedData
                 * @param headerData
                 * @param footerData
                 */
                function (feedData, headerData, footerData) {

                    return {
                        header: headerData,
                        feed: feedData,
                        footer: footerData
                    }

                });

        }
    },

    /**
     *
     * @returns {XML}
     */
    render: function () {

        return (
            <label>
                <Header data={this.props.header} />
                <Feed data={this.props.feed}/>
                <Footer data={this.props.footer} />
            </label>
        );

    }

});

এবং রাউটারে

var AppFactory = React.createFactory(App);

App.getData(t, user).then(
    /**
     *
     * @param data
     */
    function (data) {

        var app = React.renderToString(
            AppFactory(data)
        );       

        res.render(
            'layout',
            {
                body: app,
                someData: JSON.stringify(data)                
            }
        );

    }
).fail(
    /**
     *
     * @param error
     */
    function (error) {
        next(error);
    }
);

0

আমার সাথে সার্ভার সাইড রেন্ডারিংয়ের আমার পদ্ধতিটি আপনার সাথে ভাগ করে নিতে চান Flux, উদাহরণস্বরূপ খুব সহজ করুন:

  1. ধরা যাক আমাদের কাছে componentস্টোর থেকে প্রাথমিক ডেটা রয়েছে:

    class MyComponent extends Component {
      constructor(props) {
        super(props);
        this.state = {
          data: myStore.getData()
        };
      }
    }
  2. প্রাথমিক অবস্থার জন্য শ্রেণিতে যদি কিছু প্রাক লোড করা ডেটা প্রয়োজন হয় তবে আসুন এর জন্য লোডার তৈরি করুন MyComponent:

     class MyComponentLoader {
        constructor() {
            myStore.addChangeListener(this.onFetch);
        }
        load() {
            return new Promise((resolve, reject) => {
                this.resolve = resolve;
                myActions.getInitialData(); 
            });
        }
        onFetch = () => this.resolve(data);
    }
  3. দোকান:

    class MyStore extends StoreBase {
        constructor() {
            switch(action => {
                case 'GET_INITIAL_DATA':
                this.yourFetchFunction()
                    .then(response => {
                        this.data = response;
                        this.emitChange();
                     });
                 break;
        }
        getData = () => this.data;
    }
  4. এখন কেবল রাউটারে ডেটা লোড করুন:

    on('/my-route', async () => {
        await new MyComponentLoader().load();
        return <MyComponent/>;
    });

0

একটি সংক্ষিপ্ত রোলআপ হিসাবে -> গ্রাফকিউএল আপনার স্ট্যাকের জন্য এটি পুরোপুরি সমাধান করবে ...

  • গ্রাফকিউএল যোগ করুন
  • অ্যাপোলো এবং প্রতিক্রিয়া-অ্যাপোলো ব্যবহার করুন
  • আপনি রেন্ডারিং শুরু করার আগে "getDataFromTree" ব্যবহার করুন

-> getDataFromTree স্বয়ংক্রিয়ভাবে আপনার অ্যাপ্লিকেশনটিতে জড়িত সমস্ত ক্যোয়ারীগুলি সন্ধান করবে এবং সেগুলি কার্যকর করবে, সার্ভারে আপনার অ্যাপোলো ক্যাশে ছড়িয়ে দেবে এবং এইভাবে সম্পূর্ণ এসএসআর সক্ষম করবে .. বিএমএম

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