最初にページがサーバーによってレンダリングされ、クライアント/ブラウザ側では、Javascriptスクリプトがページ全体を再レンダリングします。
これは非常に悪いユーザーエクスペリエンスなので、これがどのようになっているのかとは思いません。サーバー側とクライアント側のレンダリングがシームレスではない
私が気づいたことの1つは、サーバによってレンダリングされるような私のルート要素のdata-reactid
属性が.2t5ll4229s
のようなハッシュであり、すべての子供が接頭辞としてそれを持っているということです。 .2t5ll4229s.0
(最初の子)。一方、ブラウザ側では、data-reactid
はルート要素では.0
、最初の子では.0.0
です。
ここでdata-reactid
が本当に犯人である場合、クライアント側とサーバー側の両方でeric123
のような選択値を設定する方法があります。
ここでdata-reactid
が原因ではない場合、Reactシームレスのサーバー側とクライアント側のレンダリングを行うにはどうすればよいですか?つまり、すべてのものではなくクライアント側で特定の要素のみをレンダリングする必要があります。
私のインデックスサーバーlocal.htmlテンプレート:
...
<body>
<div id="content" class="container-fluid wrapper no-padding-left no-padding-right">
{{{reactHtml}}}
</div>
<script src="bundle.js"></script>
</body>
...
マイserver.js:
server.get('*', function (req, res) {
console.log('request url', req.url);
log.debug('routes are', JSON.stringify(routes));
res.header("Access-Control-Allow-Origin", "*");
match({routes, location: req.url}, (error, redirectLocation, renderProps) => {
if (renderProps) {
let htmlStr = React.renderToString(<RoutingContext {...renderProps} />);
res.render('index-server-local', { reactHtml: htmlStr });
}
}
マイbrowser.js:
React.render(<Router history={history} routes={routeConfig} />, document.getElementById('content'));
私は反応ルータ1.0.0と反応0.13.3を使用しています。
おかげ@デビッド関、私は、サーバーからブラウザにそのことについて心配する値を渡していないための方法を持っています。しかし、最初にサーバー側でハッシュ接頭辞を取得するにはどうすればよいでしょうか?私はあなたが話していることを理解していない、シリアライゼーションとデシリアライゼーションがここで私を助けることができる方法 – ericn
@eric 'ハッシュプレフィックス'。あなたはhashHistoryを使用していますか?それはサーバー側のレンダリングでは機能しません。 – Nal