https://github.com/angular/universal-starter
В файле src/server.ts все ответы. Суть такая:
1) создаём express-приложение
let app = express();
2) настраиваем обработку .html-файлов на ангуляровский рендерер из universe
app.engine('.html', expressEngine);
app.set('views', __dirname);
app.set('view engine', 'html');
3) Создаём функцию-обработчик, которая будет рендерить ангуляр-приложение на сервере, если пользователь зайдёт по определённым ссылкам
function ngApp(req, res) {
let baseUrl = '/';
let url = req.originalUrl || '/';
res.render('index', {
directives: [ Html ],
...
}
}
4) В этой функции каким-то образом надо подключить корневой компонент App. В приведённой ссылке это делается так: создаётся компонент Html (src/server-only-app/html.component.ts), который содержит полностью весь код index.html (кроме тегов html). Можно было просто в функцию ngApp указать в поле directives корневой компонент.
5) Запускаем приложуху
app.use(express.static(root, {index: false}));
// Routes with html5pushstate
app.use('/', ngApp);
app.use('/about', ngApp);
app.use('/home', ngApp);
// Server
app.listen(3000, () => {
console.log('Listen on http://localhost:3000');
});