Ожидает ли рендеринг на стороне сервера завершения асинхронных вызовов?

При рендеринге на стороне сервера визуализированный HTML отправляется клиенту только после полной загрузки состояния?

Например, если пользователь запрашивает страницу с несколькими асинхронными вызовами API, должен ли клиент будет ждать завершения этих вызовов API, прежде чем он получит какой-либо упакованный HTML?

Если это так, может ли пользователь смотреть в пустое окно браузера, если запрошенная им страница имеет медленные вызовы API? т. е. сервер ожидает завершения вызовов API, прежде чем отправить ответ клиенту.

Я прочитал документацию по адресу http://redux.js.org/docs/recipes/ServerRendering.html, но я не уверен, что правильно его интерпретирую. Может ли кто-нибудь прояснить это для меня?


person whiteElephant    schedule 09.12.2016    source источник


Ответы (1)


Одним словом: НЕТ. ReactDOMServer.renderToString не поддерживает асинхронный вызов из коробки.

Что вы можете сделать, так это предварительно извлечь данные и поместить их в html, а затем отправить обратно клиенту, например:

<script>
   window._preFetchedData = {"somedata": {"post": {//...
</script>

Поэтому, когда страница была отправлена ​​в браузер, внешний интерфейс должен прочитать и загрузить файл preFetchedData.

На мой взгляд, виртуальный дом React предоставил только половину (1/3?) решения проблемы рендеринга на стороне сервера. Для достижения идеального рендеринга на стороне сервера управление потоком данных требует больших усилий, которые во многих случаях не стоят того.

person Ming    schedule 09.12.2016
comment
Спасибо за ответ Мин. Должны ли предварительно извлеченные данные быть данными или это может быть обратный вызов? Причина, по которой я спрашиваю, заключается в том, что для меня не имеет смысла, что пользователю придется ждать, пока сервер предварительно извлечет все данные, что, если API-интерфейсы работают медленно. Пользователь останется с загружаемым браузером до тех пор, пока не будут получены все исходные данные. Имеет ли это смысл? Не могли бы вы объяснить, как решается эта ситуация? - person whiteElephant; 09.12.2016
comment
@whiteElephant Предварительно извлеченные данные должны быть обычными данными. Я понимаю вашу озабоченность. Цель рендеринга на стороне сервера, в конечном счете, состоит в том, чтобы: 1. уменьшить AFT (время над сгибом). 2. SEO. Поэтому предварительно загруженные данные должны содержать только необходимые данные, чтобы пользователи могли их увидеть с первого взгляда. Все последующие данные (например, вызванные взаимодействием с пользователем) будут получены с помощью обычного вызова AJAX на стороне клиента. - person Ming; 10.12.2016
comment
@whiteElephant В обычном SPA браузер будет вызывать вызовы AJAX при загрузке веб-страниц. Пользователи будут тратить время (преобладает время приема-передачи) на ожидание завершения необходимых вызовов AJAX (имя пользователя, сообщения в блоге и т. д.). Используя рендеринг на стороне сервера, вы можете сократить большую часть времени на передачу туда и обратно, поэтому AFT в целом уменьшится. - person Ming; 10.12.2016