# Подробнее о 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>
```