SlideShare une entreprise Scribd logo
1  sur  40
Télécharger pour lire hors ligne
Win-win с react.js
Максим Климишин
!
CTO at Zakaz.ua
!
!
@maxmaxmaxmax
• Бегаю
• Рублю дрова
• Увлекаюсь политикой
Обо мне
React.js
React.js
JavaScript библиотека для создания UI
(Wikipedia)
!
!
Надо описать, как приложение должно
выглядеть в любой момент времени и
React.js автоматически будет управлять
всеми обновлениями UI, если основные
данные поменяются
Что такое UI?
UI – это интерактивная проекция
состояния приложения
React.js tree
• Компоненты React.js реализованы в
виде дерева
• Есть Root Node, от которой все пляшет
• Каждый компонент может содержать
дочерние компоненты
• В дочерние компоненты можно
передавать состояние в виде аттрибутов
• Дочерний компонент не может изменить
props, которые были ему переданы из
родительского компонента
Виртуальное DOM дерево
• Virtual DOM - это объекты JS, которые
описывают структуру UI
• Реакт использует алгоритм, для
нахождения минимального числа шагов
модификаций DOM дерева в браузере
JSX
• XML-похожий трансформер синтаксиса
в JavaScript (React.DOM)
!
• Визуализирует структуру DOM внутри
React.js компонент
!
• Помогает избежать избыточного кода на
чистом JavaScript и повысить
читаемость компонент
Hello, John!
/** @jsx React.DOM */!
var HelloMessage = React.createClass({!
render: function() {!
return <div>Hello {this.props.name}</div>;!
}!
});!
!
React.renderComponent(!
<HelloMessage name="John" />, mountNode);!
JSX to JS
/** @jsx React.DOM */!
var HelloMessage = React.createClass({displayName:
'HelloMessage',!
render: function() {!
return React.DOM.div(null, "Hello ", this.props.name);!
}!
});!
!
React.renderComponent(!
HelloMessage( {name:"John"} ),
document.getElementById("hello"));!
Rendering
• Во время вызова setState реакт
помечает его как “грязный” (dirty) и
перестраивает виртуальное DOM
дерево
• На следующей итерации event loop-a
происходит обновление
Diff алгоритмы и массивы
• Особый случай для списков - по
умолчанию элементы списка
ассоциировались последовательно
• Для однозначного маппинга между
элементом списка и компонентой
React.js необходимо указывать ключ
Решаем сами, что рендерим
• По желанию можно самостоятельно
решать изменилось ли дерево
boolean shouldComponentUpdate(
object nextProps, object nextState)
Синтетические события
• React.js слушает события только с
корневой ноды
• Когда событие происходит, react.js ищет
компонент, соответствующей ноде,
которая сгенерировала событие
• Дальше React.js оборачивает событие в
SyntheticEvent
• И это дело работает совершенно
одинаково во всех поддерживаемых
браузерах
Работа с CSS
• Поначалу в React.js было неудобно
работать с классами CSS
<div className=“class-a class-b class-c class-d class-e
class-f class-…>
</div>
• Но появился classSet и жизнь
наладилась
classSet
{
render: function() {
var cx = React.addons.classSet;
var classes = cx({
'message': true,
'message-important': this.props.isImportant,
'message-read': this.props.isRead
});
// same final string, but much cleaner
return (
<div className={classes}>Great, I'll be there.</div>
)
}
}
Рутинное телодвижение кажется
сложным
var NoLink = React.createClass({
getInitialState: function() {
return {value: 'Hello!'};
},
handleChange: function(event) {
this.setState({value: event.target.value});
},
render: function() {
var value = this.state.value;
return <input type="text" value={value}
onChange={this.handleChange} />;
}
});
Two way data binding
• Angular и Ember разбаловал некоторых
разработчиков в плане two-way data
binding.
!
• Но пацанчики из facebook оказались
ровными и сделали linkState …
Two way data binding
var WithLink = React.createClass({
mixins: [React.addons.LinkedStateMixin],
getInitialState: function() {
return {value: 'Hello!'};
},
render: function() {
return <input type="text"
valueLink={this.linkState('value')} />;
}
});
Чем хорошо для дела
• Практически нет гемора для поддержки
зоопарка браузеров
• Быстрая и “не распухающая” разработка
новых фич
• Легко внедряется в существующий и
работающий код
• Легко ре-использовать компоненты
• Сложно написать “говнокод” - помогает
односторонний data flow
Производительность
Based on: http://vuejs.org/perf/
Backbone
React
Plain JS
0 10 20 30 40
Анимация 100 кружков, Chrome 34, ~ms на цикл
Model & Controller
React.js занимается только
уровнем представления
А что насчет приложений?
Flux
Flux - это архитектура/design pattern
приложений для Rect.js, которая
использует однонаправленный поток
данных
Идея архитектуры Flux
Что внутри Flux?
• По сути Flux - design pattern, уникальная
тулза - Dispatcher
• В экземпляр диспетчера региструются
колебли, присваивается уникальный ID
• Диспетчеру можно послать некоторое
событие (dispatcher.dispatch)
• Внутри коллбека можно объявить
зависимость от выполнения другого
(dispatcher.waitFor)
• Коллбеки будут выполнены согласно
описанным зависимостям
Какую проблемы решает Flux?
• Мультинаправленное движение данных
внутри приложения
• Структурную организацию React.js-
based приложений
• Избыточный инструментарий, которые
приезжает с хранилищами из других
подходов
• Структурирование зависимостей
хэндлеров событий
Bidirectional data flow
Button 1
Button 2
Input 1
Input 2
Result area 1
Result area 2
Handler 3
API Endpoint 1
API Endpoint 2
API Endpoint 3
Handler 2
Handler 1
Handler 4
Среднесложное приложение на jQuery
Bidirectional data flow
Action
View 1
View 2
View 3
State Action
State
State
State
Flux Dispatcher
var base = new Dispatcher();
var v1 = {"country": null}, v2 = {"city": null},
v3 = {"price": null};
!
v1.dispatchToken = base.register(function (payload) {
console.log("v1 handler");
if (payload.actionType == "update-v1")
v1.country = payload.country;
console.log(v1.country, v2.city, v3.price);
});
!
Flux Dispatcher
v2.dispatchToken = base.register(function (payload) {
console.log("v2 handler");
if (payload.actionType === "update-v1") {
base.waitFor([v1.dispatchToken]);
v2.city = payload.country + " - related data to v2";
}
console.log(v1.country, v2.city, v3.price);
});
!
base.register(function (payload) {
console.log("v3 handler");
if (payload.actionType === "update-v2") {
base.waitFor([v1.dispatchToken, v2.dispatchToken]);
v2.city = payload.city; v3.price = 123;
}
console.log(v1.country, v2.city, v3.price);
});
Flux Dispatcher
!
document.getElementById("dispatch").addEventListener("click",
function () {
base.dispatch({
actionType: "update-v1",
country: 'ukraine'
});
base.dispatch({
actionType: "update-v2",
city: "kiev"});
});
Результат
v1 handler
ukraine kiev 123
v2 handler
ukraine ukraine - related data to v2 123
v3 handler
ukraine ukraine - related data to v2 123
!
v1 handler
ukraine ukraine - related data to v2 123
v2 handler
ukraine ukraine - related data to v2 123
v3 handler
ukraine kiev 123
А нахера это нужно?
Разделение ответственности (Separation
of concerns) - уменьшать связанность
между модулями, увеличивать
связность внутри модуля
Please, stop the bullshit
© John Legere, T-Mobile CEO
Coupling vs cohesion?
• Связанность плоха тем, что она мешает
менять компоненты независимо от
общего кода
• Разработчику необходимо понимать как
работает вся система для того, чтобы
безопасно внести изменения
• Изменения требований потенциально
влечет рефакторинг нескольких
компонент
• Стоимость изменений выше
Спасибо за горячую воду, Львов!
Спасибо!
!
facebook.github.io/react/
!
facebook.github.io/flux/

