SlideShare a Scribd company logo
1 of 17
Download to read offline
От Backbone к React
Зачем и как
Игорь Лобанов
Kaiten.io
● Возраст: ~2 года
● Первая продакшн версия появилась через 3 месяца
● Frontend: Backbone (Marionette), React, Redux, ~50KSLOC
● Backend: Node (Express), PostgreSQL (+хранимые епроцедуры на plv8),
RabbitMQ, Redis
Backbone -> React: зачем?
Backbone -> React: зачем?
Цели:
● Увеличить скорость разработки
● Сократить технический долг
● Перейти на использование готовых UI
компонентов
React глазами разработчика на Backbone
const MyView = Marionette.ItemView.extend({
modelEvents: {
'change': 'render'
}
});
const MyView = Marionette.ItemView.extend({
modelEvents: {
'change:active': 'onChangeActive',
'change:checked': 'onChangeChecked'
},
onChangeAction: function() {
this.$el.toggleClass('active', this.model.get('active'));
},
onChangeChecked: function() {
this.$('input[type="checkbox"]').prop({
checked: this.model.get('checked')
});
}
});
Backbone Marionette глазами React разработчика
Как было и как будет
Было Будет
Сейчас
Грабли
Не наступили:
● Не стали использовать иерархический стейт
● Не стали использовать старые стили, а перешли на inline styles
Наступили:
● Radium и React Motion
● Иммутабельность
Иммутабельность
Сколько здесь проблем с иммутабельностью?
const shallowCompare = require('react-addons-shallow-compare');
class ToDoListItem extends React.Component {
shouldComponentUpdate (nextProps, nextState) {
return shallowCompare(this, nextProps, nextState);
}
}
class ToDoList extends React.Component {
render () {
return (
<ToDoListItem
style={{marginTop: 8}}
onSave={this.onClick.bind(this)}
onRemove={() => this.onRemove()}
/>
);
}
}
Иммутабельность
Правильный ответ: 3
1. {marginTop: 8} - всегда новый объект, использовать const для стилей
2. this.onSave.bind(this) !== this.onSave.bind(this), bind можно делать в
конструкторе
3. () => this.onRemove() - всегда новая функция
Результаты
● Вероятность устранения бага за 5 дней: 73% -> 83%
● За 1 день 27% -> 44%
Результаты
Вероятность реализации новой фичи за 10 рабочих дней: 67% -> 79%
Результаты
Результаты
● Снизился порог входа для разработки frontend (человек, который
занимался только бекендом начал делать фичи полностью)
● Подключили Material UI
● Избавились от части архитектурных проблем
● Скорость работы переписанной функциональности существенно не
изменилась
● Количество кода отвечающего за переписанную часть осталось
примерно тем же
Спасибо. Вопросы?

More Related Content

What's hot

Ilia kantor паттерны серверных comet решений
Ilia kantor паттерны серверных comet решенийIlia kantor паттерны серверных comet решений
Ilia kantor паттерны серверных comet решений
rit2010
 
МРТ для данных, Frontend Conf 2016
МРТ для данных, Frontend Conf 2016МРТ для данных, Frontend Conf 2016
МРТ для данных, Frontend Conf 2016
Anastasia Goryacheva
 
Внутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpackВнутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpack
Alexey Ivanov
 
Java осень 2012 лекция 5
Java осень 2012 лекция 5Java осень 2012 лекция 5
Java осень 2012 лекция 5
Technopark
 
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScriptCSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript
Alexey Ivanov
 
React Webinar Slides
React Webinar SlidesReact Webinar Slides
React Webinar Slides
Kateryna Porshnieva
 

What's hot (20)

Чистая архитектура с VIPER / Сергей Крапивенский (Rambler&Co)
Чистая архитектура с VIPER / Сергей Крапивенский (Rambler&Co)Чистая архитектура с VIPER / Сергей Крапивенский (Rambler&Co)
Чистая архитектура с VIPER / Сергей Крапивенский (Rambler&Co)
 
Синхронный MODX: как сделать настоящую синхронизацию и не застрелиться
Синхронный MODX: как сделать настоящую синхронизацию и не застрелитьсяСинхронный MODX: как сделать настоящую синхронизацию и не застрелиться
Синхронный MODX: как сделать настоящую синхронизацию и не застрелиться
 
Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)
Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)
Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)
 
