Задать вопрос

Как работает серверный рендеринг React.js с объектами браузера в компонентах?

Услышал про серверный рендеринг в реакте, почитал, круто, здорово, захотел попробовать. Вроде вся механика понятна - компоненты можно отрендерить в строку с готовой разметкой и отдать её в респонс.
Суть вопроса вот в чём: что если у меня есть компонент у которого, к примеру, в методе componentWillMount() используется какой-нибудь localStorage или чего-нибудь с DOM? Как тогда у реакта получится корректно отрисовать компонент в серверном окружении Node, который о localStorage не знает. Т.е. речь идёт вообще о любых встроенных в браузер объектах.
  • Вопрос задан
  • 613 просмотров
Подписаться 4 Оценить Комментировать
Решения вопроса 1
maxfarseer
@maxfarseer
https://maxpfrontend.ru, обучаю реакту и компании
Могу быть не прав, но я так понял, что все объекты браузера мокаются (как будто в тестах, то есть делается например "ложный localStorage", ведь это по сути объект у котрого есть getter и setter. Для тестов я использовал - mock-local-storage). "Мокнуть" можно и самому, для этого писать нужно в global, так как в node окружении глобальный объект не "window". Подробнее можно посмотреть в коде библиотеки.

Опять таки, давайте продолжим про localStorage, так как удобнее на конкретном примере. Почему мок нормально подойдет, как мне кажется? Потому что это будет как будто к вам на сайт зашел пользователь, у которого ничего в LS по вашему сайту не сохранено. Главное чтобы сработало: localStorage.setItem / getItem, и так как вы эти функции написали и объявили глобально - все получится (естественно, в коде у вас должно быть localStorage без window, либо нужно будет делать мок не просто в global, а в global.window - иными словами мы создаем в глобальом объекте объект window).

P.S. на практике я не делал серьезного SS рендеринга, поэтому буду рад услышать, мнение тех, кто уже разобрался. В зарубежных источниках есть информация (например), и даже неплохо разобраны вещи с асинхронными запросами, но тем не менее, хотелось бы увидеть еще.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
AMar4enko
@AMar4enko
https://facebook.github.io/react/docs/component-sp...

Хук componentDidMount выполняется только на клиенте.
Соответственно, если вы используете тот же ref, чтобы выполнить какие-то действия с DOM, то имеет смысл это делать в этом хуке.

localStorage использовать в компонентах мне кажется неправильным. Вы же в нем состояние (или его часть) храните, а для управления состоянием у вас должен быть отдельный слой. В этом слое как раз можно сделать моки, которые описал Максим
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
ITK academy Воронеж
от 50 000 до 90 000 ₽
ITK academy Нижний Новгород
от 80 000 до 120 000 ₽