SlideShare a Scribd company logo
Javascript-­‐фреймворки:

должен  остаться  только  один
Сергей  Аверин
Про что доклад
Как выбирали новый веб-фреймворк
1. Немного о компании
2. Бекграунд
3. Задача
4. Исследование существующего кода
5. Выбор на что смотреть
6. Техническая оценка вариантов
7. Переделка одного из вариантов «под себя»
8. Сравнение пилотных проектов
9. Оценка затрат на внедрение
2
3
Про компанию
4
Масштаб
• 5 000 000 пользователей
• 500 000 из них — корпоративные
• 700 сотрудников в 17 разных офисах
• Выпускаем много разного софта:
• коробочный под Windows,
• корпоративный с веб-интерфейсами,
• cloud-продукты с веб-интерфейсом.
5
Веб
Все отделы делают веб-часть по-разному
6
Проблема
7
Проблема
• Много разных технологий для веб-части
• Фронтенд пишут не только JS-разработчики
• Нет возможности подключить к работе верстальщика
• Качество кода сильно отличается
• Текущие технологии устарели
8
Задача
9
Курс
• Толстый клиент на JS/HTML/CSS
• Единая технология во всей компании
• Библиотека UI-компонентов
• Возможность работать разработчикам разных уровней
• Код должен быть понятен backend-разработчикам
10
Оценка
11
Что имеем?
• Dojo
• Сайт acronis.com — rich-client там не нужен
• Angular 1.x
• RoR+jQuery
• ExtJS 4
12
Что не так с ExtJS?
• Индексная страница документации содержит:
13
395
классов
8 уровней наследования
14
класс с 201 методами
15
16
17
18
~1% DOM-дерева главной
19
Кастомный UI компонент
layouting
20
layouting
21
deep in layouting code…
22
deep in layouting code…
23
Рафик, где мой трафик?
24
Ладно с фреймворком понятно, а
само приложение?
25
Полезли в код приложения
• Мало комментариев
• Жесткая связность
• Нет границы между Controller и View
26
State, BizLogicState, BizLogic State, BizLogic, Ui logic
Model
View
Child View
SubController
SubController2
Child
View
Controller
Server API
М С V
M+CV
27
Полезли в код приложения
• Мало комментариев
• Жесткая связность
• Нет границы между Controller и View
• Publish/Subscribe — вроде как правильный паттерн,

но не работает.
28
298 событий, ~18 вызовов
30
Вопрос на засыпку
Чего обычно нет в коде приложений с жесткой
связностью и плохим разграничением зон
отвественности?
31
32
33
Полезли в код приложения
Выводы…
34
Полезли в код приложения
Выводы…
Настоящие выводы
• Очень сложный фреймворк
• Запутаный получившийся код
• Мегабайты кода
• Нельзя подключить обычных верстальщиков
• Виноват ли фреймворк? — частично
35
Куда направить усилия?
• нужен проще UI слой
• менее связная архитектура
• четкое разделение зон отвественности (языков,
технологий)
• больше границ и правил для программистов
• и код, в котором просто разобраться
среднестатистическому разработчику.
36
Второй вывод
«производительность фронтенда»:
Улучшаем производительность фронтенд-разработчиков
(технологии + стандарты)
Получаем производительность фронтенд-продуктов
37
Процесс выбора
38
…что нам подскажет интернет?
«Хорошие художники копируют,
великие художники воруют.»
Пабло Пикассо
39
Что нам подскажет интернет?
Angular, backbone, meteor, Ember, polymer, Aurelia,
React, Vue, Mercury, Dojo, Knockback.js, CanJS,
Mithril, Ampersand, Knockout, Flight, TroopJS,
Batman, Spine, YUI, ExtJS, Google Web Toolkit,