Contenu connexe

Tendances

FrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + Redux
FrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + ReduxFrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + Redux
FrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + ReduxFrontDays
 
FrontDays #1. Алексей Ульянов, React.js и методологии разработки на нём
FrontDays #1. Алексей Ульянов, React.js и методологии разработки на нёмFrontDays #1. Алексей Ульянов, React.js и методологии разработки на нём
FrontDays #1. Алексей Ульянов, React.js и методологии разработки на нёмFrontDays
 
Liquibase: Enterprise Edition
Liquibase: Enterprise EditionLiquibase: Enterprise Edition
Liquibase: Enterprise EditionAndrei Solntsev
 
День 3: Автоматизированное тестирование: Openshift
 День 3: Автоматизированное тестирование: Openshift День 3: Автоматизированное тестирование: Openshift
День 3: Автоматизированное тестирование: OpenshiftOleg Popov
 
Миграция существующих приложений в Windows Azure
Миграция существующих приложений в Windows AzureМиграция существующих приложений в Windows Azure
Миграция существующих приложений в Windows AzureNatalia Efimtseva
 
Rambler.iOS #5: VIPER и Swift
Rambler.iOS #5: VIPER и SwiftRambler.iOS #5: VIPER и Swift
Rambler.iOS #5: VIPER и SwiftRAMBLER&Co
 
