На самом деле нормальных решений этой задачи нет.
Ближе всего - велосипеды с использованием React. (почитайте про изоморфные приложения)
Но и там куча проблем:
1) прокидывание данных с сервера на клиент при первой загрузке приложения - нет рекомендованного подхода
2) не решена проблема с тем, как вставлять на страницу только тот CSS-который нужен для отображения, а остальной CSS грузить асинхронно
3) да и роутеры пока не очень круты. Могу привести пример - для авторизованного пользователя должны быть доступны одни страницы, а не для авторизованного - другие (а на месте некоторых прежних должны стоять редиректы) - вот хрен сделаешь такое, без велосипедостроительства
С Angular всё вообще грустно. Там разве только phantom-js городить, но это сомнительное решение вообще (из ряда - как сначала создать себе проблемы, а потом через боль преодолевать их)