Шаблоны отличные. Они служат полезной отправной точкой для проектов и могут сократить общую работу по настройке и настройке. Мы также можем улучшить их с помощью инструментов, которые по умолчанию продвигают хорошие привычки и процессы, что упрощает принятие «правильных» решений. Это экономит время и мыслительные ресурсы - избавившись от этих задач, у вас будет больше времени, чтобы сосредоточиться на написании кода.
Со временем шаблоны можно расширять и уточнять. Опираясь на то, что у нас уже есть, мы можем начинать все дальше и дальше с «нуля». На мой взгляд, это резюмирует процесс технического прогресса: упаковывая что-то полезное и облегчая копирование, мы можем направить наши усилия на решение «следующей» проблемы.
Так что да, если вы еще не догадались, я большой поклонник шаблонов. В этом посте будет рассмотрен процесс создания настраиваемого шаблона для Create React App (CRA), используя официальный шаблон по умолчанию в качестве основы.
Планирование шаблона
У шаблонов любого типа должна быть четкая цель. Это помогает избежать ситуации, когда мы в конечном итоге используем слишком много возможностей и сталкиваемся с трудными решениями о том, что следует и не следует включать. В конце концов, мы стараемся облегчить себе жизнь!
Мы собираемся рассмотреть более общий базовый вариант использования, поэтому он будет легким с некоторыми утилитами, которые будут полезны для любого проекта. Если бы у вас был более конкретный вариант использования, имело бы смысл создать более специализированный шаблон с функциями и утилитами, относящимися к проблемной области.
Что мы будем делать:
- использовать официальный шаблон CRA по умолчанию в качестве отправной точки
- удалить некоторые файлы
- обновить некоторые файлы
- добавить некоторые общие утилиты (Prettier, Source Map Explorer, отчеты о тестировании покрытия с помощью Jest)
- протестируйте это, создав новый проект
Анатомия шаблона CRA
Шаблон CRA состоит из двух ключевых элементов:
/template
- может содержать все, что вы хотите, и составит основу вашего вновь созданного проекта
- должен содержать как минимум несколько общих файлов и папок, чтобы
react-scripts
работал должным образом
template.json
- файл конфигурации для вашего шаблона
- в настоящее время поддерживает единственный ключ,
"package"
, под которым вы можете вложить информацию, которая будет объединена вpackage.json
файл только что созданного проекта - любые зависимости и сценарии, которые вы укажете, будут объединены со значениями по умолчанию в
react-scripts
(т.е. зависимости, такие как сам React, и сценарии, которые настраивают ваше приложение для разработки / сборки) - другие значения будут просто скопированы напрямую, заменив любые значения по умолчанию, если они уже существуют
Шаблон должен иметь как минимум следующую структуру и файлы, как указано в Документации CRA:
README.md template.json package.json template/ README.md gitignore (renamed to .gitignore during the init process) public/ index.html src/ index.js
Использование шаблона по умолчанию в качестве отправной точки
Чтобы гарантировать соответствие минимальным критериям, указанным выше, мы можем использовать официальный шаблон по умолчанию CRA в качестве основы для нашего собственного шаблона.
В своем терминале перейдите в каталог, в котором должен находиться этот шаблон, и выполните следующие команды:
# Clone the repo git clone https://github.com/facebook/create-react-app.git # Copy the template into the current directory cp -r create-react-app/packages/cra-template . # Clean up after ourselves rm -rf create-react-app
Убираться
Давайте избавимся от некоторых ненужных файлов и отредактируем несколько из существующих, чтобы у нас осталось только то, что нам нужно.
1. Удалите App.css
и logo.svg
из каталога /template
.
2. Обновите App.js
:
import React from 'react'; const App = () => <h1>Hello, world</h1>; export default App;
3. Обновите App.test.js
, чтобы отразить изменение на <App />
:
test('renders test heading', () => { render(<App />); const headingElement = screen.getByText(/hello, world/i); expect(headingElement).toBeInTheDocument(); });```
4. Последний шаг - добавить в ваш package.json
следующее:
{ ... "main": "template.json" }
N.B. это необходимый шаг до выпуска CRA v4. Исправление уже сделано.
Вы также можете обновить имя и информацию в README.md
и package.json
, а также имя каталога, в котором мы работаем, но я оставлю это на ваше усмотрение.
Добавление некоторых общих утилит
Есть несколько вещей, которые я всегда настраиваю в новых проектах - этот шаблон - идеальное место для размещения этих вещей.
Мы собираемся добавить:
- Красивее, чтобы код оставался хорошо отформатированным.
- Source Map Explorer, чтобы мы могли следить за состоянием пакета приложения.
- скрипт npm для отчета о покрытии кода с помощью Jest
Примечание об указании зависимостей
Нам нужно будет добавить несколько зависимостей, чтобы выполнить следующие шаги. На самом деле мы не собираемся их устанавливать, нам просто нужно указать, что нам нужно в template.json
, чтобы CRA знал, что устанавливать, когда мы используем этот шаблон для создания нового проекта. Для этого мы воспользуемся следующим процессом:
- перейти на сайт npm
- найдите пакет, который нужно добавить
- скопируйте номер версии, а затем добавьте пакет и номер версии в
template.json
с^
в качестве префикса, например:
{ "package": { "dependencies": { "prettier": "^2.0.5" } } }
Символ ^
- это каретка, которая позволяет нам дать npm разрешение на установку более новых минорных версий пакета или версий с исправлениями - это все равно что сказать: Не стесняйтесь устанавливать более новую версию, если она есть, но без критических изменений, пожалуйста. Он действительно полагается на то, что авторы пакета следуют семантическому управлению версиями, но большинство крупных проектов с открытым исходным кодом делают это, поэтому мы должны быть в порядке, просто помните об этом. Это будет означать, что мы можем работать в течение более длительного периода времени без необходимости обновлять зависимости шаблона (хотя это то, что нужно периодически пересматривать, чтобы мы могли извлечь выгоду из последних выпусков). Если вам нужна конкретная версия пакета, вы можете отключить это.
N.B. в то время как вы обычно добавляете их как devDependencies
, текущая система шаблонов в CRA поддерживает только перечисление их как обычных dependencies
. Хотя это не считалось проблемой в прошлом, теперь похоже, что это будет поддерживаться в следующем выпуске.
Добавление красивее
Мы собираемся добавить Prettier и запустить его с хук pre-commit, используя Husky.
1. Добавьте prettier
, pretty-quick
и husky
к dependencies
в template.json
2. Создайте файл с именем prettier.config.js
в /template
и добавьте параметры конфигурации:
// Some of these are defaults, but let's be explicit for other humans module.exports = { tabWidth: 2, semi: true, singleQuote: true, bracketSpacing: true, printWidth: 80, };
3. Создайте файл с именем .prettierignore
в /template
(пока он может оставаться пустым).
4. Создайте файл с именем husky.config.js
в /template
и добавьте следующее:
module.exports = { hooks: { 'pre-commit': 'npm run pre-commit', }, };
5. В template.json
добавьте объект "scripts"
в "package"
с помощью следующего скрипта:
{ "package": { ... "scripts": { "pre-commit": "pretty-quick --staged" } } }
N.B. вы также можете добавить Prettier в фактический шаблон CRA, который мы создаем, чтобы код вашего шаблона также был отформатирован.
Добавление обозревателя исходной карты
Возможность видеть, что на самом деле входит в ваши пакеты, полезна при попытке уменьшить размер пакета и уберечь пользователя от загрузки ненужных байтов. Чтобы получить некоторое представление об этом, мы собираемся использовать Source Map Explorer.
1. Добавьте source-map-explorer
в dependencies
в template.json
2. В template.json
добавьте к объекту "scripts"
следующее:
{ "package": { ... "scripts": { ... "analyze": "source-map-explorer 'build/static/js/*.js'" } } }
Вот и все! Эта команда будет смотреть только на созданные файлы. При желании можно указать префикс команды над npm run build &&
, чтобы не создавать отдельный шаг перед выполнением этой команды.
Добавление отчетов о покрытии кода с помощью Jest
Это тоже довольно просто. У Jest есть собственная встроенная функция создания отчетов о покрытии, а сам пакет уже поставляется с любым приложением, созданным с использованием CRA, поэтому нам даже не нужно добавлять какие-либо зависимости.
В template.json
добавьте к объекту "scripts"
следующее:
{ "package": { ... "scripts": { ... "coverage": "npm test -- --coverage --watchAll=false" } } }
Собираем все вместе
Теперь, когда мы добавили кучу полезных вещей, нам нужно убедиться, что все работает должным образом. CRA позволяет указать путь к настраиваемому шаблону при создании нового приложения. Для удобства вы можете добавить в свой .bash_profile
что-то вроде этого:
# Maybe with a catchier name... alias create-react-app-custom="npx create-react-app --template=file:/path/to/template"
Подсказка: быстрый способ убедиться, что вы получили правильный путь, - это ввести use pwd
в свой терминал и просто скопировать / вставить результат в псевдоним выше.
Теперь вы можете просто запускать следующее каждый раз, когда захотите использовать этот шаблон:
create-react-app-custom <name> [options]
N.B. вам нужно будет открыть новое окно терминала, чтобы это изменение в вашем .bash_profile
вступило в силу.
В новом окне терминала попробуйте запустить следующую команду и посмотреть на вывод:
create-react-app-custom custom-app
Содержание созданного проекта должно быть вам знакомо. Это содержимое /template
, и если вы посмотрите package.json
для этого проекта, вы увидите, что зависимости и сценарии, которые мы указали в template.json
, были включены.
Чтобы проверить правильность добавления наших дополнений, вы можете сделать следующее:
- Prettier: испортите форматирование и зафиксируйте изменение, чтобы увидеть, как обработчик предварительной фиксации прибрался для вас (например, удалите точки с запятой в
App.js
) - Обозреватель исходных карт: запустите
npm run build && npm run analyze
, чтобы просмотреть отчет в браузере. - Покрытие теста: запустите
npm run coverage
, чтобы просмотреть очень простой отчет о покрытии на основе<App>
теста по умолчанию, который мы оставили в
Когда команда тестового покрытия запускается, она также создает новую папку /coverage
. Вы можете открыть ./coverage/lcov-report/index.html
в своем браузере для более интерактивного взаимодействия. N.B. в вашем терминале могут появиться ошибки, связанные с этой проблемой, но папка /coverage
все равно должна быть создана.
Вот и все, что касается базового шаблона! При использовании этого шаблона для создания новых проектов нам больше не нужно удалять стандартные файлы, которые нам не нужны, и несколько полезных утилит настроены прямо из коробки.
Следующие шаги
Если вы еще не были проданы, я надеюсь, что в процессе чтения вы поняли, что шаблоны могут быть невероятно полезными. Мы добавили несколько основных инструментов повышения качества жизни для новых проектов, в которых используется этот шаблон, но есть множество других вещей, которые вы можете добавить в зависимости от вашего варианта использования, и это лишь некоторые из них:
- настройте предпочтительное решение для стилизации с помощью базовой темы, глобальных стилей по умолчанию (размер коробки кто-нибудь?)
- Плагины
react-axe
и a11y - изменить значки и HTML по умолчанию в
/public
- i18n конфигурация
- предпочтительная структура папок
- добавить больше сценариев npm, соответствующих вашим обычным рабочим процессам
- общие пакеты, которые вы всегда используете, включая ваши собственные утилиты
Подведение итогов
Мы рассмотрели возможность создания собственного настраиваемого шаблона для приложения Create React, взяв за основу официальный стартер. Это было так же просто, как удаление нежелательного кода и файлов, указание некоторых пакетов и сценариев для включения в новые проекты и их тестирование.
Наконец, вы должны помнить, что, хотя шаблоны могут помочь нам сэкономить время и избавиться от повторяющихся задач, важно подумать о вашем сценарии использования и о том, что включить. Если вы регулярно попадаете в ситуацию, когда вы редактируете или удаляете файлы и утилиты, созданные с помощью вашего шаблона, вы, вероятно, немного перестарались.
Эта запись изначально была опубликована на tomvalorsa.com