Kendo UI, OpenUI5, Webix, Echo3, Enyo
40
Github
41
Кол-во строк кода
Angular
Backbone
Dojo
React
ExtJS
Yahoo UI
Ember
Meteor
Kendo
Polymer
Knockout
0 700 000 1 400 000
Конференции 2015
42
0
7,5
15
22,5
30
Кол-во докладов по фреймворкам
Angular React Ember Backbone Polymer Aurelia Meteor
Connect JS, US Frontporch.io, US Midwest JS, US
FullStack, UK WebTech Conference, DE
Тренды
43
Тренды
44
Codeanywhere(cloud IDE)
45
Рынок вакансий
46
0
125
250
375
500
Angular React Ember Backbone ExtJS Knockout Meteor
Кол-во резюме Кол-во вакансий
Что смотрим:
• AngularJS
• Ember
• Knockout
• Backbone.js + проекты-расширения
• React + Flux
• Dojo
• ExtJS 6 =)
47
<cut />: что не подошло
• Backbone
• Ember
• Knockout
• Dojo
• ExtJS 6
48
Версия 1.*
• Хорошая модульность
• Нет единого стиля разработки
• Трудно дебажить
• Многовато «магии»
• Сложно интегрировать с новыми технологиями
• Код будет несовместим с версией 2.*
49
Посмотрели 2.0.0-alpha
• Аж три языка — TypeScript, Javascript и Dart.
• Вот это выглядит как то, что надо…
• …только шансов на скорый релиз нет.
• …и везде в документации написано «предварительно»…
…«может поменяться»…
50
Не фреймворк, а UI-библиотека
• структурность
• понятный data flow, изолированность компонент
• нет какого-то магического синтаксиса (кастомных
атрибутов, фильтров)
• понятная и простая возможность тюнинга
производительности
• и даже серверный рендеринг
51
Архитектура, но не фреймворк
+ one-way data flow, синхронная обработка
+ Как приложение делится на независимые блоки с помощью
денормализации — понятно
+ Единый Event Bus (Dispatcher) и уникальные события —
круто.
- Как обеспечивается динамика — непонятно
- Смешение концепций — Store’ы и хранят данные и
реализуют бизнес-логику…
52
• Кода от самого Facebook считай, почти нет.
• Посмотрели реальные фреймворки — fluxxor, DeLorean,
ReFlux.js, Este.js:
• уже лучше, но все еще нет динамики
• видно общий прогресс стандартизации в виде ES6,
npm-модулей, изоморфности и т. д.
• с разработкой веб-приложений беда… невозможно,
например, создать два instance’а одного Store’а, чтобы
они не воевали друг с другом.
• нет интернационализации
• нет примеров тестов
53
Попутно нашли…
54
Typescript
Шанс уменьшить «креативность» разработчиков разных отделов
55
Контракты
56
Интерфейсы
57
А также
• Дженерики
• Декораторы
• Составные типы
58
В итоге?
• Вопросов стало только больше =)
• «Серебряной пули» нет. В этом плане ExtJS «держит
удар».
• Хотим фреймворк с Typescript!
59
Сфокусируемся
60
Вернемся к задаче
• JS-кодеры должны писать код, верстальщики — делать
шаблоны
• Нужен проще UI слой, понятнее архитектура, четкое
разделение (языков, технологий), больше границ,
правил и стандартов.
• На Typescript
• Не являющийся монолитным все-в-одном
61
Портируем Flux
• Взяли за основу Flux+React фреймворк Este.js, как
наиболее инновационный.
• Плавно переписывали, пока за три захода от него не
осталось ничего, кроме конфига сборщика.
62
Трудности
63
1. Store’ы
• Разные зоны ответственности
• Store -> область хранения данных (Store) и отдельно логика
(Controller) (сообразно тому, куда идет развитие Flux)
64
State, BizLogicState, BizLogic State, BizLogic, Ui logic
Model
View
Child View
SubController
SubController2
Child
View
Controller
Server API
М С V
Примерно как было
65
66
Ui logicData BizLogic
Isolated block
Isolated block
Isolated block
Child View
Child View
View
Server API
Store
Store
Store
М С V
ViewView
Child View
Child View
Dispatcher
Controller
SubController2
SubController
Action
Примерно как станет
2. JSX
• JSX — это опять мешанина кода и HTML.
• Обратили внимание на wix-react-templates
• Написали свой похожий
67
68
Шаблон
69
JS-­‐код  шаблона
70
UI-­‐компонент
3. Переводы (i18n)
• Все Flux-фреймворки обошли эту тему стороной
71
72
Шаблон
4. Динамика
• Нет динамического создания Store’ов и View-компонент.
• Как организовать независимую работу двух одинаковых
блоков на одной странице?
73
Что получилось?
74
Получилось:
• Хороший ООП с интерфейсами и дженериками
• С dependency injection
• Только две внешние библиотеки — React и lodash
• Можно поменять что угодно
• С нормальной сборкой
75
Битва «пилотов» 76
vs.6
Битва «пилотов»
Обрезанная копия существующей админки «с нуля»:
• ExtJS 6 + TypeScript
• Flux + React + Typescript
Сложности:
• анимации
• кастомный скроллбар
• интерфейс меняется для узких экранов
• мобильная версия
• JSON-REST API с авторизацией
77
Цифры*
ExtJS6 demo Flux+React demo
PRODUCTION BUILD
JS CODE SIZE
1,45 MB 336 KB
PRODUCTION BUILD
CSS CODE SIZE
345 KB 19.9 kB
# OF HTML DOM NODES 841 301
LOAD TIME
(PRODUCTION, NO CACHE)
1.54 s 0,59 s
LOAD TIME
(PRODUCTION, CACHE)
1.42 s 0,58 s
TIME UNTIL FIRST API REQUEST 0,405 s 0,168 s
JS INIT TIME (GOOGLE CHROME) 0,345 s 0,158 s
PRODUCTION BUILD MEMORY USAGE
(GOOGLE CHROME)
24.2 Mb 11.8 Mb
* В реальном проекте разница в объемах кода и скорости
инициализации будет меньше
78
Переход
79
Оценка работы над UI
А что понадобится?
• 60 простых
• 15 сложных
80
81
Оценка работы над UI
• 10% = 2000 строк кода HTML+CSS+TS
• Заняло 4 дня 1 человека
82
Технология миграции
Варианты:
1. Новые проекты пишем на новом фреймворке.
2. Старый код не трогаем, новый встраиваем
«независимыми блоками» — как iframe или
кастомный UI-компонент для ExtJS.
3. При модификации старого кода — или правь, как
есть, или портируй.
83
84
85
@ryba_xek
ryba.xek
Слайды,
предыдущие доклады:
http://averin.ru/slides/
http://slideshare.net/rybaxeks@averin.ru
Спасибо!
Вопросы?

