React не «просто работает» из коробки. Он использует ключевые слова и синтаксис, которые нода (начиная с версии 9.3.0, которую мы используем для этого руководства) еще не совсем догнали. Для этого требуется довольно много настроек, которые могут быть громоздкими, и Facebook предоставил опцию, которая упрощает запуск приложения React. Зачем заморачиваться, да?

Дело в том, что create-react-app абстрагирует от вас многое из того, что заставляет приложение React работать — по крайней мере, без его извлечения и необходимости настраивать все параметры вручную. Есть ряд причин, по которым вы можете захотеть сделать свою собственную реализацию или, по крайней мере, иметь некоторое представление о том, что она делает под капотом.

Как я уже упоминал, есть несколько препятствий для запуска приложения React. Во-первых, узел не может обрабатывать весь синтаксис (например, импорт/экспорт и jsx). Во-вторых, вам нужно либо создавать свои файлы, либо каким-то образом обслуживать их во время разработки, чтобы ваше приложение работало. Это особенно важно в последней ситуации.

К счастью, мы можем решить эти проблемы с помощью Babel и Webpack.

Настраивать

Для начала создайте новый каталог для своего приложения React. Затем инициализируйте свой проект с помощью npm init и откройте его в редакторе по вашему выбору. Это также неплохое время для git init. В папке нового проекта создайте следующую структуру:

.
+-- public
+-- src

Немного подумав, мы в конечном итоге захотим собрать наше приложение и, вероятно, захотим исключить встроенную версию и наши модули узлов из коммитов, поэтому давайте продолжим и добавим файл .gitignore, исключая (как минимум) каталоги node_modules и dist.

Наш каталог public будет обрабатывать любые статические ресурсы и, что наиболее важно, содержит наш файл index.html, который React будет использовать для рендеринга вашего приложения. Следующий код был взят из документации по реакции с некоторыми очень небольшими изменениями. Не стесняйтесь копировать следующую HTML-разметку в новый файл index.html внутри каталога public.

Наиболее важные строки, на которые следует обратить внимание, — это 10, которая является корнем, к которому будет подключаться наше приложение React, и строка 14, которая ссылается на наше (скоро будет) созданное приложение React. Вы можете назвать созданный скрипт как угодно, но я буду использовать bundle.js для этого урока.

Теперь, когда мы настроили нашу HTML-страницу, мы можем приступить к делу. Нам нужно настроить еще несколько вещей. Во-первых, нам нужно убедиться, что код, который мы пишем, может быть скомпилирован, поэтому нам понадобится Babel.

Вавилон

Идите вперед и запустите npm install --save-dev @babel/[email protected] @babel/[email protected] @babel/[email protected] @babel/[email protected].

babel-core — это основной пакет babel. Он нужен для того, чтобы babel выполнял какие-либо преобразования в нашем коде. babel-cli позволяет компилировать файлы из командной строки. preset-react и preset-env — это предустановки, которые преобразуют определенные разновидности кода — в данном случае предустановка env позволяет нам преобразовать ES6+ в более традиционный javascript, а предустановка react делает то же самое, но вместо этого с JSX.

В корне проекта создайте файл с именем .babelrc. Здесь мы сообщаем Babel, что будем использовать пресеты env и react.

У Babel также есть множество доступных плагинов, которые можно использовать, если вам нужно преобразовать только определенные функции или какие-то функции, которые вам нужны, не охватываются env. Мы пока не будем о них беспокоиться, но вы можете ознакомиться с ними здесь.

Вебпак

Теперь нам нужно приобрести и настроить Webpack. Нам понадобится еще несколько пакетов, и вы захотите сохранить их как зависимости для разработчиков: npm install --save-dev [email protected] webpack-cli@3.1.1 webpack-dev-server@3.1.8 style-loader@0.23.0 css-loader@1.0.0 babel-loader@8.0.2.

Webpack использует загрузчики для обработки различных типов файлов для объединения. Он также легко работает вместе с сервером разработки, который мы собираемся использовать для обслуживания нашего проекта React в процессе разработки и перезагрузки страниц браузера при (сохраненных) изменениях в наших компонентах React. Однако, чтобы использовать все это, нам нужно настроить Webpack для использования наших загрузчиков и подготовить сервер разработки.

Создайте новый файл в корне проекта с именем webpack.config.js. Этот файл экспортирует объект с конфигурацией webpack.

Давайте быстро рассмотрим это: entry (строка 5) сообщает Webpack, где запускается наше приложение и где начинать связывать наши файлы. Следующая строка сообщает веб-пакету, что мы работаем в режиме разработки — это избавляет нас от необходимости добавлять флаг режима при запуске сервера разработки.

Объект module помогает определить, как ваши экспортированные модули javascript преобразуются и какие из них включаются в соответствии с заданным массивом rules.

Наше первое правило касается преобразования нашего синтаксиса ES6 и JSX. Свойства test и exclude — это условия для сопоставления файла. В этом случае он будет соответствовать чему угодно за пределами каталогов node_modules и bower_components. Поскольку мы также будем преобразовывать наши файлы .js и .jsx, нам нужно настроить Webpack на использование Babel. Наконец, мы указываем, что хотим использовать пресет env в опциях.

Следующее правило касается обработки CSS. Поскольку мы не обрабатываем наш CSS до или после обработки, нам просто нужно добавить style-loader и css-loader к свойству use. css-loader требует style-loader для работы. loader — это сокращение для свойства use, когда используется только один загрузчик.

Свойство resolve позволяет нам указать, какие расширения будет разрешать Webpack — это позволяет нам импортировать модули без необходимости добавлять их расширения.

Свойство output указывает Webpack, куда поместить наш связанный код. Свойство publicPath указывает, в какой каталог должен помещаться пакет, а также сообщает webpack-dev-server, откуда обслуживать файлы.

