2017-05-02 46 views
2

に関する反応し、著者は、次のことを主張したユニバーサルアプリはサーバからクライアントに初期状態を渡すことがベストプラクティスです:ウィンドウ.__ INITIAL_STATE__は依然としてReact Universalアプリケーションでクライアントに初期状態を渡すのに好ましい方法ですか?私は現在、<a href="http://amzn.to/2p4bfsE" rel="nofollow noreferrer">a book</a>を読んでいる

server.js

import React from 'react'; 
import {renderToStaticMarkup} from 'react-dom/server'; 
import Myapp from '../MyApp'; 
import api from '../services'; 

function renderPage(html, initialData) { 
    return ` 
     <html> 
      <body> 
       ${html} 
      </body> 
      <script> 
       window.__INITIAL_STATE__ = ${JSON.stringify(initialData)}; 
      </script> 
      <script src="bundle.js"></script> 
     </html> 
    `; 
} 

export default function(request, reply) { 
    const initialData = api.getData(); 
    const html = renderToStaticMarkup(<MyApp />); 
    reply(renderPage(html, initialData); 
} 

そして、

bundle.js

:それから、クライアントに次のようなデータを読み出します210

const initialData = window.__INITIAL_STATE__ || {}; const mountNode = document.getElementById('root'); ReactDOM.render(<MyApp />, mountNode); 

私が理解していることは、最初の状態が文字列に変換されてから、グローバルオブジェクトリテラルとしてウィンドウオブジェクトにアタッチされることです。

この解決策は非常に荒いです。この本は2016年中頃にリリースされました。window.__INITIAL_STATE__の使い方はまだこれを行う方法ですか、またはより良い解決策がありますか?

例えば、初期状態データを別のマイクロサービス呼び出しで提供することが可能であり、データがドキュメントに直接埋め込まれている場合よりもキャッシュされる可能性が高いと思いますデータが変更されていない場合でも、ページが更新されるたびに転送されます。

+2

[はい](HTTPS:// githubの

しかし、誰があなたがあなたの代わりに何をしたいのかJSON.stringify(initialData)を使用して非常に一般的なXSSの脆弱性を持っていることを指摘しなかった理由私はわからないがにあります.com/reactjs/redux/blob/master/docs/recipes/ServerRendering.md)。あなたのマイクロサービスは実行可能なアプローチですが、余分なHTTPリクエストを作成することと、ページを提供するために行ったHTTPリクエストをピギーバックすることの長所と短所を検討する必要があります。あなたの状態がクライアント側の環境の外で絶えず流動していて、サーバーラウンドトリップが多い場合は、おそらくマイクロサービスが有益でしょう。それではまた、ページをいつもリフレッシュする理由を尋ねたいかもしれません。 – CodingIntrigue

答えて

0

HTTPは、最初の状態が常に同じであれば、応答をキャッシュして動作します。これをサーバー側にキャッシュしてページに表示すると、反応がすぐにアクセスできるため、速く動作しますこの値に設定すると、待機する必要はありません。また、ページをキャッシュするようにブラウザを強制することもできます。そのため、ページの応答は変更されない初期状態で同じになります。

余分な呼び出し要求では、呼び出しをキャッシュするためにブラウザを使用しますが、余分なステップを構築し、情報が到着したときにリア・レンダリングを実行したり、 。

私は番号1を使用して、サーバーの状態をサーバーにロードした後で簡単に実現できる、サーバーのレンダリングのような柔軟性とその他の機能を提供します。

0

かんたん回答:はい。

import serialize from 'serialize-javascript'; 

window.__INITIAL_STATE__ = ${serialize(initialData)}; 
関連する問題

 関連する問題