Also, for SPA with SSR take a look at Double View https://github.com/emeraldpay/double-view
It's a React renderer that works on Java backend by using GraalVM, and then the same JS template continues to work in browser.