SlideShare a Scribd company logo
От Backbone к React
Зачем и как
Игорь Лобанов
Kaiten.io
● Возраст: ~2 года
● Первая продакшн версия появилась через 3 месяца
● Frontend: Backbone (Marionette), React, Redux, ~50KSLOC
● Backend: Node (Express), PostgreSQL (+хранимые епроцедуры на plv8),
RabbitMQ, Redis
Backbone -> React: зачем?
FrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + Redux
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

PDF
FrontDays #1. Алексей Ульянов, React.js и методологии разработки на нём
PDF
#13 "Управление состоянием в Redux" Роман Сальников
PDF
"Flux — новый взгляд на старые проблемы" — Сергей Прохоров, MoscowJS 18
PDF
Михаил Давыдов "Масштабируемые JavaScript-приложения"
PDF
#7 "Многообещающий JavaScript – Promises" Денис Речкунов
PDF
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
PDF
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
PPTX
Коротко о React.js
FrontDays #1. Алексей Ульянов, React.js и методологии разработки на нём
#13 "Управление состоянием в Redux" Роман Сальников
"Flux — новый взгляд на старые проблемы" — Сергей Прохоров, MoscowJS 18
Михаил Давыдов "Масштабируемые JavaScript-приложения"
#7 "Многообещающий JavaScript – Promises" Денис Речкунов
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
Коротко о React.js

What's hot (20)

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

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

PDF
CD with Jenkins. Lessons Learned
PPTX
React native. Bridge From Web To Mobile. Intro
PDF
Vuejs composition API
PDF
LvivJS 2014 - Win-win c React.js
PDF
react-native
PDF
Евгений Ртищев "Мобильная платформа на ReactNative"
PDF
JavaScript & modern scala backend
ODP
Javascript in modern scala backend. [russian]
PDF
Превышаем скоростные лимиты с Angular 2
PDF
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
PPTX
Как приручить реактивное программирование
PPTX
Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js
PPT
JS Fest 2018. Лилия Карпенко. Особенности создания IOS / Android Mobile Apps ...
PDF
Тестируй это / Виктор Русакович (GP Solutions)
PPT
Где кончается react native? / Павел Кондратенко (Rambler&Co)
PDF
Rambler.iOS #5: VIPER и Swift
PPTX
Andrew Borisenko "Magic of Vue.js""
PDF
Erlang tasty & useful stuff
PDF
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
PDF
FPUG Dzyga presentation
CD with Jenkins. Lessons Learned
React native. Bridge From Web To Mobile. Intro
Vuejs composition API
LvivJS 2014 - Win-win c React.js
react-native
Евгений Ртищев "Мобильная платформа на ReactNative"
JavaScript & modern scala backend
Javascript in modern scala backend. [russian]
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Как приручить реактивное программирование
Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js
JS Fest 2018. Лилия Карпенко. Особенности создания IOS / Android Mobile Apps ...
Тестируй это / Виктор Русакович (GP Solutions)
Где кончается react native? / Павел Кондратенко (Rambler&Co)
Rambler.iOS #5: VIPER и Swift
Andrew Borisenko "Magic of Vue.js""
Erlang tasty & useful stuff
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
FPUG Dzyga presentation
Ad

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: зачем?
  • 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 ● Избавились от части архитектурных проблем ● Скорость работы переписанной функциональности существенно не изменилась ● Количество кода отвечающего за переписанную часть осталось примерно тем же