Могу быть не прав, но я так понял, что все объекты браузера мокаются (как будто в тестах, то есть делается например "ложный localStorage", ведь это по сути объект у котрого есть getter и setter. Для тестов я использовал -
mock-local-storage). "Мокнуть" можно и самому, для этого писать нужно в global, так как в node окружении глобальный объект не "window". Подробнее можно посмотреть в коде библиотеки.
Опять таки, давайте продолжим про localStorage, так как удобнее на конкретном примере. Почему мок нормально подойдет, как мне кажется? Потому что это будет как будто к вам на сайт зашел пользователь, у которого ничего в LS по вашему сайту не сохранено. Главное чтобы сработало: localStorage.setItem / getItem, и так как вы эти функции написали и объявили глобально - все получится (естественно, в коде у вас должно быть localStorage без window, либо нужно будет делать мок не просто в global, а в global.window - иными словами мы создаем в глобальом объекте объект window).
P.S. на практике я не делал серьезного SS рендеринга, поэтому буду рад услышать, мнение тех, кто уже разобрался. В зарубежных источниках есть информация (
например), и даже неплохо разобраны вещи с асинхронными запросами, но тем не менее, хотелось бы увидеть еще.