Как фронтенд получает данные от бэкенда при их разделении?
Появилась потребность в написании веб-приложения, в котором фронтенд будет разделен с бэкендом - разные репозитории, разные деплои и все разное. И так как раньше я писал только монолитные приложения, где бэкенд соседствовал с фронтом, а в гугле подробных для меня описаний их разделения и взаимодействия я не нашел, то у меня осталось несколько белых пятен, которые хотелось бы заполнить, а именно:
1. Как я понял, при полном разделении бэка и фронта они деплоятся раздельно. В случае с бэкендом понятно, поднимается сервер, бд, пишутся хендлеры и тд и тп. Бэкенд выступает в качестве апишки. Но что у нас получается с фронтом? В некоторых статьях видел, что для фронта на серваке запускается nodejs, но зачем она нужна запущенная, если мы можем просто вернуть index.html, а браузер уже подтянет всякие js фреймворки и прочий обвес, который подключается в хтмл? Тогда получается, что для фронта нам вообще ничего не надо кроме как закинуть статику в определенную папочку и сказать nginx'у, который стоит перед веб приложением, возвращать по запросу пользователя всю эту статику? Отсюда вытекает второй вопрос
2. Если юзер вбивает в браузер адрес и жмет энтер, то запрос идет к этому самому nginx, он отдает статику, жс скрипты запускаются и шлют запрос на получение данных к бэку, так? Но ведь в таком случае у нас получается 2 запроса - один для получения фронтовых файлов, а второй уже от самого фронта к бэку, это норм? Или можно как то за один запрос определить, что нужно получить и от бэка и от фронта и сразу вернуть все пользователю?
3. Если я все еще правильно рассуждаю, то используя докер, нужен контейнер для бэка, контейнер для nginx, а для фронта ничего, ведь как я уже написал, там достаточно только статики в определенной папке, так?
1. Нода не нужна, если это не SSR.
2. У тебя в любом случае много запросов, если даже просто статику запрашивать (шрифты, картинки, стили, скрипты). Чтобы получать "всё" нужно использовать серверный рендеринг.
3. Только указать nginx откуда брать файлы для фронта
2 запроса - один для получения фронтовых файлов, а второй уже от самого фронта к бэку, это норм?
Норм. Отдавая index.html глупым nginx'ом (без логики) ты не то чтобы способен понять, что нужно будет отдать пользователю. Может он пришёл на страницу /, а может на страницу /buy, а может на /profile/me. Может он залогинен, а может и нет. Может он вообще админ.
Если я все еще правильно рассуждаю, то используя докер, нужен контейнер для бэка, контейнер для nginx, а для фронта ничего, ведь как я уже написал, там достаточно только статики в определенной папке, так?
Так, если нет SSR. Если SSR нужен, то ещё контейнер с нодой. При этом, вовсе не обязательно статику раздавать именно nginx'ом. У меня в некоторых проектах nginx (точнее, Caddy, но не суть) просто занимается шифрованием и вообще все запросы проксирует в бэкенд, а бэкенд раздаёт статику. Но там бэк на Golang написан, а при компиляции статика фронта целиком встраивается в бинарник, могу себе позволить. На условном питоне я бы так не стал делать.