# Подробнее о react-create-app ## Поддержка браузеров Все современные браузеры Для IE требуется подключение полифиллов Пример полифилла: ```javascript if (typeof Array.prototype.includesX !== 'function') { Array.prototype.includesX = function(x) { return this.indexOf(x) !== -1; } } ``` ## Поддержка технологий - Оператор возведения в степень (ES2016). ```javascript 3 ** 2; // 9 ```` - Async/await (ES2017). ```javascript async function run() { const response = await fetch('https://api.sample.com'); const json = await response.json(); return json; } ```` вместо ```javascript function run() { return fetch('https://api.sample.com') .then(response => response.json()); } ``` ```javascript const delay = ms => new Promise(resolve => setTimeout(resolve, ms)); const run = async () => { console.log('Hello'); await delay(3000); console.log('World'); await delay(6000); console.log('End!'); } run(); ``` - Object Rest/Spread Properties (ES2018). ```javascript const destructuring = () => { const person = { name: 'Ivan', age: 43, childrenCount: 3, parents: ['Olga', 'Igor'] }; const { name, age, ...restData } = person; console.log(restData); console.log('name: ' + name); console.log('age: ' + age); const newPerson = { name: 'Oleg', age: 15, ...restData }; console.log(newPerson); } destructuring(); ``` - Dynamic import() (stage 4 proposal) ```javascript const run = async () => { import('./delay.js') .then(() => console.log('loaded')); } run(); ``` - Статические свойства классов (part of stage 3 proposal). ```javascript class App { static URL = 'http://localhost'; static PORT = 3000; } App.URL ```` - JSX, Flow and TypeScript ## Структура папок ``` 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 ``` - node_modules - стандартная папка установки node пакетов - public - папка для статических файлов и тех, что не требуют обработки - src - исходные файлы проекта ## Как устроен, что внутри - пакет react-scripts - Настроенные копмпоненты CRA + Webpack + Настроенные loader'ы + babel ## Работа со стилями + Препроцессоры - SASS требует только установленного пакета sass, остальное настроено + CSS-модули. Позволяют изолировать селекторы в рамках частей проекта. + @import-normalize в .css, .sass подключает библиотеку [normalize.css](https://necolas.github.io/normalize.css/) + Post CSS - включает постобработку CSS для внедрения доп возможностей или обратной совместимости ## Изображения, файлы, фото Поддерживается стандартная работа import, как в Webpack ```javascript import React from 'react'; import ReactDOM from 'react-dom/client'; import './index.css'; import App from './App'; import reportWebVitals from './reportWebVitals'; ``` ## Папка public - Хранит результаты сборки - Используется для постоянных имён - Возможность хранить файлы без предварительной-обработки ## Работа с зависимостями Разберём пример с [classnames](https://www.npmjs.com/package/classnames). Библиотека позволяет удобно работать с динамически меняющимися классами ```bash # via npm npm install --save classnames # or Yarn (note that it will automatically save the package to your `dependencies` in `package.json`) yarn add classnames ``` далее в коде: ```jsx // подключение import C from 'classnames'; // в функции <div className={C(modules.hello, 'container')}> ``` https://create-react-app.dev/docs/installing-a-dependency ## .env Файл для удобного хранения переменных окружения на конкретном компьютере Переменная задаётся с префиксом `REACT_APP_`, например: ```.env REACT_APP_BOBIK=WTF ``` Для извлечения значения в js коде пишут: ```javascript <h1 className='title'>Pokemon List {process.env.REACT_APP_BOBIK}</h1> ```