1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/bwcs-crowFunding-eth

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Это зеркальный репозиторий, синхронизируется ежедневно с исходного репозитория.
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Данный проект был запущен с помощью Create React App (https://github.com/facebookincubator/create-react-app).

Ниже вы найдёте некоторую информацию о том, как выполнять общие задачи.

Самую последнюю версию этого руководства можно найти здесь (https://github.com/facebookincubator/create-react-app/blob/master/packages/react-scripts/template/README.md).

Содержание

  • Обновление до новых версий (Updating to New Releases);

  • Отправка отзывов (Sending Feedback);

  • Структура папок (Folder Structure);

  • Доступные скрипты:

    • npm start;
    • npm test;
    • npm run build;
    • npm run eject.
  • Поддерживаемые браузеры (Supported Browsers);

  • Поддерживаемые языковые функции и полифиллы (Supported Language Features and Polyfills);

  • Подсветка синтаксиса в редакторе (Syntax Highlighting in the Editor);

  • Отображение вывода линтера в редакторе (Displaying Lint Output in the Editor);

  • Отладка в редакторе (Debugging in the Editor);

  • Автоматическое форматирование кода (Formatting Code Automatically);

  • Изменение заголовка страницы (Changing the Page <title>);

  • Установка зависимости (Installing a Dependency);

  • Импорт компонента (Importing a Component);

  • Разбиение кода (Code Splitting);

  • Добавление таблицы стилей (Adding a Stylesheet);

  • Пост-обработка CSS (Post-Processing CSS);

  • Добавление препроцессора CSS (Sass, Less и т. д.) (Adding a CSS Preprocessor (Sass, Less etc.))

  • Добавление изображений, шрифтов и файлов (Adding Images, Fonts, and Files);

  • Использование папки public:

    • изменение HTML;
    • добавление ресурсов вне модульной системы;
    • когда использовать папку public.
  • Использование глобальных переменных (Using Global Variables);

  • Добавление Bootstrap:

    • использование пользовательской темы (using a Custom Theme);
  • Добавление Flow (Adding Flow);

  • Добавление маршрутизатора (Adding a Router);

  • Добавление пользовательских переменных среды:

    • ссылка на переменные среды в HTML;
    • временные переменные среды в вашей оболочке;
    • переменные среды разработки в .env;
  • Можно ли использовать декораторы? (Can I Use Decorators?);

  • Получение данных с помощью запросов AJAX (Fetching Data with AJAX Requests);

  • Интеграция с серверной частью API:

    • Node;
    • Ruby on Rails;
  • Проксирование запросов API в разработке:

    • «ошибки недопустимого заголовка хоста» после настройки прокси;
    • настройка прокси вручную;
    • настройка WebSocket-прокси;
  • Использование HTTPS в разработке (Using HTTPS in Development);

  • Генерация динамических тегов meta на сервере (Generating Dynamic Tags on the Server);

  • Предварительная отрисовка в статические файлы HTML (Pre-Rendering into Static HTML Files);

  • Внедрение данных с сервера на страницу (Injecting Data from the Server into the Page);

  • Запуск тестов:

    • соглашения об именах файлов;
    • интерфейс командной строки;
    • интеграция с системой контроля версий;
    • написание тестов;
    • тестирование компонентов;
    • использование сторонних библиотек утверждений;
    • инициализация тестовой среды;
    • фокусировка и исключение тестов;
    • отчётность о покрытии;
    • непрерывная интеграция;
    • отключение jsdom;
    • снимковое тестирование;
    • встраивание редактора;
  • Отладка тестов. Отладка тестов в Chrome

  • Отладка тестов в Visual Studio Code

Разработка компонентов изолированно

  • Начало работы с Storybook
  • Начало работы со Styleguidist

Публикация компонентов в npm

Создание прогрессивного веб-приложения

  • Отказ от кэширования
  • Рассмотрение варианта «сначала офлайн»
  • Метаданные прогрессивного веб-приложения

Анализ размера пакета

Развёртывание

* *Статический сервер*
* *Другие решения*
* *Обслуживание приложений с маршрутизацией на стороне клиента*
* *Сборка для относительных путей*
* *Azure*
* *Firebase*
* *GitHub Pages*
* *Heroku*
* *Netlify*
* *Now*
* *S3 и CloudFront*
* *Surge*

Расширенная конфигурация

Устранение неполадок

 * *npm start не обнаруживает изменения*
 * *npm test зависает на macOS Sierra*
 * *npm run build завершается слишком рано*
 * *npm run build не работает на Heroku*
 * *npm run build не может минимизировать*
 * *Моменты (Moment.js) отсутствуют локали*

Обновление до новых выпусков

Create React App делится на два пакета:

  • create-react-app — это глобальная утилита командной строки, которую вы используете для создания новых проектов.
  • react-scripts — зависимость разработки в сгенерированных проектах (включая этот).

Вам почти никогда не нужно обновлять сам create-react-app: он делегирует всю настройку react-scripts.

Когда вы запускаете create-react-app, он всегда создаёт проект с последней версией react-scripts, поэтому вы автоматически получаете все новые функции и улучшения в недавно созданных приложениях.

Чтобы обновить существующий проект до новой версии react-scripts, откройте журнал изменений, найдите версию, на которой вы сейчас находитесь (проверьте package.json в этой папке, если вы не уверены), и примените инструкции по миграции для более новых версий.

В большинстве случаев достаточно увеличить версию react-scripts в package.json и запустить npm install в этой папке. Однако рекомендуется ознакомиться с журналом изменений на предмет возможных критических изменений.

Мы стремимся свести критические изменения к минимуму, чтобы вы могли безболезненно обновить react-scripts.

Отправка отзывов

Мы всегда открыты для ваших отзывов.

Структура папок

После создания ваш проект должен выглядеть так:

my-app/
  README.md
  node_modules/
  package.json
  public/
    index.html
    favicon.ico
  src/
    App.css
    App.js
    App.test.js
    index.css
    index.js
    logo.svg

Для сборки проекта эти файлы должны существовать с точными именами:

  • public/index.html — шаблон страницы;
  • src/index.js — точка входа JavaScript.

Вы можете удалить или переименовать остальные файлы.

Можно создавать подкаталоги внутри src. Для более быстрой перестройки только файлы внутри src обрабатываются Webpack.

Поместите любые файлы JS и CSS внутрь src, иначе Webpack их не увидит.

Только файлы внутри public можно использовать из public/index.html. Инструкции по использованию ресурсов из JavaScript и HTML приведены ниже.

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

В каталоге проекта вы можете запустить:

npm start

Запускает приложение в режиме разработки. Откройте http://localhost:3000, чтобы просмотреть его в браузере.

Страница перезагрузится, если вы внесёте изменения. Вы также увидите любые ошибки линтинга в консоли.

npm test

Запускает тестовый раннер в интерактивном режиме наблюдения. Подробнее см. раздел о запуске тестов.

npm run build

Собирает приложение для продакшена в папку build. Правильно связывает React в рабочем режиме и оптимизирует сборку для лучшей производительности.

Сборка минимизирована, а имена файлов включают хэши. Ваше приложение готово к развёртыванию!

Подробнее см. раздел о развёртывании.

npm run eject

Примечание: это односторонняя операция. После извлечения вы не сможете вернуться!

Если вас не устраивает инструмент сборки и настройки, вы можете извлечь их в любое время. Эта команда удалит единственную зависимость сборки из вашего проекта.

Вместо этого она скопирует все файлы конфигурации и транзитивные зависимости (Webpack, Babel, ESLint и т. д.) прямо в ваш проект, чтобы у вас был полный контроль над ними. Все команды, кроме eject, по-прежнему будут работать, но они будут указывать на скопированные сценарии, так что вы сможете настроить их. На этом этапе вы предоставлены сами себе.

Вам не нужно использовать eject. Кураторский набор функций подходит для небольших и средних развёртываний, и вы не должны чувствовать себя обязанным использовать эту функцию. Однако мы понимаем, что этот инструмент был бы бесполезен, если бы вы не могли настроить его, когда будете готовы.

Поддерживаемые браузеры

По умолчанию сгенерированный проект использует последнюю версию React.

Вы можете обратиться к документации React для получения дополнительной информации о поддерживаемых браузерах.

Поддерживаемые языковые функции и полифиллы

Этот проект поддерживает расширенный набор последних стандартов JavaScript. Помимо синтаксических функций ES6, он также поддерживает:

  • оператор экспоненты (ES2016);
  • async/await (ES2017);
  • свойства объекта Rest/Spread (этап 3 предложения);
  • динамический импорт() (этап 3 предложения);
  • поля класса и статические свойства (часть этапа 3 предложения);
  • JSX и синтаксис Flow.

Узнайте больше о различных этапах предложений.

Хотя мы рекомендуем использовать экспериментальные предложения с некоторой осторожностью, Facebook активно использует эти функции в коде продукта, поэтому мы намерены предоставить codemods, если какие-либо из этих предложений изменятся в будущем.

Обратите внимание, что проект включает только несколько полифиллов ES6:

Если вы используете какие-либо другие функции ES6+, которые нуждаются в поддержке во время выполнения (например, Array.from() или Symbol), убедитесь, что вы вручную включаете соответствующие полифиллы или что браузеры, на которые вы ориентируетесь, уже поддерживают их.

Также обратите внимание, что использование некоторых новых синтаксических функций, таких как for...of или [...nonArrayValue], вызывает Babel. Форматирование кода автоматически

Prettier — это инструмент для форматирования кода с поддержкой JavaScript, CSS и JSON. С помощью Prettier можно автоматически форматировать код, который вы пишете, чтобы обеспечить единый стиль кода в вашем проекте. Подробнее об этом можно узнать на странице Prettier на GitHub, а также посмотреть, как это работает, на этой странице.

Чтобы форматировать наш код при каждом коммите в git, нам нужно установить следующие зависимости:

npm install --save husky lint-staged prettier

Или вы можете использовать yarn:

yarn add husky lint-staged prettier
  • husky упрощает использование githooks, как если бы они были npm скриптами.
  • lint-staged позволяет нам запускать скрипты на подготовленных файлах в git. Подробнее о lint-staged можно прочитать в этом блоге.
  • prettier — это средство форматирования JavaScript, которое мы будем запускать перед коммитами.

Теперь мы можем убедиться, что каждый файл отформатирован правильно, добавив несколько строк в package.json в корне проекта.

Добавьте следующую строку в раздел scripts:

  "scripts": {
+   "precommit": "lint-staged",
    "start": "react-scripts start",
    "build": "react-scripts build",

Далее мы добавляем поле lint-staged в package.json, например:

  "dependencies": {
    // ...
  },
+ "lint-staged": {
+   "src/**/*.{js,jsx,json,css}": [
+     "prettier --single-quote --write",
+     "git add"
+   ]
+ },
  "scripts": {

Теперь при каждом коммите Prettier будет автоматически форматировать изменённые файлы. Вы также можете запустить ./node_modules/.bin/prettier --single-quote --write "src/**/*.{js,jsx,json,css}", чтобы отформатировать весь проект в первый раз.

Изменение тега <title> страницы

Вы можете найти исходный HTML-файл в папке public сгенерированного проекта. Вы можете отредактировать тег <title> в нём, чтобы изменить заголовок с «React App» на что-то другое.

Обратите внимание, что обычно вы не будете часто редактировать файлы в папке public. Например, добавление таблицы стилей выполняется без изменения HTML.

Если вам нужно динамически обновлять заголовок страницы на основе содержимого, вы можете использовать API браузера document.title. Для более сложных сценариев, когда вы хотите изменить заголовок из компонентов React, вы можете использовать React Helmet, стороннюю библиотеку.

Если вы используете собственный сервер для своего приложения в продакшене и хотите изменить заголовок до того, как он будет отправлен в браузер, вы можете следовать советам в этом разделе. В качестве альтернативы вы можете предварительно создать каждую страницу в виде статического HTML-файла, который затем загружает пакет JavaScript, как описано здесь.

Установка зависимости

Сгенерированный проект включает React и ReactDOM в качестве зависимостей. Он также включает набор скриптов, используемых Create React App в качестве зависимости разработки. Вы можете установить другие зависимости (например, React Router) с помощью npm:

npm install --save react-router

Или вы можете использовать yarn:

yarn add react-router

Это работает для любой библиотеки, а не только для react-router.

Импорт компонента

Эта настройка проекта поддерживает модули ES6 благодаря Babel. Хотя вы всё ещё можете использовать require() и module.exports, мы рекомендуем вам использовать import и export вместо этого.

Например:

Button.js

import React, { Component } from 'react';

class Button extends Component {
  render() {
    // ...
  }
}

export default Button; // Не забудьте использовать экспорт по умолчанию!

DangerButton.js

import React, { Component } from 'react';
import
``` **Кнопка из './Button'; // Импорт компонента из другого файла**

class DangerButton расширяет Component {
  render() {
    return <Button color="red" />;
  }
}

export default DangerButton;

*Помните о разнице между default и именованными экспортом.* Это распространённый источник ошибок.

Мы рекомендуем придерживаться использования default импорта и экспорта, когда модуль экспортирует только одну вещь (например, компонент). Именно это вы получаете, используя `export default Button` и `import Button from './Button'`.

Именованные экспорты полезны для служебных модулей, которые экспортируют несколько функций. Модуль может иметь не более одного экспорта по умолчанию и столько именованных экспортов, сколько захотите.

Узнайте больше о модулях ES6:

* [Когда использовать фигурные скобки?](http://stackoverflow.com/questions/36795819/react-native-es-6-when-should-i-use-curly-braces-for-import/36796281#36796281)
* [Изучение ES6: Модули](http://exploringjs.com/es6/ch_modules.html)
* [Понимание ES6: Модули](https://leanpub.com/understandinges6/read#leanpub-auto-encapsulating-code-with-modules)

## Разделение кода

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

Эта настройка проекта поддерживает разделение кода с помощью динамического `import()`. Его предложение находится на стадии 3. Функция `import()`, похожая на оператор, принимает имя модуля в качестве аргумента и возвращает `Promise`, который всегда разрешается в объект пространства имён модуля.

Вот пример:

### `moduleA.js`

```js
const moduleA = 'Hello';

export { moduleA };

App.js

import React, { Component } from 'react';

class App extends Component {
  handleClick = () => {
    import('./moduleA')
      .then(({ moduleA }) => {
        // Используйте moduleA
      })
      .catch(err => {
        // Обработка ошибки
      });
  };

  render() {
    return (
      <div>
        <button onClick={this.handleClick}>Загрузить</button>
      </div>
    );
  }
}

export default App;

Это сделает moduleA.js и все его уникальные зависимости отдельным фрагментом, который загружается только после того, как пользователь нажимает кнопку «Загрузить».

Вы также можете использовать его с синтаксисом async / await, если предпочитаете его.

С React Router

Если вы используете React Router, ознакомьтесь с этим руководством о том, как использовать разделение кода с ним. Вы можете найти сопутствующий репозиторий GitHub здесь.

Также ознакомьтесь с разделом «Разделение кода» в документации React.

Добавление таблицы стилей

В этой настройке проекта используется Webpack для обработки всех ресурсов. Webpack предлагает собственный способ «расширения» концепции import за пределы JavaScript. Чтобы выразить, что файл JavaScript зависит от файла CSS, вам нужно импортировать CSS из файла JavaScript:

Button.css

.Button {
  padding: 20px;
}

Button.js

import React, { Component } from 'react';
import './Button.css'; // Скажите Webpack, что Button.js использует эти стили

class Button extends Component {
  render() {
    // Вы можете использовать их как обычные стили CSS
    return <div className="Button" />;
  }
}

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

При разработке выражение зависимостей таким образом позволяет вашим стилям быть... Переведённый текст:

Перезагружаются «на лету» по мере их редактирования. В рабочей среде все файлы CSS будут объединены в один минифицированный файл .css в выходных данных сборки.

Если вас беспокоит использование семантики, специфичной для Webpack, вы можете поместить весь свой CSS прямо в src/index.css. Он всё равно будет импортирован из src/index.js, но вы всегда можете удалить этот импорт, если позже перейдёте на другой инструмент сборки.

Постобработка CSS

Эта настройка проекта автоматически минимизирует ваш CSS и добавляет префиксы поставщиков через Autoprefixer, поэтому вам не нужно об этом беспокоиться.

Например, это:

.App {
  display: flex;
  flex-direction: row;
  align-items: center;
}

становится таким:

.App {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: horizontal;
  -webkit-box-direction: normal;
      -ms-flex-direction: row;
          flex-direction: row;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
}

Если вам по какой-то причине необходимо отключить автопрефикс, следуйте этому разделу.

Добавление препроцессора CSS (Sass, Less и т. д.)

Как правило, мы рекомендуем не использовать одни и те же классы CSS в разных компонентах. Например, вместо использования класса CSS .Button в компонентах <AcceptButton> и <RejectButton>, мы рекомендуем создать компонент <Button> со своими собственными стилями .Button, которые могут отображать оба компонента <AcceptButton> и <RejectButton> (но не наследуют).

Следование этому правилу часто делает препроцессоры CSS менее полезными, поскольку такие функции, как миксины и вложенность, заменяются композицией компонентов. Однако вы можете интегрировать препроцессор CSS, если считаете его полезным. В этом руководстве мы будем использовать Sass, но вы также можете использовать Less или другую альтернативу.

Сначала установим интерфейс командной строки для Sass:

npm install --save node-sass-chokidar

Или вы можете использовать yarn:

yarn add node-sass-chokidar

Затем в package.json добавьте следующие строки в scripts:

   "scripts": {
+    "build-css": "node-sass-chokidar src/ -o src/",
+    "watch-css": "npm run build-css && node-sass-chokidar src/ -o src/ --watch --recursive",
     "start": "react-scripts start",
     "build": "react-scripts build",
     "test": "react-scripts test --env=jsdom",

Примечание: Чтобы использовать другой препроцессор, замените команды build-css и watch-css согласно документации вашего препроцессора.

Теперь вы можете переименовать src/App.css в src/App.scss и запустить npm run watch-css. Наблюдатель найдёт каждый файл Sass в подкаталогах src и создаст соответствующий файл CSS рядом с ним, в нашем случае перезаписывая src/App.css. Поскольку src/App.js по-прежнему импортирует src/App.css, стили становятся частью вашего приложения. Теперь вы можете редактировать src/App.scss, и src/App.css будет восстановлен.

Чтобы поделиться переменными между файлами Sass, вы можете использовать импорт Sass. Например, src/App.scss и другие файлы стилей компонентов могут включать @import "./shared.scss"; с определениями переменных.

Чтобы включить импорт файлов без использования относительных путей, вы можете добавить опцию --include-path к команде в package.json.

"build-css": "node-sass-chokidar --include-path ./src --include-path ./node_modules src/ -o src/",
"watch-css": "npm run build-css && node-sass-chokidar --include-path ./src --include-path ./node_modules src/ -o src/ --watch --recursive",

Это позволит вам делать такие импорты, как

@import 'styles/_colors.scss'; // предполагая наличие каталога styles в src/
@import 'nprogress/nprogress'; // импорт файла css из модуля узла nprogress

На этом этапе вы, возможно, захотите удалить все файлы CSS из системы контроля версий и добавить src/**/*.css в свой файл .gitignore. Как правило, рекомендуется хранить продукты сборки вне системы контроля версий.

В качестве последнего шага вы можете найти удобным запуск watch-css автоматически. Использование npm start и build-css как части npm run build. Выполнение двух скриптов последовательно с помощью оператора &&. Установка пакета для параллельного выполнения:

npm install --save npm-run-all

Альтернативный вариант с использованием yarn:

yarn add npm-run-all

Изменение скриптов start и build для включения команд препроцессора CSS:

   "scripts": {
     "build-css": "node-sass-chokidar src/ -o src/",
     "watch-css": "npm run build-css && node-sass-chokidar src/ -o src/ --watch --recursive",
-    "start": "react-scripts start",
-    "build": "react-scripts build",
+    "start-js": "react-scripts start",
+    "start": "npm-run-all -p watch-css start-js",
+    "build-js": "react-scripts build",
+    "build": "npm-run-all build-css build-js",
     "test": "react-scripts test --env=jsdom",
     "eject": "react-scripts eject"
   }

Теперь запуск npm start и npm run build также собирает файлы Sass.

Почему используется node-sass-chokidar?

У node-sass есть следующие проблемы:

  • node-sass --watch имеет проблемы с производительностью в определённых условиях при использовании в виртуальной машине или с docker;
  • бесконечные стили компиляции;
  • node-sass имеет проблемы с обнаружением новых файлов в каталоге.

Node-sass-chokidar решает эти проблемы.

Добавление изображений, шрифтов и файлов

В Webpack использование статических ресурсов, таких как изображения и шрифты, работает аналогично CSS.

Можно импортировать файл прямо в модуль JavaScript. Это говорит Webpack включить этот файл в пакет. В отличие от импорта CSS, импорт файла даёт строковое значение. Это значение является окончательным путём, который можно использовать в коде, например, как атрибут src изображения или href ссылки на PDF.

Для уменьшения количества запросов к серверу импорт изображений размером менее 10 000 байт возвращает URI данных вместо пути. Это относится к следующим расширениям файлов: bmp, gif, jpg, jpeg и png. Файлы SVG исключены из-за проблем с их обработкой.

Вот пример:

import React from 'react';
import logo from './logo.png'; // Tell Webpack this JS file uses this image

console.log(logo); // /logo.84287d09.png

function Header() {
  // Import result is the URL of your image
  return <img src={logo} alt="Logo" />;
}

export default Header;

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

То же самое работает и в CSS:

.Logo {
  background-image: url(./logo.png);
}

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

Обратите внимание, что это также пользовательская функция Webpack.

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

Альтернативный способ обработки статических активов описан в следующем разделе.

Использование папки public

Примечание: эта функция доступна с react-scripts@0.5.0 и выше.

Изменение HTML

Папка public содержит HTML-файл, который вы можете настроить, например, чтобы установить заголовок страницы. Во время сборки автоматически добавляется тег <script> со скомпилированным кодом. Добавление ресурсов вне системы модулей

Вы также можете добавлять другие ресурсы в папку public.

Обратите внимание, что обычно мы рекомендуем импортировать ресурсы в файлы JavaScript. Например, см. разделы о добавлении таблицы стилей и добавлении изображений, шрифтов и файлов.

Этот механизм предоставляет ряд преимуществ:

  • Скрипты и таблицы стилей минимизируются и объединяются, чтобы избежать дополнительных сетевых запросов.
  • Отсутствующие файлы вызывают ошибки компиляции вместо ошибок 404 для ваших пользователей.
  • Имена результирующих файлов включают хэши содержимого, поэтому вам не нужно беспокоиться о том, что браузеры кэшируют старые версии.

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

Если вы поместите файл в папку public, он не будет обработан Webpack. Вместо этого он будет скопирован в папку сборки без изменений. Чтобы ссылаться на ресурсы в папке public, вам необходимо использовать специальную переменную с именем PUBLIC_URL.

Внутри index.html вы можете использовать её следующим образом:

<link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">

Только файлы внутри папки public будут доступны через префикс %PUBLIC_URL%. Если вам нужно использовать файл из src или node_modules, вам придётся скопировать его туда, чтобы явно указать своё намерение сделать этот файл частью сборки.

Когда вы запускаете npm run build, Create React App заменит %PUBLIC_URL% правильным абсолютным путём, чтобы ваш проект работал, даже если вы используете маршрутизацию на стороне клиента или размещаете его по некорневому URL.

В коде JavaScript вы можете использовать process.env.PUBLIC_URL для аналогичных целей:

render() {
  // Примечание: это обходной путь, и его следует использовать экономно!
  // Обычно мы рекомендуем использовать `import` для получения URL-адресов ресурсов,
  // как описано в разделе «Добавление изображений и шрифтов» выше.
  return <img src={process.env.PUBLIC_URL + '/img/logo.png'} />;
}

Имейте в виду недостатки этого подхода:

  • Ни один из файлов в папке public не подвергается последующей обработке или минификации.
  • Отсутствующие файлы не будут вызываться во время компиляции и вызовут ошибки 404 для ваших пользователей.
  • Имена результирующих файлов не будут включать хэши содержимого, поэтому вам нужно будет добавлять аргументы запроса или переименовывать их каждый раз, когда они меняются.

Когда использовать папку public

Обычно мы рекомендуем импортировать таблицы стилей, изображения и шрифты из JavaScript. Папка public полезна в качестве обходного пути для ряда менее распространённых случаев:

  • Вам нужен файл с определённым именем в выходных данных сборки, например, manifest.webmanifest.
  • У вас тысячи изображений, и вам нужно динамически ссылаться на их пути.
  • Вы хотите включить небольшой скрипт, такой как pace.js, вне связанного кода.
  • Некоторая библиотека может быть несовместима с Webpack, и у вас нет другого выбора, кроме как включить её в виде тега <script>.

Обратите внимание: если вы добавите тег <script>, который объявляет глобальные переменные, вам также необходимо прочитать следующий раздел об их использовании.

Использование глобальных переменных

Когда вы включаете скрипт в HTML-файл, который определяет глобальные переменные и пытается использовать одну из этих переменных в коде, линтер будет жаловаться, потому что он не видит определения переменной.

Вы можете избежать этого, прочитав глобальную переменную явно из объекта window, например:

const $ = window.$;

Это делает очевидным, что вы используете глобальную переменную намеренно, а не из-за опечатки.

Кроме того, вы можете заставить линтер игнорировать любую строку, добавив // eslint-disable-line после неё.

Добавление Bootstrap

Вам не обязательно использовать React Bootstrap вместе с React, но это популярная библиотека для интеграции Bootstrap с приложениями React. Если она вам нужна, вы можете интегрировать её с Create React App, выполнив следующие действия:

Установите React Bootstrap и Bootstrap из npm. React Bootstrap не включает CSS Bootstrap, поэтому его необходимо установить отдельно. Установлено также:

npm install --save react-bootstrap bootstrap@3

Альтернативно вы можете использовать yarn:

yarn add react-bootstrap bootstrap@3

Импортируйте Bootstrap CSS и, опционально, Bootstrap theme CSS в начале файла src/index.js:

import 'bootstrap/dist/css/bootstrap.css';
import 'bootstrap/dist/css/bootstrap-theme.css';
// Поместите все остальные импорты ниже, чтобы стили из ваших
// компонентов имели приоритет над стандартными стилями.

Импортируйте необходимые компоненты React Bootstrap в файл src/App.js или файлы ваших пользовательских компонентов:

import { Navbar, Jumbotron, Button } from 'react-bootstrap';

Теперь вы готовы использовать импортированные компоненты React Bootstrap в иерархии компонентов, определённой в методе рендеринга. Вот пример файла App.js, переделанный с использованием React Bootstrap.

Использование пользовательской темы

Иногда вам может потребоваться настроить визуальные стили Bootstrap (или эквивалентного пакета). Мы предлагаем следующий подход:

  • Создайте новый пакет, который зависит от пакета, который вы хотите настроить, например, Bootstrap.
  • Добавьте необходимые шаги сборки для настройки темы и опубликуйте свой пакет на npm.
  • Установите собственный пакет тем как зависимость вашего приложения.

Вот пример добавления настроенного Bootstrap, который следует этим шагам.

Добавление Flow

Flow — это статический анализатор типов, который помогает писать код с меньшим количеством ошибок. Ознакомьтесь с этой статьёй о статических типах в JavaScript, если вы новичок в этой концепции.

Последние версии Flow работают с проектами Create React App «из коробки».

Чтобы добавить Flow в проект Create React App, выполните следующие действия:

  1. Запустите npm install --save flow-bin (или yarn add flow-bin).
  2. Добавьте "flow": "flow" в раздел scripts файла package.json.
  3. Запустите npm run flow init (или yarn flow init), чтобы создать файл .flowconfig в корневом каталоге.
  4. Добавьте // @flow к любым файлам, которые вы хотите проверить (например, к src/App.js).

Теперь можно запустить npm run flow (или yarn flow) для проверки файлов на наличие ошибок типа. Вы можете дополнительно использовать IDE, такую как Nuclide, для более интегрированного опыта. В будущем мы планируем ещё больше интегрировать его в Create React App.

Для получения дополнительной информации о Flow ознакомьтесь с его документацией.

Добавление маршрутизатора

Create React App не предписывает конкретное решение для маршрутизации, но React Router является наиболее популярным.

Чтобы установить его, запустите:

npm install --save react-router-dom

Альтернативно вы можете использовать yarn:

yarn add react-router-dom

Чтобы попробовать его, удалите весь код в src/App.js и замените его любым примером с его веб-сайта. Базовый пример — хорошее место для начала.

Обратите внимание, что вам может потребоваться настроить сервер для поддержки маршрутизации на стороне клиента перед развёртыванием приложения.

Добавление пользовательских переменных среды

Примечание: эта функция доступна с react-scripts@0.2.3 и выше.

Ваш проект может использовать переменные, объявленные в вашей среде, как если бы они были объявлены локально в ваших JS-файлах. По умолчанию у вас будет определён NODE_ENV, а также любые другие переменные среды, начинающиеся с REACT_APP_.

Переменные окружения встраиваются во время сборки. Поскольку Create React App создаёт статический HTML/CSS/JS-пакет, он не может прочитать их во время выполнения. Чтобы прочитать их во время выполнения, вам нужно будет загрузить HTML в память на сервере и заменить заполнители во время выполнения, как описано в документации. Здесь (#injecting-data-from-the-server-into-the-page) вы можете перестраивать приложение на сервере каждый раз, когда вносите изменения.

Примечание: необходимо создавать пользовательские переменные среды, начинающиеся с REACT_APP_. Любые другие переменные, кроме NODE_ENV, будут игнорироваться, чтобы случайно не раскрыть закрытый ключ на машине, которая может иметь такое же имя (https://github.com/facebookincubator/create-react-app/issues/865#issuecomment-252199527). Изменение любых переменных среды потребует перезапуска сервера разработки, если он запущен.

Эти переменные среды будут определены для вас в process.env. Например, наличие переменной среды с именем REACT_APP_SECRET_CODE будет доступно в вашем JS как process.env.REACT_APP_SECRET_CODE.

Существует также специальная встроенная переменная среды под названием NODE_ENV. Вы можете прочитать её из process.env.NODE_ENV. Когда вы запускаете npm start, она всегда равна 'development', когда вы запускаете npm test — всегда равна 'test', а когда вы запускаете npm run build для создания производственного пакета — всегда равна 'production'. Вы не можете переопределить NODE_ENV вручную. Это предотвращает случайную отправку медленной версии разработки в продакшн.

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

Сначала вам нужно определить переменные среды. Например, предположим, что вы хотели использовать секрет, определённый в среде, внутри <form>:

render() {
  return (
    <div>
      <small>You are running this application in <b>{process.env.NODE_ENV}</b> mode.</small>
      <form>
        <input type="hidden" defaultValue={process.env.REACT_APP_SECRET_CODE} />
      </form>
    </div>
  );
}

Во время сборки process.env.REACT_APP_SECRET_CODE будет заменён текущим значением переменной среды REACT_APP_SECRET_CODE. Помните, что переменная NODE_ENV будет установлена автоматически.

Когда вы загружаете приложение в браузере и проверяете <input>, вы увидите, что его значение установлено на abcdef, а жирный текст покажет среду, предоставленную при использовании npm start:

<div>
  <small>You are running this application in <b>development</b> mode.</small>
  <form>
    <input type="hidden" value="abcdef" />
  </form>
</div>

Вышеупомянутая форма ищет переменную с именем REACT_APP_SECRET_CODE из среды. Чтобы использовать это значение, мы должны определить его в среде. Это можно сделать двумя способами: либо в вашей оболочке, либо в файле .env. Оба этих способа описаны в следующих разделах.

Доступ к NODE_ENV также полезен для выполнения действий условно:

if (process.env.NODE_ENV !== 'production') {
  analytics.disable();
}

При компиляции приложения с помощью npm run build шаг минификации удалит это условие, и результирующий пакет будет меньше.

Обращение к переменным среды в HTML

Примечание: эта функция доступна с react-scripts@0.9.0 и выше.

Вы также можете получить доступ к переменным окружения, начинающимся с REACT_APP_, в public/index.html. Например:

<title>%REACT_APP_WEBSITE_NAME%</title>

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

  • Помимо нескольких встроенных переменных (NODE_ENV и PUBLIC_URL), имена переменных должны начинаться с REACT_APP_, чтобы работать.
  • Переменные среды внедряются во время сборки. Если вам нужно внедрить их во время выполнения, используйте этот подход.

Добавление временных переменных среды в вашу оболочку

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

Windows (cmd.exe)

set "REACT_APP_SECRET_CODE=abcdef" && npm start

(Примечание: кавычки вокруг присвоения переменной обязательны, чтобы избежать пробела в конце.)

Windows (Powershell) Поддержка браузерами.

Глобальная функция fetch позволяет легко выполнять AJAX-запросы. Она принимает URL в качестве входных данных и возвращает Promise, который разрешается в объект Response. Вы можете найти дополнительную информацию о fetch здесь.

Этот проект также включает полифилл для Promise [https://github.com/then/promise], который предоставляет полную реализацию Promises/A+. Promise представляет конечный результат асинхронной операции, вы можете найти больше информации о Promises [здесь] (https://www.promisejs.org/) и здесь. И axios, и fetch() используют Promises под капотом. Вы также можете использовать синтаксис async / await [https://davidwalsh.name/async-await], чтобы уменьшить вложенность обратных вызовов.

Вы можете узнать больше о выполнении AJAX-запросов из компонентов React в записи часто задаваемых вопросов на веб-сайте React [https://reactjs.org/docs/faq-ajax.html].

Интеграция с серверной частью API

Эти руководства помогут вам интегрировать ваше приложение с серверной частью API, работающей на другом порту, используя fetch() для доступа к ней.

Node

Ознакомьтесь с этим руководством [https://www.fullstackreact.com/articles/using-create-react-app-with-a-server/]. Вы можете найти сопутствующий репозиторий GitHub здесь [https://github.com/fullstackreact/food-lookup-demo].

Ruby on Rails

Ознакомьтесь с этим руководством [https://www.fullstackreact.com/articles/how-to-get-create-react-app-to-work-with-your-rails-api/]. Вы можете найти сопутствующий репозиторий GitHub здесь [https://github.com/fullstackreact/food-lookup-demo-rails].

Проксирование запросов API в разработке

Примечание: эта функция доступна в react-scripts@0.2.3 и выше.

Люди часто обслуживают интерфейсное приложение React с того же хоста и порта, что и их бэкенд-реализация. Например, производственная установка может выглядеть следующим образом после развёртывания приложения:

/             - статический сервер возвращает index.html с приложением React
/todos        - статический сервер возвращает index.html с приложением React
/api/todos    - сервер обрабатывает любые запросы /api/* с помощью бэкэнд-реализации

Такая настройка не требуется. Однако, если у вас есть такая настройка, удобно писать запросы типа fetch('/api/todos') без необходимости перенаправлять их на другой хост или порт во время разработки.

Чтобы указать серверу разработки проксировать любые неизвестные запросы на ваш сервер API в процессе разработки, добавьте поле proxy в свой файл package.json, например:

  "proxy": "http://localhost:4000",

Таким образом, когда вы fetch('/api/todos') в процессе разработки, сервер разработки распознает, что это не статический актив, и будет проксировать ваш запрос на http://localhost:4000/api/todos в качестве запасного варианта. Сервер разработки только попытается отправить запросы без text/html в своём заголовке Accept на прокси.

Удобно, что это позволяет избежать проблем с CORS [http://stackoverflow.com/questions/21854516/understanding-ajax-cors-and-security-considerations] и сообщений об ошибках, подобных этому, в процессе разработки:

Fetch API cannot load http://localhost:4000/api/todos. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

Имейте в виду, что proxy действует только в процессе разработки (с npm start), и вы должны убедиться, что URL-адреса, такие как /api/todos, указывают на нужное место в рабочей среде. Вам не нужно использовать префикс /api. Любой неопознанный запрос без заголовка accept text/html будет перенаправлен на указанный proxy.

Опция proxy поддерживает соединения HTTP, HTTPS и WebSocket. Если опция proxy не достаточно гибкая для вас, вы также можете:

При включении опции proxy вы переходите на более строгий набор проверок хоста. Это необходимо, потому что открытие бэкенда для удалённых хостов делает ваш компьютер уязвимым для атак с использованием DNS-перепривязки. Проблема описана в этой статье и этом выпуске.

Это не должно влиять на вас при разработке на localhost, но если вы разрабатываете удалённо, как описано здесь, то после включения опции proxy в браузере появится такая ошибка:

Invalid Host header

Чтобы обойти её, вы можете указать свой публичный хост разработки в файле с именем .env.development в корне вашего проекта:

HOST=mypublicdevhost.com

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

Если у вас всё ещё есть проблемы или вы используете более экзотическую среду, такую как облачный редактор, вы можете полностью обойти проверку хоста, добавив строку в .env.development.local. Обратите внимание, что это опасно и подвергает вашу машину удалённому выполнению кода с вредоносных веб-сайтов:

# NOTE: THIS IS DANGEROUS!
# It exposes your machine to attacks from the websites you visit.
DANGEROUSLY_DISABLE_HOST_CHECK=true

Мы не рекомендуем этот подход.

Настройка прокси вручную

Примечание: эта функция доступна с react-scripts@1.0.0 и выше.

Если опция proxy не достаточно гибкая для вас, вы можете задать объект в следующей форме (в package.json). Вы также можете указать любое значение конфигурации, поддерживаемое http-proxy-middleware или http-proxy.

{
  // ...
  "proxy": {
    "/api": {
      "target": "<url>",
      "ws": true
      // ...
    }
  }
  // ...
}

Все запросы, соответствующие этому пути, будут проксироваться без исключений. Сюда входят запросы text/html, которые стандартная опция proxy не проксирует.

Если вам нужно указать несколько прокси, вы можете сделать это, указав дополнительные записи. Совпадения — это регулярные выражения, поэтому вы можете использовать регулярное выражение для сопоставления нескольких путей.

{
  // ...
  "proxy": {
    // Соответствует любому запросу, начинающемуся с /api
    "/api": {
      "target": "<url_1>",
      "ws": true
      // ...
    },
    // Соответствует любому запросу, начинающемуся с /foo
    "/foo": {
      "target": "<url_2>",
      "ssl": true,
      "pathRewrite": {
        "^/foo": "/foo/beta"
      }
      // ...
    },
    // Соответствует /bar/abc.html, но не /bar/sub/def.html
    "/bar/[^/]*[.]html": {
      "target": "<url_3>",
      // ...
    },
    // Соответствует /baz/abc.html и /baz/sub/def.html
    "/baz/.*/.*[.]html": {
      "target": "<url_4>"
      // ...
    }
  }
  // ...
}

Настройка прокси для WebSocket

При настройке прокси для WebSocket следует учитывать некоторые дополнительные моменты.

Если вы используете движок WebSocket, такой как Socket.io, у вас должен быть запущен сервер Socket.io, который можно использовать в качестве целевого прокси. Socket.io не будет работать со стандартным сервером WebSocket. В частности, не ожидайте, что Socket.io будет работать с эхо-тестом websocket.org.

Существует хорошая документация по настройке сервера Socket.io.

Стандартные WebSockets будут работать со стандартным WebSocket-сервером, а также с эхо-тестом websocket.org. Вы можете использовать такие библиотеки, как ws для сервера, с собственными WebSockets в браузере.

В любом случае вы можете настроить проксирование запросов WebSocket вручную в package.json:

{
  // ...
  "proxy": {
    "/socket": {
      // Ваш код... ## Использование HTTPS в разработке

>Примечание: эта функция доступна с версии `react-scripts@0.4.0` и выше.

Вам может потребоваться, чтобы сервер разработки обслуживал страницы по HTTPS. Один из случаев, когда это может быть полезно  использование функции «прокси» (#Проксирование запросов к API в процессе разработки) для проксирования запросов к серверу API, который сам обслуживает HTTPS.

Чтобы это сделать, установите переменную среды `HTTPS` в значение `true`, затем запустите сервер разработки как обычно с помощью команды `npm start`:

#### Windows (cmd.exe)

```cmd
set HTTPS=true&&npm start

Windows (Powershell)

($env:HTTPS = $true) -and (npm start)

(Обратите внимание: отсутствие пробелов является преднамеренным.)

Linux, macOS (Bash)

HTTPS=true npm start

Обратите внимание, что сервер будет использовать самозаверяющий сертификат, поэтому ваш веб-браузер почти наверняка отобразит предупреждение при доступе к странице.

Создание динамических тегов <meta> на сервере

Поскольку Create React App не поддерживает рендеринг на стороне сервера, вы можете задаться вопросом, как сделать теги <meta> динамическими и отражающими текущий URL. Чтобы решить эту проблему, мы рекомендуем добавить заполнители в HTML, например так:

<!doctype html>
<html lang="en">
  <head>
    <meta property="og:title" content="__OG_TITLE__">
    <meta property="og:description" content="__OG_DESCRIPTION__">

Затем на сервере, независимо от используемого вами бэкенда, вы можете прочитать index.html в память и заменить __OG_TITLE__, __OG_DESCRIPTION__ и любые другие заполнители значениями в зависимости от текущего URL. Просто убедитесь, что вы дезинфицируете и экранируете интерполированные значения, чтобы они были безопасны для встраивания в HTML!

Если вы используете сервер Node, вы даже можете поделиться логикой сопоставления маршрутов между клиентом и сервером. Однако дублирование также хорошо работает в простых случаях.

Предварительный рендеринг в статические файлы HTML

Если вы размещаете свой build у провайдера статического хостинга, вы можете использовать react-snapshot или react-snap, чтобы создать HTML-страницы для каждого маршрута или относительной ссылки в вашем приложении. Эти страницы затем будут плавно активироваться или «гидратироваться», когда пакет JavaScript загрузится.

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

Основное преимущество предварительного рендеринга заключается в том, что вы получаете основной контент каждой страницы с полезной нагрузкой HTML — независимо от того, успешно ли загружается ваш пакет JavaScript. Это также увеличивает вероятность того, что каждый маршрут вашего приложения будет обнаружен поисковыми системами.

Вы можете узнать больше о предварительном рендеринге с нулевой конфигурацией (также называемом моментальным снимком) здесь.

Внедрение данных с сервера на страницу

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

<!doctype html>
<html lang="en">
  <head>
    <script>
      window.SERVER_DATA = __SERVER_DATA__;
    </script>

Затем на сервере вы можете заменить __SERVER_DATA__ на JSON реальных данных прямо перед отправкой ответа. Клиентский код может затем прочитать window.SERVER_DATA, чтобы использовать его. Обязательно проведите дезинфекцию JSON перед отправкой клиенту, поскольку это делает ваше приложение уязвимым для XSS-атак.

Выполнение тестов

Примечание: эта функция доступна с версии react-scripts@0.3.0 и выше.
[Ознакомьтесь с руководством по миграции, чтобы узнать, как включить её в более старых версиях. Проекты!

Create React App использует Jest в качестве тестового раннера. Чтобы подготовиться к этой интеграции, мы провели масштабное обновление Jest, так что если вы слышали о нём плохие вещи несколько лет назад, попробуйте ещё раз.

Jest — это раннер на основе Node. Это означает, что тесты всегда выполняются в среде Node, а не в реальном браузере. Это позволяет нам ускорить итерацию и предотвратить нестабильность.

Хотя Jest предоставляет глобальные переменные браузера, такие как window, благодаря jsdom, они являются лишь приближением к реальному поведению браузера. Jest предназначен для использования в модульных тестах вашей логики и компонентов, а не для проверки DOM-особенностей.

Мы рекомендуем использовать отдельный инструмент для браузерных сквозных тестов, если они вам нужны. Они выходят за рамки Create React App.

Соглашения об именах файлов

Jest будет искать тестовые файлы с любым из следующих популярных соглашений об именовании:

  • Файлы с суффиксом .js в папках tests.
  • Файлы с суффиксом .test.js.
  • Файлы с суффиксом .spec.js.

Файлы .test.js / .spec.js (или папки tests) могут находиться на любой глубине под верхней папкой src.

Рекомендуется размещать тестовые файлы (или папки tests) рядом с кодом, который они тестируют, чтобы относительные импорты были короче. Например, если App.test.js и App.js находятся в одной папке, тесту просто нужно импортировать App из './App' вместо длинного относительного пути. Совместное размещение также помогает быстрее находить тесты в более крупных проектах.

Интерфейс командной строки

Когда вы запускаете npm test, Jest запускается в режиме просмотра. Каждый раз, когда вы сохраняете файл, он повторно запускает тесты, точно так же, как npm start перекомпилирует код.

Наблюдатель включает интерактивный интерфейс командной строки с возможностью запускать все тесты или фокусироваться на шаблоне поиска. Он разработан таким образом, чтобы вы могли держать его открытым и наслаждаться быстрыми повторными запусками. Вы можете узнать команды из заметки «Использование часов», которую наблюдатель печатает после каждого запуска:

Интеграция с системой контроля версий

По умолчанию, когда вы запускаете npm test, Jest будет запускать только тесты, связанные с файлами, изменёнными со времени последнего коммита. Это оптимизация, предназначенная для того, чтобы ваши тесты выполнялись быстро независимо от того, сколько у вас тестов. Однако предполагается, что вы не часто фиксируете код, который не проходит тесты.

Jest всегда явно упоминает, что он запускал только тесты, относящиеся к файлам, изменённым со времени последнего коммита. Вы также можете нажать a в режиме наблюдения, чтобы заставить Jest запустить все тесты.

Jest всегда будет запускать все тесты на сервере непрерывной интеграции или если проект не находится внутри репозитория Git или Mercurial.

Написание тестов

Чтобы создать тесты, добавьте блоки it() (или test()) с именем теста и его кодом. При желании вы можете обернуть их в блоки describe() для логической группировки, но это не требуется и не рекомендуется.

Jest предоставляет встроенную глобальную функцию expect() для утверждений. Базовый тест может выглядеть следующим образом:

import sum from './sum';

it('sums numbers', () => {
  expect(sum(1, 2)).toEqual(3);
  expect(sum(2, 2)).toEqual(4);
});

Все сопоставители expect(), поддерживаемые Jest, подробно описаны здесь. Вы также можете использовать jest.fn() и expect(fn).toBeCalled() для создания «шпионов» или фиктивных функций.

Тестирование компонентов

Существует широкий спектр методов тестирования компонентов. Они варьируются от «дымового теста», проверяющего, что компонент отображается без ошибок, до поверхностного рендеринга и тестирования части вывода, до полного рендеринга и проверки жизненного цикла компонента и изменений состояния. Разные проекты выбирают разные компромиссы тестирования в зависимости от того, как часто меняются компоненты и насколько... ``` // Импортируем 'jest-enzyme' import 'jest-enzyme';

// Используем react-testing-library В качестве альтернативы или дополнения к enzyme можно рассмотреть использование react-testing-library. react-testing-library — это библиотека для тестирования React-компонентов способом, который напоминает способ использования компонентов конечными пользователями. Она хорошо подходит для модульного, интеграционного и сквозного тестирования React-компонентов и приложений. Она работает более непосредственно с узлами DOM, поэтому рекомендуется использовать её вместе с jest-dom для улучшенных утверждений.

Чтобы установить react-testing-library и jest-dom, можно выполнить:

npm install --save react-testing-library jest-dom

Или же вы можете использовать yarn:

yarn add react-testing-library jest-dom

Аналогично enzyme вы можете создать файл src/setupTests.js, чтобы избежать шаблонного кода в ваших тестовых файлах:

// react-testing-library отображает ваши компоненты в document.body,
// это гарантирует их удаление после каждого теста.
import 'react-testing-library/cleanup-after-each';

// Это добавляет пользовательские утверждения jest-dom.
import 'jest-dom/extend-expect';

Вот пример использования react-testing-library и jest-dom для проверки того, что компонент отображает «Welcome to React».

import React from 'react';
import { render } from 'react-testing-library';
import App from './App';

it('renders welcome message', () => {
  const { getByText } = render(<App />);
  expect(getByText('Welcome to React')).toBeInTheDOM();
});

Подробнее об утилитах, предоставляемых react-testing-library для облегчения тестирования асинхронных взаимодействий, а также о выборе элементов формы, можно узнать из документации по react-testing-library (https://github.com/kentcdodds/react-testing-library) и примеров (https://codesandbox.io/s/github/kentcdodds/react-testing-library-examples).

Использование сторонних библиотек утверждений

Мы рекомендуем использовать expect() для утверждений и jest.fn() для шпионов. Если у вас возникли проблемы с ними, пожалуйста, создайте их в Jest (https://github.com/facebook/jest/issues/new), и мы исправим их. Мы намерены продолжать улучшать их для React, поддерживая, например, красивую печать элементов React как JSX (https://github.com/facebook/jest/pull/1566).

Однако, если вы привыкли к другим библиотекам, таким как Chai (http://chaijs.com/) и Sinon (http://sinonjs.org/), или если у вас есть существующий код, использующий их, который вы хотели бы перенести, вы можете импортировать их обычным образом:

import sinon from 'sinon';
import { expect } from 'chai';

и затем использовать их в своих тестах, как обычно.

Инициализация тестовой среды

Примечание: эта функция доступна с react-scripts@0.4.0 и выше. Если ваше приложение использует браузерный API, который вам нужно смоделировать в тестах или если вам просто нужна глобальная настройка перед запуском тестов, добавьте src/setupTests.js в свой проект. Он будет автоматически выполнен перед запуском ваших тестов. Например:

src/setupTests.js

const localStorageMock = {
  getItem: jest.fn(),
  setItem: jest.fn(),
  clear: jest.fn()
};
global.localStorage = localStorageMock

Примечание: Имейте в виду, что если вы решите «извлечь» перед созданием src/setupTests.js, полученный файл package.json не будет содержать никаких ссылок на него, поэтому вам следует вручную создать свойство setupTestFrameworkScriptFile в конфигурации для Jest, примерно так:

"jest": {
  // ...
  "setupTestFrameworkScriptFile": "<rootDir>/src/setupTests.js"
 }

Фокусировка и исключение тестов

Вы можете заменить it() на xit(), чтобы временно исключить тест из выполнения. Точно так же fit() позволяет вам сосредоточиться на конкретном тесте без запуска каких-либо других тестов.

Отчётность о покрытии

У Jest есть встроенный репортер покрытия, который хорошо работает с ES6 и не требует настройки. Запустите npm test -- --coverage (обратите внимание на дополнительные -- в команде). middle) to include a coverage report like this:

Покрытие отчета

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

Конфигурация

Конфигурацию покрытия по умолчанию Jest можно переопределить, добавив любой из следующих поддерживаемых ключей в конфигурацию Jest в вашем package.json.

Поддерживаемые переопределения:

Пример package.json:

{
  "name": "your-package",
  "jest": {
    "collectCoverageFrom": [
      "src/**/*.{js,jsx}",
      "!<rootDir>/node_modules/",
      "!<rootDir>/path/to/dir/"
    ],
    "coverageThreshold": {
      "global": {
        "branches": 90,
        "functions": 90,
        "lines": 90,
        "statements": 90
      }
    },
    "coverageReporters": ["text"],
    "snapshotSerializers": ["my-serializer-module"]
  }
}

Непрерывная интеграция

По умолчанию npm test запускает наблюдатель с интерактивным интерфейсом командной строки. Однако вы можете заставить его запустить тесты один раз и завершить процесс, установив переменную среды с именем CI.

При создании сборки вашего приложения с помощью npm run build предупреждения линтера по умолчанию не проверяются. Как и npm test, вы можете принудительно выполнить проверку предупреждений линтера при сборке, установив для переменной среды значение CI. Если возникнут какие-либо предупреждения, сборка завершится неудачно.

Популярные серверы непрерывной интеграции уже устанавливают переменную окружения CI по умолчанию, но вы также можете сделать это самостоятельно:

На серверах непрерывной интеграции

Travis CI

  1. Следуйте руководству Travis Getting started для синхронизации вашего репозитория GitHub с Travis. Возможно, вам потребуется вручную инициализировать некоторые настройки на странице профиля.
  2. Добавьте файл .travis.yml в свой git-репозиторий.
language: node_js
node_js:
  - 6
cache:
  directories:
    - node_modules
script:
  - npm run build
  - npm test
  1. Запустите свою первую сборку с помощью git push.
  2. Настройте сборку Travis CI, если это необходимо.

CircleCI

Следуйте этой статье, чтобы настроить CircleCI с проектом Create React App.

В вашей собственной среде

Windows (cmd.exe)
set CI=true&&npm test
set CI=true&&npm run build

(Обратите внимание: отсутствие пробелов является преднамеренным.)

Windows (Powershell)
($env:CI = $true) -and (npm test)
($env:CI = $true) -and (npm run build)
Linux, macOS (Bash)
CI=true npm test
CI=true npm run build

Команда test заставит Jest запустить тесты один раз вместо запуска наблюдателя.

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

Команда build проверит наличие предупреждений линтера и завершится неудачно, если они будут обнаружены.

Отключение jsdom

По умолчанию файл package.json сгенерированного проекта выглядит следующим образом:

  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom"

Если вы знаете, что ни один из ваших тестов не зависит от jsdom, вы можете безопасно удалить --env=jsdom, и ваши тесты будут выполняться быстрее:

  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
-   "test": "react-scripts test --env=jsdom"
+   "test": Реакт-скрипты тест

Чтобы помочь вам принять решение, вот список API, которым **нужен jsdom**:
* Любые глобальные переменные браузера, такие как `window` и `document`.
* [`ReactDOM.render()`](https://facebook.github.io/react/docs/top-level-api.html#reactdom.render).
* [`TestUtils.renderIntoDocument()`](https://facebook.github.io/react/docs/test-utils.html#renderintodocument) ([ярлык](https://github.com/facebook/react/blob/34761cf9a252964abfaab6faf74d473ad95d1f21/src/test/ReactTestUtils.js#L83-L91) для предыдущего).
* [`mount()`](http://airbnb.io/enzyme/docs/api/mount.html) в [Enzyme](http://airbnb.io/enzyme/index.html).

В отличие от этого, **jsdom не нужен** для следующих API:
* [`TestUtils.createRenderer()`](https://facebook.github.io/react/docs/test-utils.html#shallow-rendering) (мелкозернистый рендеринг).
* [`shallow()`](http://airbnb.io/enzyme/docs/api/shallow.html) в [Enzyme](http://airbnb.io/enzyme/index.html).

Наконец, jsdom также не требуется для [тестирования снимков](http://facebook.github.io/jest/blog/2016/07/27/jest-14.html).

### Тестирование снимков

Тестирование снимков — это функция Jest, которая автоматически генерирует текстовые снимки ваших компонентов и сохраняет их на диске, чтобы при изменении вывода пользовательского интерфейса вы получали уведомление без ручного написания каких-либо утверждений о выводе компонента. [Подробнее о тестировании снимков.](http://facebook.github.io/jest/blog/2016/07/27/jest-14.html)

### Интеграция с редактором

Если вы используете [Visual Studio Code](https://code.visualstudio.com), существует [расширение Jest](https://github.com/orta/vscode-jest), которое работает с Create React App «из коробки». Это предоставляет множество функций, подобных IDE, при использовании текстового редактора: отображение статуса тестового запуска с потенциальными сообщениями об ошибках в строке, автоматический запуск и остановка наблюдателя, а также предложение обновлений моментальных снимков одним щелчком мыши.

## Отладка тестов

Существуют различные способы настройки отладчика для ваших тестов Jest. Мы рассмотрим отладку в Chrome и [Visual Studio Code](https://code.visualstudio.com/).

>Примечание: для отладки тестов требуется Node 8 или выше.

### Отладка тестов в Chrome

Добавьте следующее в раздел `scripts` вашего проекта `package.json`:
```json
"scripts": {
    "test:debug": "react-scripts --inspect-brk test --runInBand --env=jsdom"
  }

Поместите операторы debugger; в любой тест и запустите:

$ npm run test:debug

Это запустит выполнение ваших тестов Jest, но приостановит перед выполнением, чтобы позволить отладчику подключиться к процессу.

Откройте следующее в Chrome:

about:inspect

После открытия этой ссылки будут отображены инструменты разработчика Chrome. Выберите inspect в вашем процессе, и точка останова будет установлена на первой строке скрипта реакции (это делается просто для того, чтобы дать вам время открыть инструменты разработчика и предотвратить выполнение Jest до того, как у вас появится такая возможность). Нажмите кнопку, которая выглядит как кнопка «воспроизведение» в правом верхнем углу экрана, чтобы продолжить выполнение. Когда Jest выполнит тест, содержащий оператор отладчика, выполнение остановится, и вы сможете изучить текущую область видимости и стек вызовов.

Примечание: опция cli --runInBand гарантирует, что Jest запускает тесты в одном и том же процессе, а не порождает процессы для отдельных тестов. Обычно Jest распараллеливает выполнение тестов между процессами, но трудно отлаживать много процессов одновременно.

Отладка тестов в Visual Studio Code

Отладка тестов Jest поддерживается «из коробки» для Visual Studio Code.

Используйте следующий файл конфигурации launch.json:

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Debug CRA Tests",
      "type": "node",
      "request": "launch",
      "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/react-scripts",      
      "args": [
        "test",
        "--runInBand",
        "--no-cache",
        "--env=jsdom"
      ],
      "cwd": "${workspaceRoot}", ## Разработка компонентов по отдельности

Обычно в приложении есть множество UI-компонентов, и каждый из них имеет много разных состояний.
Например, простой компонент кнопки может иметь следующие состояния:

* В обычном состоянии с текстовой меткой.
* В отключённом режиме.
* В состоянии загрузки.

Обычно трудно увидеть эти состояния без запуска примера приложения или некоторых примеров.

Create React App не включает никаких инструментов для этого по умолчанию, но вы можете легко добавить Storybook for React ([источник](https://github.com/storybooks/storybook)) или React Styleguidist ([источник](https://github.com/styleguidist/react-styleguidist)) в свой проект. **Это сторонние инструменты, которые позволяют разрабатывать компоненты и видеть все их состояния отдельно от вашего приложения**.

![Демонстрация Storybook for React](http://i.imgur.com/7CIAWpB.gif)

Вы также можете развернуть свой Storybook или руководство по стилю как статическое приложение. Таким образом, каждый член вашей команды сможет просматривать и проверять различные состояния компонентов пользовательского интерфейса, не запуская серверную часть или создавая учётную запись в вашем приложении.

### Начало работы с Storybook

Storybook — это среда разработки для компонентов пользовательского интерфейса React. Она позволяет просматривать библиотеку компонентов, просматривать разные состояния каждого компонента и интерактивно разрабатывать и тестировать компоненты.

Сначала установите следующий пакет npm глобально:

```sh
npm install -g @storybook/cli

Затем выполните следующую команду в каталоге вашего приложения:

getstorybook

После этого следуйте инструкциям на экране.

Узнайте больше о React Storybook:

Начало работы со Styleguidist

Styleguidist объединяет руководство по стилю, где все ваши компоненты представлены на одной странице с документацией по реквизитам и примерами использования, со средой для разработки компонентов по отдельности, похожей на Storybook. В Styleguidist вы пишете примеры в Markdown, где каждый фрагмент кода отображается как живая редактируемая игровая площадка.

Сначала установите Styleguidist:

npm install --save react-styleguidist

В качестве альтернативы вы можете использовать yarn:

yarn add react-styleguidist

Затем добавьте эти скрипты в ваш package.json:

   "scripts": {
+    "styleguide": "styleguidist server",
+    "styleguide:build": "styleguidist build",
     "start": "react-scripts start",

Затем выполните следующую команду в каталоге вашего приложения:

npm run styleguide

После этого следуйте инструкциям на экране.

Узнайте больше о React Styleguidist:

Публикация компонентов в npm

Create React App не предоставляет встроенной функциональности для публикации компонента в npm. Если вы готовы извлечь компонент из своего проекта, чтобы другие люди могли его использовать, мы рекомендуем переместить его в отдельный каталог вне вашего проекта, а затем использовать такой инструмент, как nwb (источник), чтобы подготовить его к публикации.

Создание прогрессивного веб-приложения

По умолчанию производственная сборка представляет собой полнофункциональное автономное прогрессивное веб-приложение (PWA).

Прогрессивные веб-приложения работают быстрее и надёжнее, чем традиционные веб-страницы, и обеспечивают привлекательный мобильный опыт:

  • Все статические ресурсы сайта кэшируются, поэтому ваша страница загружается быстро при последующих посещениях независимо от подключения к сети (например, 2G или 3G). Обновления загружаются в фоновом режиме.
  • Ваше приложение... Приложение будет работать независимо от состояния сети, даже в автономном режиме. Это значит, что ваши пользователи смогут использовать приложение на высоте 10 000 футов и в метро.

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

Плагин sw-precache-webpack-plugin интегрирован в производственную конфигурацию и позаботится о создании файла сервисного работника, который автоматически предварительно кэширует все ваши локальные активы и обновляет их при развёртывании обновлений. Сервисный работник будет использовать стратегию «кэш в первую очередь» для обработки всех запросов к локальным активам, включая начальный HTML, обеспечивая надёжную скорость работы вашего веб-приложения даже в медленной или ненадёжной сети.

Отказ от кэширования

Если вы предпочитаете не включать сервисных работников перед первоначальным развёртыванием в продакшн, удалите вызов registerServiceWorker() из src/index.js.

Если ранее вы включили сервисных работников в своём продакшне и решили отключить их для всех существующих пользователей, вы можете заменить вызов registerServiceWorker() в src/index.js, сначала изменив импорт сервисного работника:

import { unregister } from './registerServiceWorker';

а затем вызвать unregister() вместо этого. После того как пользователь посетит страницу с unregister(), сервисный работник будет удалён. Обратите внимание, что в зависимости от того, как обслуживается /service-worker.js, может потребоваться до 24 часов для аннулирования кеша.

Рассмотрение работы в офлайн-режиме

  1. Сервисные работники требуют HTTPS, хотя для облегчения локального тестирования эта политика не применяется к localhost. Если ваш производственный веб-сервер не поддерживает HTTPS, регистрация сервисного работника завершится неудачно, но остальная часть вашего веб-приложения останется функциональной.

  2. Сервисные работники в настоящее время не поддерживаются во всех веб-браузерах. Регистрация сервисного работника не будет предпринята в браузерах, которые не поддерживают эту функцию.

  3. Сервисный работник включается только в производственной среде, например, в результате выполнения команды npm run build. Рекомендуется не включать автономного первого сервисного работника в среде разработки, так как это может привести к разочарованию, когда ранее кэшированные активы используются и не включают последние изменения, внесённые вами локально.

  4. Если вам необходимо протестировать своего автономного первого сервисного работника локально, соберите приложение (используя npm run build) и запустите простой HTTP-сервер из каталога сборки. После запуска скрипта сборки create-react-app даст инструкции по одному способу тестирования вашей рабочей сборки локально, а инструкции по развёртыванию содержат инструкции по использованию других методов. Обязательно всегда используйте окно инкогнито, чтобы избежать проблем с кэшем браузера.

  5. При возможности настройте свою производственную среду так, чтобы сгенерированный файл service-worker.js обслуживался без HTTP-кэширования. Если это невозможно — например, GitHub Pages не позволяет вам изменить стандартное время жизни HTTP-кеша в 10 минут — то имейте в виду, что если вы посетите свой рабочий сайт, а затем снова посетите его до истечения срока действия service-worker.js из вашего HTTP-кэша, вы будете продолжать получать ранее кэшированные ресурсы от сервисного работника. Если у вас есть немедленная потребность просмотреть обновлённое рабочее развёртывание, выполнение сдвига-обновления временно отключит сервисный работник. Сервис воркер и получение всех активов из сети

  6. Пользователи не всегда знакомы с веб-приложениями, ориентированными на работу в офлайн-режиме. Может быть полезно дать пользователю знать, когда сервисный работник заполнил кэш (показывая сообщение «Это веб-приложение работает в автономном режиме!»), а также сообщить ему, когда сервисный работник получил последние обновления, которые будут доступны при следующей загрузке страницы (показывая сообщение «Доступен новый контент; обновите страницу»). Показ этих сообщений сейчас оставлен на усмотрение разработчика, но в качестве отправной точки вы можете использовать логику, включенную в src/registerServiceWorker.js, которая демонстрирует, какие события жизненного цикла сервисного работника нужно отслеживать для обнаружения каждого сценария, и которая по умолчанию просто регистрирует соответствующие сообщения в консоли JavaScript.

  7. По умолчанию сгенерированный файл сервисного работника не будет перехватывать или кэшировать любой междоменный трафик, такой как HTTP-запросы API (#интеграция с серверной частью API), изображения или вставки, загруженные с другого домена. Если вы хотите использовать стратегию кэширования во время выполнения для этих запросов, вы можете выполнить eject (#npm run eject), а затем настроить опцию runtimeCaching в разделе SWPrecacheWebpackPlugin файла webpack.config.prod.js.

Метаданные прогрессивного веб-приложения

Конфигурация по умолчанию включает манифест веб-приложения, расположенный в public/manifest.json, который можно настроить с учётом особенностей вашего веб-приложения. Когда пользователь добавляет веб-приложение на свой домашний экран с помощью Chrome или Firefox на Android, метаданные в manifest.json определяют, какие значки, имена и цвета брендинга использовать при отображении веб-приложения. Руководство по манифесту веб-приложений предоставляет больше информации о том, что означает каждое поле, и о том, как ваши настройки повлияют на опыт ваших пользователей.

Анализ размера пакета

Source map explorer анализирует пакеты JavaScript с использованием исходных карт. Это помогает вам понять, откуда происходит раздувание кода.

Чтобы добавить Source map explorer в проект Create React App, выполните следующие действия:

npm install --save source-map-explorer

Или вы можете использовать yarn:

yarn add source-map-explorer

Затем в package.json добавьте следующую строку в scripts:

   "scripts": {
+    "analyze": "source-map-explorer build/static/js/main.*",
     "start": "react-scripts start",
     "build": "react-scripts build",
     "test": "react-scripts test --env=jsdom",

Затем, чтобы проанализировать пакет, запустите производственную сборку, а затем запустите скрипт анализа.

npm run build
npm run analyze

Развёртывание

npm run build создаёт каталог build с рабочей версией вашего приложения. Настройте ваш любимый HTTP-сервер так, чтобы посетитель вашего сайта получал index.html, а запросы к статическим путям, таким как /static/js/main.<hash>.js, обслуживались содержимым файла /static/js/main.<hash>.js.

Статический сервер

Для сред, использующих Node, самый простой способ справиться с этим — установить serve и позволить ему обрабатывать остальное:

npm install -g serve
serve -s build

Последняя команда, показанная выше, будет обслуживать ваш статический сайт на порту 5000. Как и многие внутренние настройки serve, порт можно изменить с помощью флагов -p или --port.

Выполните эту команду, чтобы получить полный список доступных опций:

serve -h

Другие решения

Вам не обязательно нужен статический сервер для запуска проекта Create React App в рабочей среде. Он отлично работает и интегрирован в существующий динамический.

Вот программный пример использования... ### Node и Express:

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

app.use(express.static(path.join(__dirname, 'build')));

app.get('/', function (req, res) {
  res.sendFile(path.join(__dirname, 'build', 'index.html'));
});

app.listen(9000);

Выбор серверного программного обеспечения также не важен. Поскольку Create React App полностью независим от платформы, нет необходимости явно использовать Node.

Папка build со статическими активами — это единственный результат, создаваемый Create React App.

Однако этого недостаточно, если вы используете маршрутизацию на стороне клиента. Прочитайте следующий раздел, если хотите поддерживать URL-адреса типа /todos/42 в своём одностраничном приложении.

Обслуживание приложений с маршрутизацией на стороне клиента

Если вы используете маршрутизаторы, которые используют HTML5 API истории pushState (например, React Router с browserHistory), многие серверы статических файлов будут работать некорректно. Например, если вы использовали React Router с маршрутом для /todos/42, сервер разработки будет правильно отвечать на localhost:3000/todos/42, но Express, обслуживающий производственную сборку, как указано выше, не будет.

Это связано с тем, что при новой загрузке страницы для /todos/42 сервер ищет файл build/todos/42 и не находит его. Сервер необходимо настроить так, чтобы он отвечал на запрос к /todos/42, обслуживая index.html. Например, мы можем изменить наш пример Express, чтобы обслуживать index.html для любых неизвестных путей:

 app.use(express.static(path.join(__dirname, 'build')));

-app.get('/', function (req, res) {
+app.get('/*', function (req, res) {
   res.sendFile(path.join(__dirname, 'build', 'index.html'));
 });

Если вы используете Apache HTTP Server, вам нужно создать файл .htaccess в папке public, который выглядит следующим образом:

    Options -MultiViews
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.html [QSA,L]

Он будет скопирован в папку build, когда вы запустите npm run build.

Если вы используете Apache Tomcat, следуйте этому ответу Stack Overflow.

Теперь запросы к /todos/42 будут обрабатываться корректно как в разработке, так и в продакшене.

В производственной сборке и в браузере, поддерживающем сервис-воркеры, сервис-воркер автоматически обработает все навигационные запросы, например, для /todos/42, путём обслуживания кэшированной копии вашего index.html. Эту навигационную маршрутизацию сервис-воркера можно настроить или отключить с помощью ejectа и последующего изменения параметров navigateFallback и navigateFallbackWhitelist конфигурации плагина SWPreachePlugin конфигурации.

Когда пользователи установят ваше приложение на домашний экран своего устройства, по умолчанию конфигурация создаст ярлык для /index.html. Это может не работать для маршрутизаторов на стороне клиента, которые ожидают, что приложение будет обслуживаться из /. Измените веб-приложение манифеста в public/manifest.json и измените start_url, чтобы он соответствовал требуемой схеме URL, например:

  "start_url": ".",

Сборка для относительных путей

По умолчанию Create React App создаёт сборку, предполагая, что ваше приложение размещено в корне сервера. Чтобы переопределить это, укажите homepage в вашем package.json, например:

  "homepage": "http://mywebsite.com/relativepath",

Это позволит Create React App правильно определить корневой путь, который будет использоваться в сгенерированном HTML-файле.

Примечание: Если вы используете react-router@^4, вы можете задать корень <Link> с помощью свойства basename на любом <Router>. Подробнее. Для загрузки... Загрузка: [============================== ] 75%✔ хостинг: папка сборки успешно загружена ✔ хостинг: 8 файлов успешно загружены я начинаю процесс выпуска (это может занять несколько минут)...

✔  развёртывание завершено!

Консоль проекта: https://console.firebase.google.com/project/example-app-fd690/overview
Хостинг URL: https://example-app-fd690.firebaseapp.com

Для получения дополнительной информации см. «Добавление Firebase в ваш проект JavaScript» (https://firebase.google.com/docs/web/setup).

### GitHub Pages (https://pages.github.com/)

>Примечание: эта функция доступна с `react-scripts@0.2.0` и выше.

#### Шаг 1: Добавьте `homepage` в `package.json`

**Следующий шаг важен!**<br>
**Если вы его пропустите, ваше приложение будет развёрнуто неправильно.**

Откройте свой `package.json` и добавьте поле `homepage` для своего проекта:

```json
  "homepage": "https://myusername.github.io/my-app",

или для страницы пользователя GitHub:

  "homepage": "https://myusername.github.io",

Create React App использует поле homepage, чтобы определить корневой URL в созданном HTML-файле.

Шаг 2: Установите gh-pages и добавьте deploy к scripts в package.json

Теперь, когда вы запускаете npm run build, вы увидите шпаргалку с инструкциями по развёртыванию на GitHub Pages.

Чтобы опубликовать его по адресу https://myusername.github.io/my-app, запустите:

npm install --save gh-pages

Альтернативно вы можете использовать yarn:

yarn add gh-pages

Добавьте следующие скрипты в свой package.json:

  "scripts": {
+   "predeploy": "npm run build",
+   "deploy": "gh-pages -d build",
    "start": "react-scripts start",
    "build": "react-scripts build",

Скрипт predeploy будет автоматически запускаться перед запуском deploy.

Если вы развёртываете страницу пользователя вместо страницы проекта, вам потребуется внести два дополнительных изменения:

  1. Сначала измените исходную ветку вашего репозитория на любую ветку, кроме master.
  2. Кроме того, настройте свои скрипты package.json, чтобы отправлять развёртывания в master:
  "scripts": {
    "predeploy": "npm run build",
-   "deploy": "gh-pages -d build",
+   "deploy": "gh-pages -b master -d build",

Шаг 3: Разверните сайт, запустив npm run deploy

Затем запустите:

npm run deploy

Шаг 4: Убедитесь, что настройки вашего проекта используют gh-pages

Наконец, убедитесь, что в настройках вашего проекта GitHub установлен флажок «GitHub Pages», чтобы использовать ветку gh-pages:

gh-pages branch setting

Шаг 5: Дополнительно настройте домен

Вы можете настроить собственный домен с помощью GitHub Pages, добавив файл CNAME в папку public/.

Примечания о клиентской маршрутизации

GitHub Pages не поддерживает маршрутизаторы, которые используют HTML5 pushState history API под капотом (например, React Router с использованием browserHistory). Это связано с тем, что при новой загрузке страницы по URL-адресу вроде http://user.github.io/todomvc/todos/42, где /todos/42 — это внешний маршрут, сервер GitHub Pages возвращает 404, поскольку он ничего не знает о /todos/42. Если вы хотите добавить маршрутизатор в проект, размещённый на GitHub Pages, вот несколько решений:

  • Вы можете переключиться с использования HTML5 history API на маршрутизацию с хэшами. Если вы используете React Router, вы можете перейти на hashHistory для этого эффекта, но URL будет длиннее и более подробным (например, http://user.github.io/todomvc/#/todos/42?_k=yknaj). Подробнее о различных реализациях истории в React Router.
  • В качестве альтернативы вы можете использовать трюк, чтобы научить GitHub Pages обрабатывать 404 путём перенаправления на вашу страницу index.html со специальным параметром перенаправления. Вам нужно будет добавить файл 404.html с кодом перенаправления в папку build перед развёртыванием вашего проекта, и вам нужно будет добавить код обработки параметра перенаправления в index.html. Подробное объяснение этой техники вы можете найти в этом руководстве (https://github.com/rafrex/spa-github-pages). Устранение неполадок

/dev/tty: No such a device or address

Если при развёртывании вы получаете сообщение /dev/tty: No such a device or address или аналогичную ошибку, попробуйте следующее:

  1. Создайте новый персональный токен доступа (Personal Access Token).
  2. Выполните команду git remote set-url origin https://:@github.com//.
  3. Попробуйте снова выполнить npm run deploy.

Heroku Используйте Heroku Buildpack для Create React App. Инструкции можно найти в статье «Deploying React with Zero Configuration».

Устранение ошибок при развёртывании на Heroku Иногда npm run build работает локально, но не удаётся во время развёртывания через Heroku. Вот наиболее распространённые случаи.

«Module not found: Error: Cannot resolve 'file' or 'directory'»

Если вы видите что-то вроде этого:

remote: Failed to create a production build. Reason:
remote: Module not found: Error: Cannot resolve 'file' or 'directory'
MyDirectory in /tmp/build_1234/src

Это означает, что вам нужно убедиться, что регистр файла или каталога, который вы импортируете, совпадает с тем, который вы видите в вашей файловой системе или на GitHub. Это важно, потому что Linux (операционная система, используемая Heroku) чувствителен к регистру. Поэтому MyDirectory и mydirectory — это два разных каталога, и, хотя проект собирается локально, разница в регистре нарушает операторы импорта на удалённых серверах Heroku.

«Не удалось найти необходимый файл»

Если исключить или проигнорировать необходимые файлы из пакета, вы увидите ошибку, подобную этой:

remote: Could not find a required file.
remote:   Name: `index.html`
remote:   Searched in: /tmp/build_a2875fc163b209225122d68916f1d4df/public
remote:
remote: npm ERR! Linux 3.13.0-105-generic
remote: npm ERR! argv "/tmp/build_a2875fc163b209225122d68916f1d4df/.heroku/node/bin/node" "/tmp/build_a2875fc163b209225122d68916f1d4df/.heroku/node/bin/npm" "run" "build"

В этом случае убедитесь, что файл существует с правильным регистром и не игнорируется в вашем локальном .gitignore или ~/.gitignore_global.

Netlify Чтобы выполнить ручное развёртывание на CDN Netlify, выполните следующие действия:

npm install netlify-cli -g
netlify deploy

Выберите build в качестве пути для развёртывания.

Чтобы настроить непрерывную доставку: С этой настройкой Netlify будет собирать и развёртывать, когда вы отправляете изменения в Git или открываете запрос на вытягивание:

  1. Начните новый проект Netlify.
  2. Выберите свой хостинг Git и выберите свой репозиторий.
  3. Установите yarn build в качестве команды сборки и build в качестве каталога публикации.
  4. Нажмите Deploy site.

Поддержка клиентской маршрутизации: Чтобы поддерживать pushState, создайте файл public/_redirects со следующими правилами перезаписи:

/*  /index.html  200

Когда вы собираете проект, Create React App поместит содержимое папки public в выходные данные сборки.

Now Now предлагает развёртывание с нулевой конфигурацией и одной командой. Вы можете использовать now для бесплатного развёртывания своего приложения.

  1. Установите инструмент командной строки now либо через рекомендуемый настольный инструмент, либо через node с помощью npm install -g now.

  2. Соберите приложение, выполнив npm run build.

  3. Перейдите в каталог сборки, выполнив cd build.

  4. Запустите now --name your-project-name из каталога сборки. В выводе вы увидите URL now.sh, например:

    > Ready! https://your-project-name-tpspyhtdtk.now.sh (copied to clipboard)

Вставьте этот URL в браузер после завершения сборки, и вы увидите развёрнутое приложение. Подробности доступны в этой статье.

S3 и CloudFront См. этот блог о том, как развернуть ваше React-приложение на Amazon Web Services S3 и CloudFront.

Surge Установите Surge CLI, если... Вы ещё не сделали этого, запустив npm install -g surge. Запустите команду surge и войдите в систему или создайте новую учетную запись.

Когда вас спросят о пути к проекту, обязательно укажите папку build, например:

project path: /path/to/project/build

Обратите внимание, что для поддержки маршрутизаторов, использующих API HTML5 pushState, вы можете захотеть переименовать index.html в папке сборки в 200.html, прежде чем развертывать его в Surge. Это гарантирует, что каждый URL будет возвращаться к этому файлу.

Расширенная конфигурация

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

Переменная Разработка Производство Использование
BROWSER :white_check_mark: :x: По умолчанию Create React App откроет браузер по умолчанию, отдавая предпочтение Chrome на macOS. Укажите браузер, чтобы переопределить это поведение, или установите значение none, чтобы полностью отключить его. Если вам нужно настроить способ запуска браузера, вы можете указать сценарий узла вместо этого. Любые аргументы, переданные в npm start, также будут переданы этому сценарию, а URL-адрес, где обслуживается ваше приложение, будет последним аргументом. Имя файла вашего скрипта должно иметь расширение .js.
HOST :white_check_mark: :x: По умолчанию веб-сервер разработки привязывается к localhost. Вы можете использовать эту переменную, чтобы указать другой хост.
PORT :white_check_mark: :x: По умолчанию сервер разработки попытается прослушать порт 3000 или предложит вам попробовать следующий доступный порт. Вы можете использовать эту переменную для указания другого порта.
HTTPS :white_check_mark: :x: Когда установлено значение true, Create React App будет запускать сервер разработки в режиме https.
PUBLIC_URL :x: :white_check_mark: Create React App предполагает, что ваше приложение размещено в корне сервера хостинга или в подпути, как указано в package.json (homepage). Обычно Create React App игнорирует имя хоста. Вы можете использовать эту переменную, чтобы заставить ресурсы ссылаться на предоставленный вами URL (включая имя хоста). Это может быть особенно полезно при использовании CDN для размещения вашего приложения.
CI :large_orange_diamond: :white_check_mark: При значении true Create React App обрабатывает предупреждения как сбои в сборке. Он также делает тестовый бегун не следящим. Большинство CI устанавливают этот флаг по умолчанию.
REACT_EDITOR :white_check_mark: :x: Когда приложение аварийно завершает работу в процессе разработки, вы увидите ошибку с интерактивным стеком вызовов. Когда вы нажимаете на него, Create React App попытается определить редактор, который вы используете, на основе текущих запущенных процессов, и откроет соответствующий исходный файл. Вы можете отправить запрос на извлечение, чтобы обнаружить выбранный вами редактор. Установка этой переменной среды переопределяет автоматическое обнаружение. Если вы это сделаете, убедитесь, что ваша системная переменная PATH указывает на папку bin вашего редактора. Вы также можете установить для неё значение none, чтобы полностью её отключить.
CHOKIDAR_USEPOLLING :white_check_mark: :x: При установке значения true наблюдатель работает в режиме опроса, если это необходимо внутри виртуальной машины. Используйте эту опцию, если npm start не обнаруживает изменения.
GENERATE_SOURCEMAP :x: :white_check_mark: Если установлено значение false, исходные карты не создаются для производственной сборки. Это решает проблемы OOM на некоторых небольших машинах.
NODE_PATH :white_check_mark: :white_check_mark: То же, что и NODE_PATH в Node.js, но разрешены только относительные папки. Может пригодиться для эмуляции настройки монорепозитория путём установки NODE_PATH=src.

Устранение неполадок

npm start не определяет изменения

Если вы сохраняете файл во время работы npm start, браузер должен обновиться с обновлённым кодом.
Если этого не происходит, попробуйте один из следующих способов устранения неполадок: Вам нужно импортировать его явно.

Например:

import moment from 'moment';
import 'moment/locale/fr';

Если вы импортируете несколько локалей таким образом, вы можете позже переключаться между ними, вызывая moment.locale() с именем локали:

import moment from 'moment';
import 'moment/locale/fr';
import 'moment/locale/es';

// ...

moment.locale('fr');

Это будет работать только для локалей, которые были явно импортированы ранее.

Не удаётся минимизировать npm run build

Некоторые сторонние пакеты не компилируют свой код в ES5 перед публикацией в npm. Это часто вызывает проблемы в экосистеме, потому что ни браузеры (за исключением большинства современных версий), ни некоторые инструменты в настоящее время не поддерживают все функции ES6. Мы рекомендуем публиковать код на npm как ES5 по крайней мере ещё несколько лет.

Чтобы решить эту проблему:

  1. Откройте вопрос в системе отслеживания проблем зависимости и попросите, чтобы пакет был опубликован предварительно скомпилированным.
  • Примечание: Create React App может использовать модули CommonJS и ES. Для совместимости с Node.js рекомендуется, чтобы основная точка входа была CommonJS. Однако они могут дополнительно предоставить точку входа модуля ES с полем module в package.json. Обратите внимание, что даже если библиотека предоставляет версию модулей ES, она всё равно должна предварительно компилировать другие функции ES6 в ES5, если она намерена поддерживать старые браузеры.
  1. Создайте форк пакета и опубликуйте исправленную версию самостоятельно.
  2. Если зависимость достаточно мала, скопируйте её в папку src/ и рассматривайте её как код приложения.

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

Альтернативы извлечению

Извлечение (#npm run eject) позволяет настроить что угодно, но с этого момента вы должны поддерживать конфигурацию и скрипты самостоятельно. Это может быть сложно, если у вас много похожих проектов. В таких случаях вместо извлечения мы рекомендуем форкнуть react-scripts и любые другие необходимые вам пакеты. Эта статья подробно рассказывает, как это сделать. Вы можете найти больше обсуждений в этой проблеме.

Что-то отсутствует?

Если у вас есть идеи для других рецептов «Как сделать», которые должны быть на этой странице, дайте нам знать или внесите свой вклад!

Комментарий ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://gitlife.ru/oschina-mirror/bwcs-crowFunding-eth.git
git@gitlife.ru:oschina-mirror/bwcs-crowFunding-eth.git
oschina-mirror
bwcs-crowFunding-eth
bwcs-crowFunding-eth
master