React: дорога к просветлению
Екатерина Лизогубова, AltexSoft
vs
Есть три вида лжи:
ложь, наглая ложь и статистика
(с) Марк Твен
0
1
2
3
4
5
fwdays'14 fwdays'15 a&rdays'15 fwdays'16 mostjs'16 fwdays'16 fwdays'17
0
1
2
3
4
5
fwdays'14 fwdays'15 a&rdays'15 fwdays'16 mostjs'16 fwdays'16 fwdays'17
0
1
2
3
4
5
0
1
2
3
4
5
0
1
2
3
4
5
Появление
технологии
Пик завышенных
ожиданий
Ущелье
разочарования
Плато
продуктивности
Цикл хайпа
0
1
2
3
4
5
Появление
технологии
Пик завышенных
ожиданий
Ущелье
разочарования
Плато
продуктивности
Мы здесь
Библиотека
Компонент
Virtual
DOM
State
props
React 16
* React.Fragment
* Portals
* Error Boundaries
* Fibers
“to fall into the
pit of success”
Context API
const ThemeContext = React.createContext('light');
const ThemeContext = React.createContext('light');
class ThemeProvider extends React.Component {
state = { theme: 'light’ };
render() {
return (
<ThemeContext.Provider value={this.state.theme}>
{this.props.children}
</ThemeContext.Provider>
);
}
}
const ThemeContext = React.createContext('light’);
class ThemeProvider extends React.Component {
…
}
const App = () => (
<ThemeProvider>
<ThemeContext.Consumer>
{val => <div>{val}</div>}
</ThemeContext.Consumer>
</ThemeProvider>
);
const ThemeContext = React.createContext('light’);
class ThemeProvider extends React.Component {
…
}
const App = () => (
<ThemeProvider>
<ThemeContext.Consumer>
{val => <div>{val}</div>}
</ThemeContext.Consumer>
</ThemeProvider>
);
Инициализация Монтирование
Конструктор сomponentWillMount
render
Размонтирование
сomponentDidMount
componentWillUnmount
render
сomponentDidUpdate
Обновление
сomponentWillReceiveProps
shouldComponentUpdate
×
сomponentWillUpdate
Инициализация Монтирование
Конструктор
render
Размонтирование
сomponentDidMount
componentWillUnmount
render
сomponentDidUpdate
Обновление
сomponentWillReceiveProps
shouldComponentUpdate
×
сomponentWillReceiveProps
static
getDerivedStateFromProps
StrictMode
const App = () => (
<StrictMode>
<Header />
<Content />
</StrictMode>
);
AsyncMode
const AsyncComponent = React.unstable_AsyncComponent;
const App = () => (
<AsyncComponent>
<Header />
<Content />
</AsyncComponent>
);
Экосистема
0
500000
1000000
1500000
2000000
2500000
3000000
3500000
4000000
4500000
5000000
Redux
0
100000
200000
300000
400000
500000
600000
700000
800000
Δ Redux
0
100000
200000
300000
400000
500000
600000
700000
800000
Δ Redux
0
100000
200000
300000
400000
500000
600000
700000
800000
?
Δ Redux
0
100000
200000
300000
400000
500000
600000
700000
800000
Δ3 Redux
You Might Not Need Redux
(с) Dan Abramov
Многословность
Работа с формами
Демократия
Redux-Thunk
Альтернативы
rx-recompose -> recompose
AsyncMode
+
Error Boundaries
Is value
cached?
Render
yes
Throw
Promise
Resolve
Promiseno
Разработчики
eslint-plugin-react
0
1
2
3
4
5
Появление
технологии
Пик завышенных
ожиданий
Ущелье
разочарования
Плато
продуктивности
Мы здесь
А они здесь
Observables
Render Props
Error Handling
Fetcher API
Спасибо за внимание
Вопросы?

Катерина Лизогубова "React: дорога к просветлению"

Editor's Notes

  • #3 Кто я?
  • #4 Все вы конечно знаете, что сейчас у нас три основных лидера в мире фреймворков
  • #5 И чтобы узнать какое реальное соотношение сторон, давайте посмотрим на результаты опроса state of js 2017.
  • #7 Но как говорится. Есть три вида лжи…. Давайте поговорим о последней
  • #8 У меня есть такой график, но без подписей, он напоминает мне вот эту картинку из маленького принца
  • #9 Но так как конференция у нас не про питон и даже не про пхп, то давайте добавим подписи к графику
  • #10 Это график количества докладов в названии или описании которых упоминалось слово реакт с сайта fwdays за последние 4 года. Согласитесь, интересная тенденция.
  • #11 Давайте попробуем немного сжать этот график
  • #12 И наложить на него многим знакомую кривую.
  • #13 Для тех кто не в курсе – это так называемый цикл хайпа. Технолоигя появляется, черз некоторое время про неее все говорят и всячески ее хайпят, но затем вы находите все больше граблей и послепенно разочаровываетесь в технологии, попадая в ущелье разочарования.
  • #14 И сейчас наше место у таймлайна именно здесь. На данном этапе многие бросают технологию, но чаще всего в этот момент все только начинается. Судя по этому графику сейчас нас ожидает очередной стремительный рост реакта, который приведет нас на плато продуктивности.
  • #15 Давайте проведем декомпозицию и рассмотрим реакт с трех сторон и начнем с самого главного – самой библиотеки.
  • #16 За что мы все любим реакт? За то что он очень простой. Получаем на вход пропсы, добавляем щепотку стейта и получаем виртуал дом.
  • #17 Но не менее важной частью является то что реакт, несмотря на свою простоту, способен изменяться и улучшаться. Одним из самых крупных изменение последнего времени, стал реакт 16. Помните ли вы хоть еще одно такое серьезное изменение между версиями реакта?
  • #18 И многие из вас наверняка уже в курсе про изменения вреакте 16.0. Там появились …, но сейчас немного не об этом 
  • #19 Команда реакта на этом не остановилась и в английском языке для этого есть отличная фраза «to fall into the pit of success». Поэтому скоро нам грозят еще интересные изменения и давайте посмотрим на них
  • #20 Что нас ждет в ближайшем будущем? Наример, новый context API. Несмотря на то что многие из вас про него уже слышали, я все равно упомяну о том что это и как будет работать
  • #21 Теперь существует специальная функция createContext , которая
  • #22 Которая предоставляет компонент provider в котороый можно передать актуальный конткест и завернуть все приложение или любой другой
  • #24 Кстати обратите внимание, что новый контекс API использует так называемые render props. Не то чтобы это новая штука, но в последнее время все больше людей предпочитают их вместо HOC’ов
  • #25 Дальше давайте вспомним уже всем приевшуюся картинку, про которую все спрашивают на каждом собеседовании на реакт разработчика. Это lifecycle реакта. Запоминать много, при этом несколько из них, регулярно забываются. Например поднимите руку те, например, за последний месяц писал componentWillUpdate или componentWillMount
  • #26 У меня за полгода текущего проекта – ни разу  Реакт команда решили так же и выпилил их.
  • #27 Но и на этом реактовцы не остановились. Они собираются выпилить и cWRP. Потому что то что вы обычно пишете в cwrp Если поменялись пропсы, то давайте обновим стейт. А раз так, то появляется getDrivedStateFromProps. Это статический метод, который позволяет вернуть новое состояние, полагаясь на пропсы и стетй.
  • #28 Так же появится так называемый StrictMode
  • #37 Первое что приходит в голову при упоминании экосистемы это конечно-же redux. Количество загрузок в месяц
  • #38 Прирост загрузок. Если посмотреть внимательно, то тут есть несколько резких проседаний.
  • #39 Два из них понятны
  • #40 Что происходило в апрее 17 года, понятия не имею. Может кто-то из зала потом расскажет  И вообще чтобы этот график стал еще более показательным,
  • #41  давайте построим сткользящее среднее по трем месяцам. Так мы немного сгладим пики и увидим еще более реальную картину. И если раньше народ выходил праздничных отпусков и продолжал качать редакс, то в этот раз как то не очень выравнивается.
  • #42 И это обусловлено многими факторами. Сам ден абрамов неоднократно писал о том что чаще всего редакс вам и не нужен
  • #49 Перед вами слайд из презентации дэна абрамова. братите внимание – перед вами функциональный компонент, картинка в котором подгружается постепенно. Раньше нам бы для этого понадобилось состояние. Сейчас же перед нами по сути своей первый функциональный РЕАКТИВНЫЙ компонент. Как это работает?
  • #50 А работает это благодаря тому что уже сейчас есть в Реакте + немного клея
  • #51 В процессе рендеринга мы смотрим есть ли у нас уже готовые данные. И если их нет – мы выкидываем промис. Да. С помощью throw. С помощью механизма границ ошибок в реакте мы ловим этот промис и можем по его резолву знать. Какой компонент надо обновить и перерисовать Here's how suspending works: - in the render method, read a value from the cache. - if the value is already cached, the render continues like normal - if the value is not already cached, the cache throws a promise - when the promise resolves, React retries where it left off
  • #55 Упомянуть evan you про проблемы типизации vue