Backend w Node.js na Expressie i aplikacja Reactowa to dwa oddzielne byty i zwykle użytkownik nie wchodzi w bezpośrednią interakcję z backendem. Stąd problem po prostu nie istnieje, bo ten backend nie decyduje, kiedy coś ma być renderowane.
Taki backend zwykle jest sprowadzany do roli REST API (lub API opartego o GraphQL), a więc do źródła danych. Aplikacja Reactowa wysyła do niego zapytania i jest odpowiedzialna za sensowne wyświetlanie tego, co takie API zwraca.
Dodatkowo aplikacja React może mieć własny "backend", który będzie odpowiedzialny za komunikację z takim backendem w Express.js, ale również – za server-side rendering. Czasami takie rozwiązanie nazywa się middleendem.
Zatem cała aplikacja może składać się z trzech warstw:
- frontend – Reactowa aplikacja, z którą user wchodzi w interakcję,
- middleend – backendowa część apki Reactowej, zajmująca się server-side renderingiem oraz komunikacją z API (jeśli np. wymaga ona uwierzytelniania kluczem i nie chcemy go wyciekać we frontendzie),
- backend – aplikacja w Express.js (lub dowolnej innej technologii), która będzie służyła za REST/GraphQL API.
Jest też coś takiego jak MERN stack. Zwykle jest on ograniczony tylko do dwóch warstw – frontendu i backendu, bez warstwy middleendu. Wówczas aplikacja w Express.js zachowuje się jak "normalny" backend, czyli w chwili, gdy user wysyła żądanie pod jakiś adres, Express.js serwuje mu odpowiedź w postaci kodu HTML zawierającego też kod Reacta. Da się połączyć SSR Reacta z Expressem. Niemniej w dobie rozwiązań pokroju Next.js czy Gatsby zaryzykowałbym stwierdzenie, że się odchodzi od takiego typowego MERN stacku na rzecz nieco bardziej złożonych rozwiązań, które wykorzystują odrębny backend-API.