最大の利点の一つReact.jsをすることになっているサーバー側のレンダリング。問題は、主要な機能React.renderComponentToString()
が同期的であり、コンポーネント階層がサーバー上でレンダリングされるときに非同期データをロードできないことです。
コメント用の汎用コンポーネントがあり、ページのどこにでもドロップできるとしましょう。プロパティは1つだけで、なんらかの識別子(コメントが配置されている記事のIDなど)とその他すべてはコンポーネント自体(コメントの読み込み、追加、管理)によって処理されます。
Fluxアーキテクチャは、多くのことがはるかに簡単になり、そのストアがサーバーとクライアントの間で状態を共有するのに最適であるため、本当に気に入っています。コメントを含むストアを初期化したら、それをシリアル化してサーバーからクライアントに送信し、簡単に復元できます。
問題は、私のストアにデータを追加するための最良の方法は何ですか。過去数日間、私は多くのことをグググルグしていて、いくつかの戦略に出くわしましたが、Reactのこの機能がどれだけ「促進」されているかを考えると、どれも本当に良いようには見えませんでした。
私の意見では、最も簡単な方法は、実際のレンダリングが始まる前にすべてのストアにデータを取り込むことです。これは、コンポーネント階層の外側のどこかを意味します(たとえば、ルーターにフックされています)。このアプローチの問題は、ページ構造をほぼ2回定義する必要があることです。たとえば、多くの異なるコンポーネント(実際のブログ投稿、コメント、関連投稿、最新の投稿、Twitterストリーム...)を含むブログページなど、より複雑なページを考えてみます。Reactコンポーネントを使用してページ構造を設計する必要があり、それから別の場所で、この現在のページに必要な各ストアにデータを取り込むプロセスを定義する必要があります。それは私にとって良い解決策のようには思えません。残念ながら、ほとんどの同形のチュートリアルはこのように設計されています(たとえば、この素晴らしいflux-tutorial)。
React-async。このアプローチは完璧です。これにより、各コンポーネントの特別な関数で状態を初期化する方法(同期か非同期かは関係ありません)を簡単に定義でき、階層がHTMLにレンダリングされるときにこれらの関数が呼び出されます。これは、状態が完全に初期化されるまでコンポーネントがレンダリングされないように機能します。問題は繊維が必要なことですこれは、私が理解している限り、標準のJavaScriptの動作を変更するNode.js拡張機能です。結果は本当に気に入っていますが、解決策を見つけるのではなく、ゲームのルールを変更したようです。そして、React.jsのこのコア機能を使用するためにこれを強制される必要はありません。このソリューションの一般的なサポートについてもわかりません。標準のNode.js Webホスティングでファイバーを使用することは可能ですか?
私は少し独りで考えていました。実装の詳細についてはあまり考えていませんが、一般的な考え方は、コンポーネントをReact-asyncと同じように拡張し、ルートコンポーネントでReact.renderComponentToString()を繰り返し呼び出すというものです。各パスの間に、拡張コールバックを収集し、パスのandでそれらを呼び出して、ストアにデータを取り込みます。現在のコンポーネント階層に必要なすべてのストアにデータが入力されるまで、この手順を繰り返します。解決しなければならないことがたくさんあり、特にパフォーマンスについてはよくわかりません。
私は何か見落としてますか?別のアプローチ/解決策はありますか?現在、react-async / fibersの方法を検討していますが、2番目のポイントで説明したように、完全にはわかりません。
GitHubに関する関連ディスカッション。どうやら、公式なアプローチもソリューションもありません。おそらく本当の問題は、Reactコンポーネントがどのように使用されることが意図されているかです。シンプルなビューレイヤー(かなり私の提案の1番目)のように、または実際の独立したスタンドアロンコンポーネントのように?