Однією з найбільших переваг React.js вважається візуалізація на стороні сервера . Проблема полягає в тому, що функція ключа React.renderComponentToString()
синхронна, що унеможливлює завантаження будь-яких асинхронних даних, оскільки ієрархія компонентів відображається на сервері.
Скажімо, у мене є універсальний компонент для коментування, який я можу залишити майже будь-де на сторінці. У нього є лише одна властивість, якийсь ідентифікатор (наприклад, id статті, під якою розміщуються коментарі), а все інше обробляється самим компонентом (завантаження, додавання, керування коментарями).
Мені дуже подобається архітектура Flux, тому що вона робить багато речей набагато простішими, а її магазини ідеально підходять для обміну станом між сервером і клієнтом. Після ініціалізації мого магазину, що містить коментарі, я можу просто його серіалізувати та відправити з сервера на клієнт, де він легко відновиться.
Питання в тому, який найкращий спосіб заселити мій магазин. Протягом останніх днів я багато гугла, і я натрапила на кілька стратегій, жодна з яких не здавалася дуже хорошою, враховуючи, наскільки ця функція React "просувається".
На мою думку, найпростіший спосіб - це заселити всі мої магазини до того, як розпочнеться фактична візуалізація. Це означає десь за межами ієрархії компонентів (наприклад, підключений до мого маршрутизатора). Проблема такого підходу полягає в тому, що мені доведеться майже два рази визначити структуру сторінки. Розглянемо більш складну сторінку, наприклад сторінку блогу з багатьма різними компонентами (фактична публікація в блозі, коментарі, пов’язані публікації, новітні повідомлення, потік Twitter). Мені довелося б розробити структуру сторінки за допомогою компонентів React, а потім десь ще я повинен визначити процес заповнення кожного необхідного магазину для цієї поточної сторінки. Це не здається приємним рішенням для мене. На жаль, більшість ізоморфних навчальних посібників розроблені саме так (наприклад, цей чудовий посібник з потоку ).
React-async . Такий підхід ідеальний. Це дозволяє мені просто визначити в спеціальній функції в кожному компоненті, як ініціалізувати стан (неважливо, синхронно чи асинхронно), і ці функції викликаються, коли ієрархія передається в HTML. Це працює таким чином, що компонент не виводиться до повного ініціалізації стану. Проблема полягає в тому, що для цього потрібні волокнанаскільки я розумію, розширення Node.js, яке змінює стандартну поведінку JavaScript. Хоча результат мені дуже подобається, мені все ж здається, що замість пошуку рішення ми змінили правила гри. І я думаю, що ми не повинні змушувати це робити для використання цієї основної функції React.js. Я також не впевнений у загальній підтримці цього рішення. Чи можливо використовувати Fiber на звичайному веб-хостингу Node.js?
Я трохи думав сам. Я не дуже роздумував над деталями про реалізацію, але загальна ідея полягає в тому, що я б розширював компоненти аналогічно React-async і тоді я б неодноразово викликав React.renderComponentToString () на кореневий компонент. Під час кожного проходу я збирав би зворотні зворотні дзвінки, а потім зателефонував їм у та в пропуск, щоб заповнити магазини. Я повторюю цей крок, поки всі магазини, необхідні поточній ієрархії компонентів, не будуть заповнені. Є багато рішень, які потрібно вирішити, і я особливо не впевнений у виконанні.
Я щось пропустив? Чи є інший підхід / рішення? Зараз я замислююся про те, щоб пройти шлях реакції-асинхрон / волокна, але я не зовсім впевнений у цьому, як пояснено у другому пункті.
Пов’язана дискусія на GitHub . Мабуть, немає офіційного підходу чи навіть рішення. Можливо, справжнє питання полягає в тому, як призначені для використання компоненти React. Як простий шар перегляду (майже моя пропозиція номер один) або як реальні незалежні та окремі компоненти?