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

Услышал про серверный рендеринг в реакте, почитал, круто, здорово, захотел попробовать. Вроде вся механика понятна - компоненты можно отрендерить в строку с готовой разметкой и отдать её в респонс.
Суть вопроса вот в чём: что если у меня есть компонент у которого, к примеру, в методе componentWillMount() используется какой-нибудь localStorage или чего-нибудь с DOM? Как тогда у реакта получится корректно отрисовать компонент в серверном окружении Node, который о localStorage не знает. Т.е. речь идёт вообще о любых встроенных в браузер объектах.
  • Вопрос задан
  • 611 просмотров
Решения вопроса 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 использовать в компонентах мне кажется неправильным. Вы же в нем состояние (или его часть) храните, а для управления состоянием у вас должен быть отдельный слой. В этом слое как раз можно сделать моки, которые описал Максим
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы