#5 "React.js" Антон Артамонов

44
React.js Антон Артамонов

Transcript of #5 "React.js" Антон Артамонов

Page 1: #5 "React.js" Антон Артамонов

React.js

Антон Артамонов

Page 2: #5 "React.js" Антон Артамонов

Мы хотим делать надежно1. Легко поддерживать

2. Легко развивать

3. Легко тестировать

4. Просто вникнуть

2

Page 3: #5 "React.js" Антон Артамонов

Надежно = предсказуемо

Page 4: #5 "React.js" Антон Артамонов

Веб до Ajax: 90-е• Страница генерируется каждый раз с нуля

• Внешний вид страницы определяется БД

• Результирующая страница не зависит от других запросов

• Информация на странице быстро устаревает

• Когда данные на странице устаревают, мы просто выбрасываем ее и

обновляем с сервера

4

Page 5: #5 "React.js" Антон Артамонов

Все было просто, пока не насталполный AJAX!

Page 6: #5 "React.js" Антон Артамонов

Single Page Application• Все запросы к серверу в рамках одной страницы

• Страница полностью генерируется в браузере клиента

• Состояние страницы определяется БД, текущим DOM-деревом и

внутренним состоянием фронтенда

• Мы постоянно изменяем состояние системы без запросов на сервер

• Результирующая страница зависит от всех запросов, событий

пользователя и тонны логики на клиенте

• Очень много состояния и событий на фронтенде

6

Page 7: #5 "React.js" Антон Артамонов

Мутации состояния с течением времени —корни всех бед

7

Page 8: #5 "React.js" Антон Артамонов

Amelia ушла оффлайн

Page 9: #5 "React.js" Антон Артамонов

Bryan ушел оффлайн

Page 10: #5 "React.js" Антон Артамонов

Steve теперь в сети

Page 11: #5 "React.js" Антон Артамонов

Bryan теперь в сети

Page 12: #5 "React.js" Антон Артамонов

Desmond отсутствует

Page 13: #5 "React.js" Антон Артамонов

Desmond теперь с мобильного

Page 14: #5 "React.js" Антон Артамонов

?

Page 15: #5 "React.js" Антон Артамонов

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

пропасть между статической программой и динамическим процессом,

чтобы сделать соответствие между программой и процессом

настолько очевидным, насколько это возможно.

Эдсгер В. Дейкстра

15

Page 16: #5 "React.js" Антон Артамонов

А так?[

{name: 'Bryan', client: 'web', idle: false},

{name: 'Desmond', client: 'mobile', idle: true},

{name: 'Steve', client: 'online', idle: false}

]

01.

02.

03.

04.

05.

16

Page 17: #5 "React.js" Антон Артамонов

Реактивноепрограммирование

Page 18: #5 "React.js" Антон Артамонов

Реактивное программированиеa := 1

b := 2

c := a + b

a := 3

print c

01.

02.

03.

04.

05.

18

Page 19: #5 "React.js" Антон Артамонов

Пример• Bruen LLC 48.24%

• Reinger, Rolfson and Kilback 25.56%

• Bernier LLC 39.39%

19

Page 20: #5 "React.js" Антон Артамонов
Page 21: #5 "React.js" Антон Артамонов

Проблема №1: Javascript нереактивный

Page 22: #5 "React.js" Антон Артамонов

Проблема №2: Мы не можем простовыбросить DOM

Page 23: #5 "React.js" Антон Артамонов

React.jsБиблиотека для создания пользовательских интерфейсов. Рендерит UI

и отвечает за события. Создала команда Facebook и Instagram.

V в MVC.

Не накладывает ограничений на стек технологий и методы получения

данных.

23

Page 24: #5 "React.js" Антон Артамонов

Виртуальный DOM• Если что-то могло измениться, перерисовываем все компоненты в

виртуальный DOM

• Находим минимальный набор различий между текущей и виртуальной

версией DOM

• Изменяем в реальном DOM только то, что действительно изменилось

24

Page 25: #5 "React.js" Антон Артамонов

Да ладно, это же будет оченьмедленно!

Page 26: #5 "React.js" Антон Артамонов

Таким образом, React очень быстр изкоробки на большинстве задач

Page 27: #5 "React.js" Антон Артамонов

Но что делать, если этого недостаточно?1. Как ускорить Data Binding?

• Не использовать Data Binding.

• Переделывать приложение.

2. Как ускорить Virtual DOM?

• Кэширование!

• Добавляется уже к готовому приложению.

27

Page 28: #5 "React.js" Антон Артамонов

Кэширование в React:shouldComponentUpdate()var Foo = React.createClass({

shouldComponentUpdate: function (newProps, newState) {

return this.props.label != newProps.label;

}

...

}

01.

02.

03.

04.

05.

06.

28

Page 29: #5 "React.js" Антон Артамонов

Кэширование в React: PureRenderMixinvar Foo = React.createClass({

mixins: [PureRenderMixin]

...

}

01.

02.

03.

04.

29

Page 30: #5 "React.js" Антон Артамонов

React компонент —строительный блок UI, который включает в себя все связаные вещи, но

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

функционалом JS, а не урезанным, как в шаблонизаторах.

30

Page 31: #5 "React.js" Антон Артамонов

Почему React смешивает логику иразметку?

• У ViewModel и шаблона одна задача: вывести UI.

• Из-за этого они очень сильно связаны.

• Шаблоны не изолированы. Нет контрактов.

• Переиспользуемые компоненты.

• Unit-тестирование компонентов.

• Нет сложных абстракций.

31

Page 32: #5 "React.js" Антон Артамонов

JSX

Page 33: #5 "React.js" Антон Артамонов

Чистый JSvar HelloMessage = React.createClass({displayName: "HelloMessage",

render: function() {

return React.createElement("div", null, "Hello ", this.props.name);

}

});

React.render(React.createElement(HelloMessage, {name: "John"}), mountNode);

01.

02.

03.

04.

05.

06.

07.

33

Page 34: #5 "React.js" Антон Артамонов

JSXvar HelloMessage = React.createClass({displayName: "HelloMessage",

render: function() {

return <div>Hello {this.props.name}</div> ;

}

});

React.render( <HelloMessage name="John" /> , mountNode);

01.

02.

03.

04.

05.

06.

07.

34

Page 35: #5 "React.js" Антон Артамонов

Трансляция JSX в JS в браузере<head>

<script src="build/react.js"></script>

<script src="build/JSXTransformer.js"></script>

</head>

Рекомендуется использовать только во время разработки

01.

02.

03.

04.

35

Page 36: #5 "React.js" Антон Артамонов

Трансляция JSX в JS на сервере• Npm пакет react-tools

• Browserify с модулем reactify

• Webpack с лоадером jsx-loader

• и др.

36

Page 37: #5 "React.js" Антон Артамонов

Как избежать спагетти кода?Просто не пишите спагетти код.

1. Делить компоненты как можно мельче.

2. Компонент выполняет только одну задачу.

3. Данные передаются сверху вниз.

4. ???

5. PROFIT!

37

Page 38: #5 "React.js" Антон Артамонов

Строение компонента1. render()

2. getInitialState()

3. getDefaultProps()

4. propTypes

5. mixins

6. statics

7. displayName

38

Page 39: #5 "React.js" Антон Артамонов

Цикл жизни компонента1. Mounting: componentWillMount()

2. Mounting: componentDidMount()

3. Updating: componentWillReceiveProps()

4. Updating: shouldComponentUpdate()

5. Updating: componentWillUpdate()

6. Updating: componentDidUpdate()

7. Unmounting: componentWillUnmount()

39

Page 40: #5 "React.js" Антон Артамонов

Refs и findDOMNode()handleClick: function() {

React.findDOMNode(this.refs.myTextInput).focus();

},

<input type="text" ref="myTextInput" />

<input type="button" onClick={this.handleClick}/>

01.

02.

03.

01.

02.

40

Page 41: #5 "React.js" Антон Артамонов

Кто использует?• Khan Academy

• Netflix

• Yahoo

• Airbnb

• Sony

• Atlassian

• BBC

• и др.

41

Page 42: #5 "React.js" Антон Артамонов

Ключевые моменты• Компоненты, а не шаблоны.

• Перерендериваем DOM, а не производим мутации.

• Виртуальный DOM быстрый и простой.

42

Page 43: #5 "React.js" Антон Артамонов

просто != привычно

Page 44: #5 "React.js" Антон Артамонов

Спасибо завнимание!Follow me on @aartmnv