Ilia kantor паттерны серверных comet решений
Ilia kantor паттерны серверных comet решенийIlia kantor паттерны серверных comet решений
Ilia kantor паттерны серверных comet решений
 
МРТ для данных, Frontend Conf 2016
МРТ для данных, Frontend Conf 2016МРТ для данных, Frontend Conf 2016
МРТ для данных, Frontend Conf 2016
 
#11 "Отзывчивый UI без блокировки Event Loop" Денис Речкунов
#11 "Отзывчивый UI без блокировки Event Loop" Денис Речкунов#11 "Отзывчивый UI без блокировки Event Loop" Денис Речкунов
#11 "Отзывчивый UI без блокировки Event Loop" Денис Речкунов
 
Владимир Кузнецов — Прототип сайта: разработка и развёртывание
Владимир Кузнецов — Прототип сайта: разработка и развёртываниеВладимир Кузнецов — Прототип сайта: разработка и развёртывание
Владимир Кузнецов — Прототип сайта: разработка и развёртывание
 
Быстрое развертывание среды разработки c Vagrant
Быстрое развертывание среды разработки c VagrantБыстрое развертывание среды разработки c Vagrant
Быстрое развертывание среды разработки c Vagrant
 
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
 
Внутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpackВнутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpack
 
Сергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3CСергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3C
 
Async Javascript
Async JavascriptAsync Javascript
Async Javascript
 
Cucumber
CucumberCucumber
Cucumber
 
Java осень 2012 лекция 5
Java осень 2012 лекция 5Java осень 2012 лекция 5
Java осень 2012 лекция 5
 
Изоморфный JavaScript — будущее уже здесь
Изоморфный JavaScript — будущее уже здесьИзоморфный JavaScript — будущее уже здесь
Изоморфный JavaScript — будущее уже здесь
 
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
 
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScriptCSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript
 
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
"CommonJS для браузера", Антон Шувалов, MoscowJS 15"CommonJS для браузера", Антон Шувалов, MoscowJS 15
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
 
"Dependency Injection. JavaScript.", Сергей Камардин, MoscowJS 15
"Dependency Injection. JavaScript.", Сергей Камардин, MoscowJS 15"Dependency Injection. JavaScript.", Сергей Камардин, MoscowJS 15
"Dependency Injection. JavaScript.", Сергей Камардин, MoscowJS 15
 
React Webinar Slides
React Webinar SlidesReact Webinar Slides
React Webinar Slides
 

Similar to FrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + Redux

JavaScript & modern scala backend
JavaScript & modern scala backendJavaScript & modern scala backend
JavaScript & modern scala backend
GeeksLab Odessa
 
Javascript in modern scala backend. [russian]
Javascript in modern scala backend.  [russian]  Javascript in modern scala backend.  [russian]
Javascript in modern scala backend. [russian]
Ruslan Shevchenko
 
FPUG Dzyga presentation
FPUG Dzyga presentationFPUG Dzyga presentation
FPUG Dzyga presentation
Ivan Filimonov
 

Similar to FrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + Redux (20)

CD with Jenkins. Lessons Learned
CD with Jenkins. Lessons LearnedCD with Jenkins. Lessons Learned
CD with Jenkins. Lessons Learned
 
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
 
Vuejs composition API
Vuejs composition APIVuejs composition API
Vuejs composition API
 
LvivJS 2014 - Win-win c React.js
LvivJS 2014 - Win-win c React.jsLvivJS 2014 - Win-win c React.js
LvivJS 2014 - Win-win c React.js
 
react-native
react-nativereact-native
react-native
 
Евгений Ртищев "Мобильная платформа на ReactNative"
Евгений Ртищев "Мобильная платформа на ReactNative"Евгений Ртищев "Мобильная платформа на ReactNative"
Евгений Ртищев "Мобильная платформа на ReactNative"
 
JavaScript & modern scala backend
JavaScript & modern scala backendJavaScript & modern scala backend
JavaScript & modern scala backend
 
Javascript in modern scala backend. [russian]
Javascript in modern scala backend.  [russian]  Javascript in modern scala backend.  [russian]
Javascript in modern scala backend. [russian]
 
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2
 