некоторые проблемы внедрения Ajax технологии в Asp.Net проекты роман правук
некоторые проблемы внедрения Ajax технологии в Asp.Net проекты   роман правукнекоторые проблемы внедрения Ajax технологии в Asp.Net проекты   роман правук
некоторые проблемы внедрения Ajax технологии в Asp.Net проекты роман правукMedia Gorod
 
Impress Application Server for node.js (ru)
Impress Application Server for node.js (ru)Impress Application Server for node.js (ru)
Impress Application Server for node.js (ru)Timur Shemsedinov
 

Tendances (8)

FrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + Redux
FrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + ReduxFrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + Redux
FrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + Redux
 
FrontDays #1. Алексей Ульянов, React.js и методологии разработки на нём
FrontDays #1. Алексей Ульянов, React.js и методологии разработки на нёмFrontDays #1. Алексей Ульянов, React.js и методологии разработки на нём
FrontDays #1. Алексей Ульянов, React.js и методологии разработки на нём
 
Liquibase: Enterprise Edition
Liquibase: Enterprise EditionLiquibase: Enterprise Edition
Liquibase: Enterprise Edition
 
День 3: Автоматизированное тестирование: Openshift
 День 3: Автоматизированное тестирование: Openshift День 3: Автоматизированное тестирование: Openshift
День 3: Автоматизированное тестирование: Openshift
 
Миграция существующих приложений в Windows Azure
Миграция существующих приложений в Windows AzureМиграция существующих приложений в Windows Azure
Миграция существующих приложений в Windows Azure
 
Rambler.iOS #5: VIPER и Swift
Rambler.iOS #5: VIPER и SwiftRambler.iOS #5: VIPER и Swift
Rambler.iOS #5: VIPER и Swift
 
некоторые проблемы внедрения Ajax технологии в Asp.Net проекты роман правук
некоторые проблемы внедрения Ajax технологии в Asp.Net проекты   роман правукнекоторые проблемы внедрения Ajax технологии в Asp.Net проекты   роман правук
некоторые проблемы внедрения Ajax технологии в Asp.Net проекты роман правук
 
Impress Application Server for node.js (ru)
Impress Application Server for node.js (ru)Impress Application Server for node.js (ru)
Impress Application Server for node.js (ru)
 

Similaire à LvivJS 2014 - Win-win c React.js

Артем Тритяк, Lead Front-End developer в Electric Cloud
 Артем Тритяк, Lead Front-End developer в Electric Cloud Артем Тритяк, Lead Front-End developer в Electric Cloud
Артем Тритяк, Lead Front-End developer в Electric CloudProvectus
 
