Как развернуть приложение React с внутренним API. Часть 3: Heroku.
В этом руководстве мы узнаем, как развернуть приложение React с внутренним API на Heroku. Мы рассмотрим развертывание API Express.js для взаимодействия с интерфейсом React.
Это третья часть руководства. В части 1 мы узнали, как развернуть приложение в Netlify, включая развертывание лямбда-функций, вы можете прочитать это здесь. Во второй части руководства мы узнали, как развернуть приложение на Vercel, вы можете прочитать его здесь.
Если вы уже прочитали часть 1 или 2 руководства, вы можете пропустить этот раздел и сразу перейти к разделу Heroku.
Совет: используйте Bit, чтобы поделиться и установить компоненты React. Используйте свои компоненты для создания новых приложений и делитесь ими со своей командой, чтобы создавать их быстрее. Попробуйте.
Давайте начнем
Наше приложение React будет очень простым по своей природе, оно вызывает API Express.js только с одним POST
маршрутом и одним GET
маршрутом.
Маршрут GET
возвращает «Hello from Express», а маршрут POST
- это всего лишь одно поле, которое при публикации возвращает «Я получил ваш запрос POST. Это то, что вы мне прислали: [из ввода] ».
Ниже приведен отрывок из кода Express.js, показывающий оба маршрута.
app.get('/api/hello', (req, res) => { res.send({ express: 'Hello From Express' }); }); app.post('/api/world', (req, res) => { res.send( `I received your POST request. This is what you sent me: ${req.body.post}`, ); });
В приложении также есть маршрутизация на стороне клиента с помощью React Router, который переходит на дополнительную страницу и отображает страницу 404, когда мы вводим несуществующий URL.
Ниже вы можете увидеть демонстрационное приложение.
После загрузки React вызывает конечную точку Express.js GET
и отображает сообщение. При отправке формы с одним полем React вызывает конечную точку Express.js POST
и отображает сообщение.
Я решил включить маршрутизацию на стороне клиента, потому что одностраничные приложения (SPA) используют API истории, и при развертывании нам необходимо включить некоторые дополнительные шаги. (Подсказка: нам нужно настроить перенаправления)
Допустим, мы развертываем приложение на demoapp.com. Когда мы нажимаем demoapp.com, приложение загружается. Затем мы нажимаем ссылку меню «Другая страница (demoapp.com/another-page)», и страница загружается нормально; но если мы обновим страницу, мы получим ошибку. Это потому, что сервер ищет файл с именем «another-page», но этот файл не существует, поскольку все наше приложение (включая маршрутизацию) загружается из index.html
. Итак, нам нужно каким-то образом указать серверу перенаправить все запросы на index.html
.
Я буду указывать именно этот шаг в каждом развертывании, чтобы исправить эту «проблему».
Базовая структура приложения
У каждого развертывания есть собственный корневой каталог. Тогда у нас будет наш API Express.js в каталоге api
, а приложение React - в каталоге client
или прямо в корневом каталоге каждого проекта.
Приложение React было загружено с помощью Create React App (CRA), поэтому структура каталогов довольно стандартна с исходными файлами в каталоге src
и общедоступными ресурсами в каталоге public
.
Heroku
Взгляните на репо в каталоге heroku.
Heroku немного отличается от Now и Netlify. Здесь вам нужно запустить приложение React, настроив предпочтительную серверную технологию. Heroku поддерживает, среди прочего, Node, Ruby, Python и PHP.
В нашем случае мы создадим экземпляр Node, и Express.js будет обслуживать наше приложение React и API. Heroku также создаст приложение React на своих серверах при развертывании.
Перед тем, как начать, зайдите в Heroku и создайте учетную запись или войдите в систему. Вам также необходимо будет установить их инструмент командной строки.
Чтобы установить инструмент Heroku CLI, введите в терминале (macOS) следующее:
brew tap heroku/brew && brew install heroku
Вы также можете скачать установщик. Пользователям Windows потребуется загрузить установщик Windows. Подробнее об этом вы можете узнать в инструкции по установке.
Для входа в систему введите свой терминал
heroku login
Откроется окно браузера, в котором вам нужно будет войти в систему со своими учетными данными. После этого интерфейс командной строки автоматически войдет в систему.
Структура проекта
Взгляните на репо в каталоге Heroku.
├── /client └── server.js
Здесь у нас есть API Express.js прямо в каталоге root
, а приложение React - в каталоге client
.
Необходимые конфигурации
Как и в предыдущем примере, здесь у нас также есть приложение Express.js, работающее на порту 5000
, и приложение React на порту 3000
. Поэтому нам нужно будет настроить прокси-сервер.
На этот раз клиентская сторона package.json
находится в каталоге client
, и мы добавляем прокси следующим образом
"proxy": "http://localhost:5000/",
Теперь давайте откроем package.json
со стороны Express.js (в каталоге root
) и заметим, что у нас есть специальный скрипт npm.
"heroku-postbuild": "cd client && npm install && npm install --only=dev --no-shrinkwrap && npm run build"
Этот сценарий сообщает Heroku, что делать после развертывания приложения Express.js. В нашем случае мы хотим создать наше приложение React для производства, которое будет обслуживаться нашим приложением Express.js. Вы можете узнать больше о поддержке Heroku Node в их документации.
Express.js
Давайте посмотрим на код Express.js
const express = require('express'); const bodyParser = require('body-parser'); const path = require('path'); const app = express(); const port = process.env.PORT || 5000; app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); // API calls app.get('/api/hello', (req, res) => { res.send({ express: 'Hello From Express' }); }); app.post('/api/world', (req, res) => { res.send( `I received your POST request. This is what you sent me: ${req.body.post}`, ); }); if (process.env.NODE_ENV === 'production') { // Serve any static files app.use(express.static(path.join(__dirname, 'client/build'))); // Handle React routing, return all requests to React app app.get('*', function(req, res) { res.sendFile(path.join(__dirname, 'client/build', 'index.html')); }); } app.listen(port, () => console.log(`Listening on port ${port}`));
Все то же, что и в предыдущем примере, за исключением кода, выделенного жирным шрифтом. Здесь мы указываем, если переменная среды NODE_ENV
равна production
, тогда мы запустим некоторый код. В основном мы обслуживаем готовое к производству приложение React и перенаправляем клиентские маршруты на index.html
.
Причина, по которой мы делаем это таким образом, заключается в том, что при развертывании Heroku автоматически назначит production
переменной среды NODE_ENV
, и мы хотим запускать только этот конкретный код в производственной среде. Во время локальной разработки у React есть собственный сервер разработки, поэтому нашему приложению Express.js не нужно его обслуживать.
Приложение React
Вот как мы вызываем API в нашем приложении React
... callApi = async () => { const response = await fetch('/api/hello'); const body = await response.json(); if (response.status !== 200) throw Error(body.message); return body; }; handleSubmit = async e => { e.preventDefault(); const response = await fetch('/api/world', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ post: this.state.post }), }); const body = await response.text(); this.setState({ responseToPost: body }); }; ...
Развертывание на Heroku
Для развертывания в Heroku проект должен находиться в локальном репозитории Git.
Ниже приведены шаги по инициализации нового репозитория Git.
cd my-app-directory/ git init
Затем вам нужно будет создать экземпляр приложения в Heroku. Для этого введите в свой терминал следующее (убедитесь, что вы находитесь в корне проекта)
heroku create [app-name]
app-name
будет именем приложения.
Если вы заметили на скриншоте, я пытался создать проект с именем create-react-app-express
, но это имя уже занято. При создании приложений имя должно быть уникальным по всем направлениям. После того, как я выбрал другое имя (create-react-app-expressjs
), я смог создать приложение. Heroku дал мне ссылку на приложение и добавил git remote.
На скриншоте выше я проверяю конфигурацию git, и мы видим пульт с именем heroku
. Здесь мы собираемся развернуть наш код.
Перед развертыванием нам нужно зафиксировать код
git add . git commit -m "initial commit"
Теперь мы можем развернуться на Heroku
git push heroku master
Подробнее о развертывании в их документации.
И у нас есть живое приложение: https://create-react-app-expressjs.herokuapp.com/
Бонус
Heroku также поддерживает непрерывную доставку, и у них есть несколько вариантов. Взгляните на их документы. Еще одна особенность Heroku заключается в том, что вы можете установить множество надстроек, например, для отправки электронных писем и аутентификации.
Заключение
В этой статье мы узнали, как развернуть приложение React с API Express.js в Heroku. Если вы также читали часть 1 и часть 2 этой серии, теперь у вас есть инструменты для развертывания не только в Now и Heroku, но и в Netlify.
И, как я уже говорил ранее, научившись развертывать у нескольких поставщиков, вы сможете принять обоснованное решение, когда придет время развертывать свой проект в производственной среде. Спасибо, что дочитали до этого места. Надеюсь, тебе понравилось! Не стесняйтесь комментировать ниже и спрашивать, я буду рад помочь :) Ура!