More Related Content

PDF
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
PDF
Эволюция клиентской разработки: от веба ко "всеобщей мобилизации” или mobile-...
PDF
Badoo Desktop: оптимизация приложения на миллион юзеров онлайн
PDF
Javascript-фреймворки:
 должен остаться только один
PDF
Frontend: Путешествие в мир модульных загрузчиков
PPT
Enterprise or not to enterprise
PDF
Григорий Петров "WebRTC в мобильных приложениях при помощи React Native"
PPTX
Test driven development in net
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
Эволюция клиентской разработки: от веба ко "всеобщей мобилизации” или mobile-...
Badoo Desktop: оптимизация приложения на миллион юзеров онлайн
Javascript-фреймворки:
 должен остаться только один
Frontend: Путешествие в мир модульных загрузчиков
Enterprise or not to enterprise
Григорий Петров "WebRTC в мобильных приложениях при помощи React Native"
Test driven development in net

What's hot (20)

PDF
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...
PDF
Как анимировать тысячи объектов на карте и не подвесить браузер
PPTX
Chef @DevWeb
PPTX
Test Driven Development in .NET Applications
PDF
React новая эра фронтенд разработки / Роберт Харитонов (Liberty Global)
PDF
JavaScript завтра
PDF
Александр Сычев "Статика и динамика. Как фреймворки помогут прокачать ваше пр...
PPT
Embarcadero All-Access
PPTX
Как развивать библиотеку компонентов, не ломая ее / Артур Удалов (Mail.Ru Group)
PDF
Как взаимодействовать с графическими дизайнерами: готовим UI Kit / Артем Моло...
PDF
Microsoft Edge и платформа веб-приложений в Windows 10 / Константин Кичинский...
PDF
Frontendlab: Cравнить Несравнимое - Юлия Пучнина
PDF
Денис Паясь
PDF
Современный фронтенд -- как не утонуть в море хайпа?
PPTX
Пакетный менеджер CrossPM: упрощаем сложные зависимости | Александр Ковалев
PDF
Moscow js node.js enterprise development
DOCX
.NET Development
PPTX
Nival: Как не увлечься погоней за универсализацией компонент
PDF
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
PDF
Opensource на .NET
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...
Как анимировать тысячи объектов на карте и не подвесить браузер
Chef @DevWeb
Test Driven Development in .NET Applications
React новая эра фронтенд разработки / Роберт Харитонов (Liberty Global)
JavaScript завтра
Александр Сычев "Статика и динамика. Как фреймворки помогут прокачать ваше пр...
Embarcadero All-Access
Как развивать библиотеку компонентов, не ломая ее / Артур Удалов (Mail.Ru Group)
Как взаимодействовать с графическими дизайнерами: готовим UI Kit / Артем Моло...
Microsoft Edge и платформа веб-приложений в Windows 10 / Константин Кичинский...
Frontendlab: Cравнить Несравнимое - Юлия Пучнина
Денис Паясь
Современный фронтенд -- как не утонуть в море хайпа?
Пакетный менеджер CrossPM: упрощаем сложные зависимости | Александр Ковалев
Moscow js node.js enterprise development
.NET Development
Nival: Как не увлечься погоней за универсализацией компонент
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
Opensource на .NET
Ad

Similar to 2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один (20)