Повышение эффективности Java приложений (новые возможности Web Logic 12c, кон...
Повышение эффективности Java приложений (новые возможности Web Logic 12c, кон...Повышение эффективности Java приложений (новые возможности Web Logic 12c, кон...
Повышение эффективности Java приложений (новые возможности Web Logic 12c, кон...Andrey Akulov
 
Даниил Соколюк "ReactJS.NET — опыт рендеринга на сервере"
 Даниил Соколюк "ReactJS.NET — опыт рендеринга на сервере" Даниил Соколюк "ReactJS.NET — опыт рендеринга на сервере"
Даниил Соколюк "ReactJS.NET — опыт рендеринга на сервере"MskDotNet Community
 
Adn@it'summer - Изоморфные приложения с React и Redux
Adn@it'summer - Изоморфные приложения с React и ReduxAdn@it'summer - Изоморфные приложения с React и Redux
Adn@it'summer - Изоморфные приложения с React и ReduxADN Digital Studio
 
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
#6 "Изоморфный фреймворк Catberry.js" Денис РечкуновJSib
 
Observable как атом приложения
Observable как атом приложенияObservable как атом приложения
Observable как атом приложенияArtem Bey
 
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"Yandex
 
Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012 Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012 Dmytro Mindra
 
Паттерны быстрой разработки WPF MVVM бизнес-приложений
Паттерны быстрой разработки WPF MVVM бизнес-приложенийПаттерны быстрой разработки WPF MVVM бизнес-приложений
Паттерны быстрой разработки WPF MVVM бизнес-приложенийGoSharp
 
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации..."Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...Yandex
 
Как я перестал беспокоиться и полюбил Redux
Как я перестал беспокоиться и полюбил ReduxКак я перестал беспокоиться и полюбил Redux
Как я перестал беспокоиться и полюбил ReduxIT61
 
Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js
Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.jsTrainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js
Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.jsDevOWL Meetup
 
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....KazHackStan
 
Референсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVCРеференсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVCAndrew Mayorov
 
Микросервисная архитектура на базе CoreOS и Kubernetes
Микросервисная архитектура на базе CoreOS и KubernetesМикросервисная архитектура на базе CoreOS и Kubernetes
Микросервисная архитектура на базе CoreOS и KubernetesDenis Izmaylov
 
Рендеринг может больше: vue.js vs React, Андрей Солодовников
Рендеринг может больше: vue.js vs React, Андрей СолодовниковРендеринг может больше: vue.js vs React, Андрей Солодовников
Рендеринг может больше: vue.js vs React, Андрей СолодовниковDevDay
 
webpack: 7 бед - один ответ
webpack: 7 бед - один ответwebpack: 7 бед - один ответ
webpack: 7 бед - один ответDenis Izmaylov
 
jQuery как путь к RIA
jQuery как путь к RIAjQuery как путь к RIA
jQuery как путь к RIAGetDev.NET
 
React native. Bridge From Web To Mobile. Intro
React native. Bridge From Web To Mobile. IntroReact native. Bridge From Web To Mobile. Intro
React native. Bridge From Web To Mobile. IntroIgor Izraylevych
 

Similaire à LvivJS 2014 - Win-win c React.js (20)

Артем Тритяк, Lead Front-End developer в Electric Cloud
 Артем Тритяк, Lead Front-End developer в Electric Cloud Артем Тритяк, Lead Front-End developer в Electric Cloud
Артем Тритяк, Lead Front-End developer в Electric Cloud
 
Повышение эффективности Java приложений (новые возможности Web Logic 12c, кон...
Повышение эффективности Java приложений (новые возможности Web Logic 12c, кон...Повышение эффективности Java приложений (новые возможности Web Logic 12c, кон...
Повышение эффективности Java приложений (новые возможности Web Logic 12c, кон...
 
Даниил Соколюк "ReactJS.NET — опыт рендеринга на сервере"
 Даниил Соколюк "ReactJS.NET — опыт рендеринга на сервере" Даниил Соколюк "ReactJS.NET — опыт рендеринга на сервере"
Даниил Соколюк "ReactJS.NET — опыт рендеринга на сервере"
 
Adn@it'summer - Изоморфные приложения с React и Redux
Adn@it'summer - Изоморфные приложения с React и ReduxAdn@it'summer - Изоморфные приложения с React и Redux
Adn@it'summer - Изоморфные приложения с React и Redux
 
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
 
Observable как атом приложения
Observable как атом приложенияObservable как атом приложения
Observable как атом приложения
 
RichFaces: обзор
RichFaces: обзорRichFaces: обзор
RichFaces: обзор
 
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
 
Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012 Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012
 
Паттерны быстрой разработки WPF MVVM бизнес-приложений
Паттерны быстрой разработки WPF MVVM бизнес-приложенийПаттерны быстрой разработки WPF MVVM бизнес-приложений
Паттерны быстрой разработки WPF MVVM бизнес-приложений
 
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации..."Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
 
Как я перестал беспокоиться и полюбил Redux
Как я перестал беспокоиться и полюбил ReduxКак я перестал беспокоиться и полюбил Redux
Как я перестал беспокоиться и полюбил Redux
 
Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js
Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.jsTrainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js
Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js
 
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....
 
Референсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVCРеференсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVC
 
Микросервисная архитектура на базе CoreOS и Kubernetes
Микросервисная архитектура на базе CoreOS и KubernetesМикросервисная архитектура на базе CoreOS и Kubernetes
Микросервисная архитектура на базе CoreOS и Kubernetes
 
Рендеринг может больше: vue.js vs React, Андрей Солодовников
Рендеринг может больше: vue.js vs React, Андрей СолодовниковРендеринг может больше: vue.js vs React, Андрей Солодовников
Рендеринг может больше: vue.js vs React, Андрей Солодовников
 
webpack: 7 бед - один ответ
webpack: 7 бед - один ответwebpack: 7 бед - один ответ
webpack: 7 бед - один ответ
 
jQuery как путь к RIA
jQuery как путь к RIAjQuery как путь к RIA
jQuery как путь к RIA
 
React native. Bridge From Web To Mobile. Intro
React native. Bridge From Web To Mobile. IntroReact native. Bridge From Web To Mobile. Intro
React native. Bridge From Web To Mobile. Intro
 

Plus de Max Klymyshyn

Papers We Love Kyiv, July 2018: A Conflict-Free Replicated JSON Datatype
Papers We Love Kyiv, July 2018: A Conflict-Free Replicated JSON DatatypePapers We Love Kyiv, July 2018: A Conflict-Free Replicated JSON Datatype
Papers We Love Kyiv, July 2018: A Conflict-Free Replicated JSON DatatypeMax Klymyshyn
 
KharkivJS 2017: Коллаборативные системы и CRDT
KharkivJS 2017: Коллаборативные системы и CRDTKharkivJS 2017: Коллаборативные системы и CRDT
KharkivJS 2017: Коллаборативные системы и CRDTMax Klymyshyn
 
OdessaJS 2017: Groupware Systems for fun and profit
OdessaJS 2017: Groupware Systems for fun and profitOdessaJS 2017: Groupware Systems for fun and profit
OdessaJS 2017: Groupware Systems for fun and profitMax Klymyshyn
 
PyCon Ukraine 2017: Operational Transformation
PyCon Ukraine 2017: Operational Transformation PyCon Ukraine 2017: Operational Transformation
PyCon Ukraine 2017: Operational Transformation Max Klymyshyn
 
Communicating Sequential Processes (CSP) in JavaScript
Communicating Sequential Processes (CSP) in JavaScriptCommunicating Sequential Processes (CSP) in JavaScript
Communicating Sequential Processes (CSP) in JavaScriptMax Klymyshyn
 
PiterPy 2016: Parallelization, Aggregation and Validation of API in Python
PiterPy 2016: Parallelization, Aggregation and Validation of API in PythonPiterPy 2016: Parallelization, Aggregation and Validation of API in Python
PiterPy 2016: Parallelization, Aggregation and Validation of API in PythonMax Klymyshyn
 
Fighting async JavaScript (CSP)
Fighting async JavaScript (CSP)Fighting async JavaScript (CSP)
Fighting async JavaScript (CSP)Max Klymyshyn
 
React.js: Ускоряем UX/UI
React.js: Ускоряем UX/UIReact.js: Ускоряем UX/UI
React.js: Ускоряем UX/UIMax Klymyshyn
 
KharkovPy #12: I/O in Python apps and smart logging (russian)
KharkovPy #12: I/O in Python apps and smart logging (russian)KharkovPy #12: I/O in Python apps and smart logging (russian)
KharkovPy #12: I/O in Python apps and smart logging (russian)Max Klymyshyn
 
5 мифов о производительности баз данных и Python
5 мифов о производительности баз данных и Python5 мифов о производительности баз данных и Python
5 мифов о производительности баз данных и PythonMax Klymyshyn
 
Изоформные приложения на React.js
Изоформные приложения на React.jsИзоформные приложения на React.js
Изоформные приложения на React.jsMax Klymyshyn
 
Изоморфный JavaScript (iForum 2015)
Изоморфный JavaScript (iForum 2015)Изоморфный JavaScript (iForum 2015)
Изоморфный JavaScript (iForum 2015)Max Klymyshyn
 
Трансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScript
Трансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScriptТрансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScript
Трансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScriptMax Klymyshyn
 
PiterPy 2015 - Трансдюсеры и Python
PiterPy 2015 - Трансдюсеры и PythonPiterPy 2015 - Трансдюсеры и Python
PiterPy 2015 - Трансдюсеры и PythonMax Klymyshyn
 
Robust web apps with React.js
Robust web apps with React.jsRobust web apps with React.js
Robust web apps with React.jsMax Klymyshyn
 
Инновации и JavaScript
Инновации и JavaScriptИнновации и JavaScript
Инновации и JavaScriptMax Klymyshyn
 
Odessapy2013 - Graph databases and Python
Odessapy2013 - Graph databases and PythonOdessapy2013 - Graph databases and Python
Odessapy2013 - Graph databases and PythonMax Klymyshyn
 
Angular.js - JS Camp UKraine 2013
Angular.js - JS Camp UKraine 2013Angular.js - JS Camp UKraine 2013
Angular.js - JS Camp UKraine 2013Max Klymyshyn
 
Зачем читать чужой код?
Зачем читать чужой код?Зачем читать чужой код?
Зачем читать чужой код?Max Klymyshyn
 
AgileBaseCamp 2013 - Start Up and Get Done
AgileBaseCamp 2013 - Start Up and Get DoneAgileBaseCamp 2013 - Start Up and Get Done
AgileBaseCamp 2013 - Start Up and Get DoneMax Klymyshyn
 

Plus de Max Klymyshyn (20)

Papers We Love Kyiv, July 2018: A Conflict-Free Replicated JSON Datatype
Papers We Love Kyiv, July 2018: A Conflict-Free Replicated JSON DatatypePapers We Love Kyiv, July 2018: A Conflict-Free Replicated JSON Datatype
Papers We Love Kyiv, July 2018: A Conflict-Free Replicated JSON Datatype
 
KharkivJS 2017: Коллаборативные системы и CRDT
KharkivJS 2017: Коллаборативные системы и CRDTKharkivJS 2017: Коллаборативные системы и CRDT
KharkivJS 2017: Коллаборативные системы и CRDT
 
OdessaJS 2017: Groupware Systems for fun and profit
OdessaJS 2017: Groupware Systems for fun and profitOdessaJS 2017: Groupware Systems for fun and profit
OdessaJS 2017: Groupware Systems for fun and profit
 
PyCon Ukraine 2017: Operational Transformation
PyCon Ukraine 2017: Operational Transformation PyCon Ukraine 2017: Operational Transformation
PyCon Ukraine 2017: Operational Transformation
 
Communicating Sequential Processes (CSP) in JavaScript
Communicating Sequential Processes (CSP) in JavaScriptCommunicating Sequential Processes (CSP) in JavaScript
Communicating Sequential Processes (CSP) in JavaScript
 
PiterPy 2016: Parallelization, Aggregation and Validation of API in Python
PiterPy 2016: Parallelization, Aggregation and Validation of API in PythonPiterPy 2016: Parallelization, Aggregation and Validation of API in Python
PiterPy 2016: Parallelization, Aggregation and Validation of API in Python
 
Fighting async JavaScript (CSP)
Fighting async JavaScript (CSP)Fighting async JavaScript (CSP)
Fighting async JavaScript (CSP)
 
React.js: Ускоряем UX/UI
React.js: Ускоряем UX/UIReact.js: Ускоряем UX/UI
React.js: Ускоряем UX/UI
 
KharkovPy #12: I/O in Python apps and smart logging (russian)
KharkovPy #12: I/O in Python apps and smart logging (russian)KharkovPy #12: I/O in Python apps and smart logging (russian)
KharkovPy #12: I/O in Python apps and smart logging (russian)
 
5 мифов о производительности баз данных и Python
5 мифов о производительности баз данных и Python5 мифов о производительности баз данных и Python
5 мифов о производительности баз данных и Python
 
Изоформные приложения на React.js
Изоформные приложения на React.jsИзоформные приложения на React.js
Изоформные приложения на React.js
 
Изоморфный JavaScript (iForum 2015)
Изоморфный JavaScript (iForum 2015)Изоморфный JavaScript (iForum 2015)
Изоморфный JavaScript (iForum 2015)
 
Трансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScript
Трансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScriptТрансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScript
Трансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScript
 
PiterPy 2015 - Трансдюсеры и Python
PiterPy 2015 - Трансдюсеры и PythonPiterPy 2015 - Трансдюсеры и Python
PiterPy 2015 - Трансдюсеры и Python
 
Robust web apps with React.js
Robust web apps with React.jsRobust web apps with React.js
Robust web apps with React.js
 
Инновации и JavaScript
Инновации и JavaScriptИнновации и JavaScript
Инновации и JavaScript
 
Odessapy2013 - Graph databases and Python
Odessapy2013 - Graph databases and PythonOdessapy2013 - Graph databases and Python
Odessapy2013 - Graph databases and Python
 
Angular.js - JS Camp UKraine 2013
Angular.js - JS Camp UKraine 2013Angular.js - JS Camp UKraine 2013
Angular.js - JS Camp UKraine 2013
 
Зачем читать чужой код?
Зачем читать чужой код?Зачем читать чужой код?
Зачем читать чужой код?
 
AgileBaseCamp 2013 - Start Up and Get Done
AgileBaseCamp 2013 - Start Up and Get DoneAgileBaseCamp 2013 - Start Up and Get Done
AgileBaseCamp 2013 - Start Up and Get Done
 

LvivJS 2014 - Win-win c React.js

  • 1. Win-win с react.js Максим Климишин ! CTO at Zakaz.ua ! ! @maxmaxmaxmax
  • 2. • Бегаю • Рублю дрова • Увлекаюсь политикой Обо мне
  • 4. React.js JavaScript библиотека для создания UI (Wikipedia) ! ! Надо описать, как приложение должно выглядеть в любой момент времени и React.js автоматически будет управлять всеми обновлениями UI, если основные данные поменяются
  • 5. Что такое UI? UI – это интерактивная проекция состояния приложения
  • 6. React.js tree • Компоненты React.js реализованы в виде дерева • Есть Root Node, от которой все пляшет • Каждый компонент может содержать дочерние компоненты • В дочерние компоненты можно передавать состояние в виде аттрибутов • Дочерний компонент не может изменить props, которые были ему переданы из родительского компонента
  • 7. Виртуальное DOM дерево • Virtual DOM - это объекты JS, которые описывают структуру UI • Реакт использует алгоритм, для нахождения минимального числа шагов модификаций DOM дерева в браузере
  • 8. JSX • XML-похожий трансформер синтаксиса в JavaScript (React.DOM) ! • Визуализирует структуру DOM внутри React.js компонент ! • Помогает избежать избыточного кода на чистом JavaScript и повысить читаемость компонент
  • 9. Hello, John! /** @jsx React.DOM */! var HelloMessage = React.createClass({! render: function() {! return <div>Hello {this.props.name}</div>;! }! });! ! React.renderComponent(! <HelloMessage name="John" />, mountNode);!
  • 10. JSX to JS /** @jsx React.DOM */! var HelloMessage = React.createClass({displayName: 'HelloMessage',! render: function() {! return React.DOM.div(null, "Hello ", this.props.name);! }! });! ! React.renderComponent(! HelloMessage( {name:"John"} ), document.getElementById("hello"));!
  • 11.
  • 12. Rendering • Во время вызова setState реакт помечает его как “грязный” (dirty) и перестраивает виртуальное DOM дерево • На следующей итерации event loop-a происходит обновление
  • 13. Diff алгоритмы и массивы • Особый случай для списков - по умолчанию элементы списка ассоциировались последовательно • Для однозначного маппинга между элементом списка и компонентой React.js необходимо указывать ключ
  • 14. Решаем сами, что рендерим • По желанию можно самостоятельно решать изменилось ли дерево boolean shouldComponentUpdate( object nextProps, object nextState)
  • 15. Синтетические события • React.js слушает события только с корневой ноды • Когда событие происходит, react.js ищет компонент, соответствующей ноде, которая сгенерировала событие • Дальше React.js оборачивает событие в SyntheticEvent • И это дело работает совершенно одинаково во всех поддерживаемых браузерах
  • 16. Работа с CSS • Поначалу в React.js было неудобно работать с классами CSS <div className=“class-a class-b class-c class-d class-e class-f class-…> </div> • Но появился classSet и жизнь наладилась
  • 17. classSet { render: function() { var cx = React.addons.classSet; var classes = cx({ 'message': true, 'message-important': this.props.isImportant, 'message-read': this.props.isRead }); // same final string, but much cleaner return ( <div className={classes}>Great, I'll be there.</div> ) } }
  • 18. Рутинное телодвижение кажется сложным var NoLink = React.createClass({ getInitialState: function() { return {value: 'Hello!'}; }, handleChange: function(event) { this.setState({value: event.target.value}); }, render: function() { var value = this.state.value; return <input type="text" value={value} onChange={this.handleChange} />; } });
  • 19. Two way data binding • Angular и Ember разбаловал некоторых разработчиков в плане two-way data binding. ! • Но пацанчики из facebook оказались ровными и сделали linkState …
  • 20. Two way data binding var WithLink = React.createClass({ mixins: [React.addons.LinkedStateMixin], getInitialState: function() { return {value: 'Hello!'}; }, render: function() { return <input type="text" valueLink={this.linkState('value')} />; } });
  • 21. Чем хорошо для дела • Практически нет гемора для поддержки зоопарка браузеров • Быстрая и “не распухающая” разработка новых фич • Легко внедряется в существующий и работающий код • Легко ре-использовать компоненты • Сложно написать “говнокод” - помогает односторонний data flow
  • 22. Производительность Based on: http://vuejs.org/perf/ Backbone React Plain JS 0 10 20 30 40 Анимация 100 кружков, Chrome 34, ~ms на цикл
  • 23. Model & Controller React.js занимается только уровнем представления
  • 24.
  • 25. А что насчет приложений?
  • 26. Flux
  • 27. Flux - это архитектура/design pattern приложений для Rect.js, которая использует однонаправленный поток данных
  • 29. Что внутри Flux? • По сути Flux - design pattern, уникальная тулза - Dispatcher • В экземпляр диспетчера региструются колебли, присваивается уникальный ID • Диспетчеру можно послать некоторое событие (dispatcher.dispatch) • Внутри коллбека можно объявить зависимость от выполнения другого (dispatcher.waitFor) • Коллбеки будут выполнены согласно описанным зависимостям
  • 30. Какую проблемы решает Flux? • Мультинаправленное движение данных внутри приложения • Структурную организацию React.js- based приложений • Избыточный инструментарий, которые приезжает с хранилищами из других подходов • Структурирование зависимостей хэндлеров событий
  • 31. Bidirectional data flow Button 1 Button 2 Input 1 Input 2 Result area 1 Result area 2 Handler 3 API Endpoint 1 API Endpoint 2 API Endpoint 3 Handler 2 Handler 1 Handler 4 Среднесложное приложение на jQuery
  • 32. Bidirectional data flow Action View 1 View 2 View 3 State Action State State State
  • 33. Flux Dispatcher var base = new Dispatcher(); var v1 = {"country": null}, v2 = {"city": null}, v3 = {"price": null}; ! v1.dispatchToken = base.register(function (payload) { console.log("v1 handler"); if (payload.actionType == "update-v1") v1.country = payload.country; console.log(v1.country, v2.city, v3.price); }); !
  • 34. Flux Dispatcher v2.dispatchToken = base.register(function (payload) { console.log("v2 handler"); if (payload.actionType === "update-v1") { base.waitFor([v1.dispatchToken]); v2.city = payload.country + " - related data to v2"; } console.log(v1.country, v2.city, v3.price); }); ! base.register(function (payload) { console.log("v3 handler"); if (payload.actionType === "update-v2") { base.waitFor([v1.dispatchToken, v2.dispatchToken]); v2.city = payload.city; v3.price = 123; } console.log(v1.country, v2.city, v3.price); });
  • 35. Flux Dispatcher ! document.getElementById("dispatch").addEventListener("click", function () { base.dispatch({ actionType: "update-v1", country: 'ukraine' }); base.dispatch({ actionType: "update-v2", city: "kiev"}); });
  • 36. Результат v1 handler ukraine kiev 123 v2 handler ukraine ukraine - related data to v2 123 v3 handler ukraine ukraine - related data to v2 123 ! v1 handler ukraine ukraine - related data to v2 123 v2 handler ukraine ukraine - related data to v2 123 v3 handler ukraine kiev 123
  • 37. А нахера это нужно? Разделение ответственности (Separation of concerns) - уменьшать связанность между модулями, увеличивать связность внутри модуля Please, stop the bullshit © John Legere, T-Mobile CEO
  • 38. Coupling vs cohesion? • Связанность плоха тем, что она мешает менять компоненты независимо от общего кода • Разработчику необходимо понимать как работает вся система для того, чтобы безопасно внести изменения • Изменения требований потенциально влечет рефакторинг нескольких компонент • Стоимость изменений выше
  • 39. Спасибо за горячую воду, Львов!