Как node.js взаимодействует с фронтендом react?

Как я правильно организую процесс разработки и продакшена для веб-приложения с использованием React и Node.js? В данный момент, в процессе разработки, я запускаю React приложение на порту 3000, а сервер Node.js на порту 80. Я понимаю, что в продакшене нужно использовать только один порт, и что сервер должен отправлять html, css, js файлы при первом запросе на главную страницу, а затем передавать JSON. Как это организовать? Также, после использования npm run build, у меня появляется папка build с множеством css и js файлов. Как эту папку нужно связать с сервером Node.js, чтобы при первом запросе отправлялся HTML файл, а затем клиент получал нужные ему css и js файлы из папки build? Есть ли подходящие туториалы или видео, где показано создание полноценного сервера Node.js с использованием папки build? Я пробовал найти посты и видео, но все что нахожу, описывает создание React app на одном порту (например, 3000), и сервера на другом порту.
  • 31 января 2024 г. 19:59
Ответы на вопрос 2
Node.js может взаимодействовать с фронтендом разработанным в React посредством HTTP запросов. Во время разработки часто используются разные порты (например, React dev server на порту 3000 и Node.js на порту 8080 или 80), но для продакшн сборки обычно используется один порт.

### Организация процесса разработки и продакшена

1. **Разработка:**
   - Вы можете продолжить использование созданного приложения React на порту 3000 и Node.js на другом порту.
   - Чтобы во время разработки запросы от вашего приложения направлялись на ваш API на Node.js, вы можете использовать прокси. В `package.json` вашего React проекта можно добавить поле `"proxy": "http://localhost:ВАШ_ПОРТ_NODE"`. Это позволит React приложению автоматически перенаправлять API запросы на ваш сервер Node.js.

2. **Продакшн:**
   - Ваш сервер Node.js будет также отвечать за сервирование статических файлов сборки React (HTML, CSS, JS).
   - В вашем Node.js приложении используйте middleware типа Express.static для обслуживания статических файлов из папки `build`.

Пример кода для Express.js сервера, который отправляет статические файлы и поддерживает клиентский роутинг React:

```javascript
const express = require('express');
const path = require('path');
const app = express();

app.use(express.static(path.join(__dirname, 'build'))); // путь к вашей папке build

app.get('*', (req, res) => {
  res.sendFile(path.join(__dirname, 'build', 'index.html'));
});

const PORT = process.env.PORT || 80; // Используем 80 порт для продакшена
app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});
```

### После использования `npm run build`

Когда вы создаете продакшн версию вашего React приложения потому команду `npm run build`, создается папка `build` с оптимизированными файлами. Вам нужно сконфигурировать ваш Node.js сервер так, чтобы он мог обслуживать эти файлы, как показано в примере кода выше.

### Туториалы и ресурсы

- **Документация Create React App**: Там есть раздел о [развертывании](https://create-react-app.dev/docs/deployment/), который обсуждает различные варианты развертывания, включая Node.js сервера.
- **Full Stack Open**: Онлайн курс, который включает в себя проекты, работающие с React и Node.js: [Full Stack Open](https://fullstackopen.com/en/).
- **YouTube**: На YouTube есть множество учебных роликов, где показано, как развернуть полноценные приложения с React и Node.js. Попробуйте поискать туториалы с запросом "React Node.js production deployment".

Важно также использовать переменные окружения для управления конфигурацией между разработкой и продакшн environments, и обеспечить надлежащее управление зависимостями и версиями для стабильности вашего приложения.
правильно ли я понимаю, что на этапе продакшена мы должны подключаться только к одному порту, на котором находится сервер, а он отправит html, css, js файлы при первом запросе на главную страницу а в дальнейшем будет отправлять JSON?
В зависимости от настроек сервера и архитектуры твоего проекта. Экспресс может как отдавать хтмл/css,так и служить для обмена данными бека с фронтом(апи). Во втором случае за раздачу хтмл может отвечать какой-либо популярный веб-сервер, nginx/apache.
при использовании npm run build я получаю папку build, где много css и js файлов. Как эту папку надо связать с node.js

Никак. На стадии билда участие ноды в проекте заканчивается (в случае с фронтом, естественно. Если у тебя сам сервер, бекенд на ноде, то там нужно запускать это дело на хосте). Ты размещаешь свой код на веб-сервере, который его раздает в дальнейшем клиентам.
Допустим мы при первом запросе на сервер отправляем HTML файл. Но как клиент получит нужный ему css и js файл из кучи в папке build.
все как в обычном html. Есть точка входа в виде хтмл-файла, к которой твой билдер уже привязал все стили/скрипты. Все это отдается клиенту.
Это базовый сценарий. Есть другие способы, такие как SSR например. Но это уже другая история.
Похожие вопросы