PDF
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
PDF
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
PDF
WebAssembly
PPTX
Лучшие практики на практике
PDF
Компонентный подход: скучно, неинтересно, бесперспективно
PDF
Юрий Василевский «Автоматизация в XCode»
PDF
Юрий Василевский "Автоматизация в XCode"
PDF
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
PDF
Микросервисный фронтенд
PDF
Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)
PPTX
Миграция кода с Magento 1 на Magento 2
PPTX
Промышленная разработка ПО. Лекция 2. Инструменты
PDF
Desktop app based on node js and html5
PPT
Владимир Никонов "Вызовы при разработке enterprise продукта"
PDF
PDF
webpack: 7 бед - один ответ
PDF
D2D Pizza JS Илья Беда "Куда мы все катимся?"
PDF
Как приручить реактивное программирование
PDF
PPTX
Даниил Соколюк "ReactJS.NET — опыт рендеринга на сервере"
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
WebAssembly
Лучшие практики на практике
Компонентный подход: скучно, неинтересно, бесперспективно
Юрий Василевский «Автоматизация в XCode»
Юрий Василевский "Автоматизация в XCode"
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
Микросервисный фронтенд
Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)
Миграция кода с Magento 1 на Magento 2
Промышленная разработка ПО. Лекция 2. Инструменты
Desktop app based on node js and html5
Владимир Никонов "Вызовы при разработке enterprise продукта"
webpack: 7 бед - один ответ
D2D Pizza JS Илья Беда "Куда мы все катимся?"
Как приручить реактивное программирование
Даниил Соколюк "ReactJS.NET — опыт рендеринга на сервере"
Ad

More from HappyDev (20)

PPT
2015-12-06 Aнтон Непомнящих - Принципы канбан и теории ограничений на примере...
PPT
2015-12-05 Антон Непомнящих - Agile — как уложиться в сроки и бюджет?
PPTX
2015 12-05 Александр Шиповалов - Инструмент для тестирования Sikuli script
PPTX
2015-12-06 Константин Борисов - Как собеседовать программиста?
PDF
2015-12-05 Данил Никифоров - NoSQL для мобайла с синхронизацией данных
PPTX
2015-12-06 Букуров Алексей - Автоматическое формирование интерфейса по метаоп...
PDF
2015-12-06 Евгений Тюменцев - Практики разработки серверных приложений
PDF
2015-12-06 Александр Чернышев - Технологии открытости мобильных приложений
PDF
2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench
PPTX
2015-12-05 Александр Шиповалов - Веселые картинки в тестировании
PPTX
2015-12-05 Александр Бындю, Андрей Шапиро - Пять самых важных составляющих пр...
PDF
2015-12-05 Александр Коротков, Иван Панченко - Слабо-структурированные данные...
PDF
2015-12-06 Юрий Мельничек - Руководство для разработчиков по маркетингу мобил...
PPT
2015-12-06 Сергей Хрущев - Человеческим языком о суперкомпьютерах
PDF
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
PDF
2015-12-06 Евгений Тюменцев - Разработка надежных параллельных, распределенны...
PDF
2015-12-06 Артем Зиненко - Что делать, если браузеры клиентов действуют проти...
PDF
2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным
PDF
2015-12-06 Андрей Коновалов - От сервисной компании к продуктовой: что нужно,...
PDF
2015-12-05 Вадим Литвинов - Проблемы разработки распределённых систем
2015-12-06 Aнтон Непомнящих - Принципы канбан и теории ограничений на примере...
2015-12-05 Антон Непомнящих - Agile — как уложиться в сроки и бюджет?
2015 12-05 Александр Шиповалов - Инструмент для тестирования Sikuli script
2015-12-06 Константин Борисов - Как собеседовать программиста?
2015-12-05 Данил Никифоров - NoSQL для мобайла с синхронизацией данных
2015-12-06 Букуров Алексей - Автоматическое формирование интерфейса по метаоп...
2015-12-06 Евгений Тюменцев - Практики разработки серверных приложений
2015-12-06 Александр Чернышев - Технологии открытости мобильных приложений
2015-12-05 Вадим Литвинов - Нагрузочное тестирование с MZBench
2015-12-05 Александр Шиповалов - Веселые картинки в тестировании
2015-12-05 Александр Бындю, Андрей Шапиро - Пять самых важных составляющих пр...
2015-12-05 Александр Коротков, Иван Панченко - Слабо-структурированные данные...
2015-12-06 Юрий Мельничек - Руководство для разработчиков по маркетингу мобил...
2015-12-06 Сергей Хрущев - Человеческим языком о суперкомпьютерах
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
2015-12-06 Евгений Тюменцев - Разработка надежных параллельных, распределенны...
2015-12-06 Артем Зиненко - Что делать, если браузеры клиентов действуют проти...
2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным
2015-12-06 Андрей Коновалов - От сервисной компании к продуктовой: что нужно,...
2015-12-05 Вадим Литвинов - Проблемы разработки распределённых систем

2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один