In react there is a way past this that is called isomorphic react and this is a good strategy if you are building a new interactive website today that is kind of unique when it comes to functionality. At least it is an option to using a CMS.
But if you already have a website, and you use a CMS that server side renders the content it can be upgraded making parts of it into React or Angular apps. You can even do this with existing parts of a website.
The interesting thing is in the way a single page app is mounted in to your website.
In a Single Page App you have a static html file that usually only contains a div element with a ID such as «root» or «app» and little other. And this is what google sees. An empty element. Everyting else happends in time after this has been loaded and Google doesn’t follow this. It only sees the empty div.
But the beauty is, as an alternative to isomorphic renderToString in react – the mount div does not have to be empty.
This means that the following approach can be taken, both when creating web sites from scratch instead of running node.js on the server, you can place static content in the div.
I think you will find benefits in isomorphic react and building with this as an architecture for web apps and services that exist online, but when upgrading existing sites, this is beautiful. Take the static content and introduce dynamic behaviour with the existing markup and style as base and mount to the div you would like to make into a dynamic application and perhaps if needed design some small services hosted elsewhere or in the scripting language available on the host of the website.
The web is upgradeable and static websites still are major online. They can be upgraded and this does not have to affect search engine readability. Your website can have the same existing design as before, but be extended into having the functionality it lacks without a big affect to the design that might have been carefully done with a colour theme, fonts, a layout etc.
My point on use of reactDOM.render() in SPA templates and scaffolders:
But the beauty of ReactDOM.render is that it sets innerHTML behind the scenes. It doesn’t add the React components to the div with the id «root». It swaps the content. Therefore:
In this way you can make use of react in existing websites leaving the static content in the mount node so that Google and other engines can see some text. Great for use on upgrading existing websites.