Свойство publicPath — это специальное свойство, которое помогает нам с нашим dev-сервером. Он указывает общедоступный URL-адрес каталога — по крайней мере, насколько webpack-dev-server будет знать или заботиться. Если это установлено неправильно, вы получите 404, так как сервер не будет обслуживать ваши файлы из правильного местоположения!

Задаем webpack-dev-server в свойстве devServer. Для наших нужд это не требует многого — просто место, откуда мы обслуживаем статические файлы (например, наш index.html), и порт, на котором мы хотим запустить сервер. Обратите внимание, что devServer также имеет свойство publicPath. Этот publicPath сообщает серверу, где на самом деле находится наш связанный код.

Последнее могло немного сбить с толку. Обратите внимание: output.publicPath и devServer.publicPath разные. Прочтите обе записи. Дважды.

Наконец, поскольку мы хотим использовать Горячую замену модуля, нам не нужно постоянно обновляться, чтобы увидеть наши изменения. Все, что мы делаем для этого с точки зрения этого файла, — это создаем новый экземпляр плагина в свойстве plugins и убеждаемся, что мы установили hotOnly в true в devServer. Однако нам все еще нужно настроить еще одну вещь в React, прежде чем HMR заработает.

Мы закончили с тяжелой настройкой. Теперь давайте заставим React работать!

Реагировать

Для начала нам нужно получить еще два пакета: react@16.5.2 и react-dom@16.5.2. Идите вперед и сохраните их как обычные зависимости.

Нам нужно указать нашему приложению React, где подключиться к DOM (в нашем index.html). Создайте файл с именем index.js в каталоге src. Это очень маленький файл, который много делает с точки зрения вашего приложения React. Проверьте это.

ReactDOM.render — это функция, которая сообщает React, что рендерить и где это рендерить. В этом случае мы рендерим компонент с именем App (который мы скоро создадим), и он рендерится в элементе DOM с корневым идентификатором ( строка 10 из index.html).

Теперь создайте еще один файл в src с именем App.js. Если вы работали с React, используя create-react-app, эта часть должна быть очень знакома. Этот файл является просто компонентом React.

Пока мы здесь, я упомянул, что webpack также обрабатывает CSS (и мы требуем этого нашего компонента). Давайте добавим очень простую таблицу стилей в каталог src.

Ваша окончательная структура проекта должна выглядеть следующим образом, если вы не изменили некоторые имена по пути:

.
+-- public
| +-- index.html
+-- src
| +-- App.css
| +-- App.js
| +-- index.js
+-- .babelrc
+-- .gitignore
+-- package-lock.json
+-- package.json
+-- webpack.config.js

Теперь у нас есть работающее приложение для реагирования! Мы можем запустить наш сервер разработки, выполнив webpack-dev-server --mode development в терминале. Я бы посоветовал поместить его в свой скрипт start в package.json, чтобы сэкономить целых девять нажатий клавиш.

Отделка ХМР

Если вы сейчас запустите сервер, вы заметите, что ни одно из ваших изменений не приводит к каким-либо изменениям в клиенте. Что дает?

Ну, HMR нужно знать, что на самом деле заменить, и в настоящее время мы ничего не дали ему. Для этого мы воспользуемся пакетом, который нам предоставил один из участников команды реагирования: react-hot-loader@4.3.11.

Вы можете установить это как обычную зависимость — согласно документации

Примечание. Вы можете безопасно установить react-hot-loader как обычную зависимость, а не как зависимость для разработчиков, так как она автоматически гарантирует, что она не будет выполняться в рабочей среде, а занимаемая площадь минимальна.

Теперь импортируйте react-hot-loader в App.js и отметьте экспортированный объект как загруженный в горячем режиме, изменив код следующим образом.

Теперь, когда вы запускаете свое приложение, изменения в коде должны обновлять клиент сразу после сохранения.

Последние подробности

Вы можете заметить кое-что интересное (или, может быть, поразительное) при запуске вашего проекта: встроенные файлы никогда не отображаются в вашем каталоге dist. Видите ли, webpack-dev-server на самом деле обслуживает связанные файлы из памяти — как только сервер останавливается, они исчезают. Чтобы на самом деле создать ваши файлы, мы собираемся использовать собственно webpack — добавьте скрипт с именем build в ваш package.json с помощью следующей команды: webpack --mode development. Вы можете заменить development на production, но если вы полностью опустите --mode, он вернется к последнему и выдаст вам предупреждение.

Это почти охватывает все, что вам нужно, чтобы иметь возможность отображать базовое приложение React, не касаясь create-react-app. Однако есть еще что добавить в реализацию, чтобы сделать ее более полной — например, изображения не настроены для обработки в Webpack, но для этого есть загрузчик. Я оставлю эту реализацию вам. В конце концов, если вам не нужны или вы не хотите обслуживать файлы, это просто раздувание, верно?

Я надеюсь, что эта статья помогла пролить свет на то, что нужно для того, чтобы приложение React заработало, и как работают основы. Я не слишком углублялся в подробности о Babel и Webpack, но, пожалуйста, изучите любую из бесчисленных ссылок, разбросанных по всей статье или непосредственно в их документации. Это потрясающие инструменты, которые на первый взгляд кажутся более пугающими, чем они есть на самом деле, и они могут помочь вывести вашу разработку на новый уровень.

И вот оно! Большое спасибо за упорство до конца этой статьи! Надеюсь, вы нашли это полезным. вы можете подписаться на меня в Medium, Twitter и LinkedIn.

Вы можете поддержать меня, купив мне кофе ☕

Если вам понравилась эта статья, не забудьте хлопнуть в ладоши (совет для профессионалов: это бесплатно)