Как приручить реактивное программирование
Как приручить реактивное программированиеКак приручить реактивное программирование
Как приручить реактивное программирование
 
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
 
JS Fest 2018. Лилия Карпенко. Особенности создания IOS / Android Mobile Apps ...
JS Fest 2018. Лилия Карпенко. Особенности создания IOS / Android Mobile Apps ...JS Fest 2018. Лилия Карпенко. Особенности создания IOS / Android Mobile Apps ...
JS Fest 2018. Лилия Карпенко. Особенности создания IOS / Android Mobile Apps ...
 
Тестируй это / Виктор Русакович (GP Solutions)
Тестируй это / Виктор Русакович (GP Solutions)Тестируй это / Виктор Русакович (GP Solutions)
Тестируй это / Виктор Русакович (GP Solutions)
 
Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)
 
Rambler.iOS #5: VIPER и Swift
Rambler.iOS #5: VIPER и SwiftRambler.iOS #5: VIPER и Swift
Rambler.iOS #5: VIPER и Swift
 
Andrew Borisenko "Magic of Vue.js""
Andrew Borisenko  "Magic of Vue.js""Andrew Borisenko  "Magic of Vue.js""
Andrew Borisenko "Magic of Vue.js""
 
Erlang tasty & useful stuff
Erlang tasty & useful stuffErlang tasty & useful stuff
Erlang tasty & useful stuff
 
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVCАрхитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
 
FPUG Dzyga presentation
FPUG Dzyga presentationFPUG Dzyga presentation
FPUG Dzyga presentation
 

FrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + Redux

  • 1. От Backbone к React Зачем и как Игорь Лобанов
  • 2. Kaiten.io ● Возраст: ~2 года ● Первая продакшн версия появилась через 3 месяца ● Frontend: Backbone (Marionette), React, Redux, ~50KSLOC ● Backend: Node (Express), PostgreSQL (+хранимые епроцедуры на plv8), RabbitMQ, Redis
  • 3. Backbone -> React: зачем?
  • 4.
  • 5. Backbone -> React: зачем? Цели: ● Увеличить скорость разработки ● Сократить технический долг ● Перейти на использование готовых UI компонентов
  • 6. React глазами разработчика на Backbone const MyView = Marionette.ItemView.extend({ modelEvents: { 'change': 'render' } }); const MyView = Marionette.ItemView.extend({ modelEvents: { 'change:active': 'onChangeActive', 'change:checked': 'onChangeChecked' }, onChangeAction: function() { this.$el.toggleClass('active', this.model.get('active')); }, onChangeChecked: function() { this.$('input[type="checkbox"]').prop({ checked: this.model.get('checked') }); } });
  • 7. Backbone Marionette глазами React разработчика
  • 8. Как было и как будет Было Будет
  • 10. Грабли Не наступили: ● Не стали использовать иерархический стейт ● Не стали использовать старые стили, а перешли на inline styles Наступили: ● Radium и React Motion ● Иммутабельность
  • 11. Иммутабельность Сколько здесь проблем с иммутабельностью? const shallowCompare = require('react-addons-shallow-compare'); class ToDoListItem extends React.Component { shouldComponentUpdate (nextProps, nextState) { return shallowCompare(this, nextProps, nextState); } } class ToDoList extends React.Component { render () { return ( <ToDoListItem style={{marginTop: 8}} onSave={this.onClick.bind(this)} onRemove={() => this.onRemove()} /> ); } }
  • 12. Иммутабельность Правильный ответ: 3 1. {marginTop: 8} - всегда новый объект, использовать const для стилей 2. this.onSave.bind(this) !== this.onSave.bind(this), bind можно делать в конструкторе 3. () => this.onRemove() - всегда новая функция
  • 13. Результаты ● Вероятность устранения бага за 5 дней: 73% -> 83% ● За 1 день 27% -> 44%
  • 14. Результаты Вероятность реализации новой фичи за 10 рабочих дней: 67% -> 79%
  • 16. Результаты ● Снизился порог входа для разработки frontend (человек, который занимался только бекендом начал делать фичи полностью) ● Подключили Material UI ● Избавились от части архитектурных проблем ● Скорость работы переписанной функциональности существенно не изменилась ● Количество кода отвечающего за переписанную часть осталось примерно тем же