secon'2016. Сергей Аверин. javascript-фреймворки: должен...

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

Upload: secon

Post on 16-Apr-2017

81 views

Category:

Technology


4 download

TRANSCRIPT

Page 1: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

Javascript-фреймворки:

должен остаться только один

Сергей Аверин

Page 2: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

ПРО ЧТО ДОКЛАД

• Как выбирали новый веб-фреймворк

– Немного о компании

– Бекграунд

– Задача

– Исследование существующего кода

– Выбор на что смотреть

– Техническая оценка вариантов

– Переделка одного из вариантов «под себя»

– Сравнение пилотных проектов

– Оценка затрат на внедрение

2

Page 3: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

3

Page 4: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

Про компанию

4

Page 5: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

МАСШТАБ

• 5 000 000 пользователей

• 500 000 из них — корпоративные

• 700 сотрудников в 17 разных офисах

• Выпускаем много разного софта:

– коробочный под Windows,

– корпоративный с веб-интерфейсами,

– cloud-продукты с веб-интерфейсом.

5

Page 6: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

ВЕБ

Все отделы делают веб-часть по-разному

6

Page 7: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

Проблема

7

Page 8: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

ПРОБЛЕМА

• Много разных технологий для веб-части

• Фронтенд пишут не только JS-разработчики

• Нет возможности подключить к работе верстальщика

• Качество кода сильно отличается

• Текущие технологии устарели

8

Page 9: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

Задача

9

Page 10: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

КУРС

• Толстый клиент на JS/HTML/CSS

• Единая технология во всей компании

• Библиотека UI-компонентов

• Возможность работать разработчикам разных уровней

• Код должен быть понятен backend-разработчикам

10

Page 11: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

Оценка

11

Page 12: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

ЧТО ИМЕЕМ?

• Dojo

• Сайт acronis.com — rich-client там не нужен

• Angular 1.x

• RoR+jQuery

• ExtJS 4

12

Page 13: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

ЧТО НЕ ТАК С EXTJS?

• Индексная страница документации содержит:

13

395 классов

Page 14: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

8 уровней наследования14

Page 15: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

класс с 201 методами15

Page 16: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

16

Page 17: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

17

Page 18: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

18

~1% DOM-дерева главной

Page 19: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

19

Кастомный UI компонент

Page 20: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

layouting20

Page 21: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

layouting21

Page 22: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

deep in layouting code…

22

Page 23: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

23

deep in layouting code…

Page 24: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

Рафик, где мой трафик?24

Page 25: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

Ладно с фреймворком понятно, а само приложение?

25

Page 26: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

ПОЛЕЗЛИ В КОД ПРИЛОЖЕНИЯ

• Мало комментариев

• Жесткая связность

• Нет границы между Controller и View

26

Page 27: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

State, BizLogicState, BizLogic State, BizLogic, Ui logic

Model

View

Child View

SubController

SubController2

Child View

Controller

Server API

М С V

M+CV27

Page 28: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

ПОЛЕЗЛИ В КОД ПРИЛОЖЕНИЯ

• Мало комментариев

• Жесткая связность

• Нет границы между Controller и View

• Publish/Subscribe — вроде как правильный паттерн,но не работает.

28

Page 29: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

29

8 событий, ~18 вызовов

Page 30: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

30

Page 31: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

ВОПРОС НА ЗАСЫПКУ

Чего обычно нет в коде приложений с жесткой связностью и плохим разграничением зон

отвественности?

31

Page 32: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

32

Page 33: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

33

Полезли в код приложения

Выводы…

Page 34: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

34

Полезли в код приложения

Выводы…

Page 35: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

НАСТОЯЩИЕ ВЫВОДЫ

• Очень сложный фреймворк

• Запутаный получившийся код

• Мегабайты кода

• Нельзя подключить обычных верстальщиков

• Виноват ли фреймворк? — частично

35

Page 36: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

КУДА НАПРАВИТЬ УСИЛИЯ?

• нужен проще UI слой

• менее связная архитектура

• четкое разделение зон отвественности (языков, технологий)

• больше границ и правил для программистов

• и код, в котором просто разобраться среднестатистическому разработчику.

36

Page 37: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

Процесс выбора

37

Page 38: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

…ЧТО НАМ ПОДСКАЖЕТ ИНТЕРНЕТ?

«Хорошие художники копируют, великие художники воруют.»

Пабло Пикассо

38

Page 39: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

ЧТО НАМ ПОДСКАЖЕТ ИНТЕРНЕТ?

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

39

Page 40: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

GITHUB

40

Кол-во строк кода

Angular

Backbone

Dojo

React

ExtJS

Yahoo UI

Ember

Meteor

Kendo

Polymer

Knockout

0 700 000 1 400 000

Page 41: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

КОНФЕРЕНЦИИ 2015

41

0

7,5

15

22,5

30

Кол-во докладов по фреймворкам

Angular React Ember Backbone Polymer Aurelia Meteor

Connect JS, US Frontporch.io, US Midwest JS, USFullStack, UK WebTech Conference, DE

Page 42: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

ТРЕНДЫ

42

Page 43: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

ТРЕНДЫ

43

Page 44: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

CODEANYWHERE(CLOUD IDE)

44

Page 45: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

РЫНОК ВАКАНСИЙ

45

0

125

250

375

500

Angular React Ember Backbone ExtJS Knockout Meteor

Кол-во резюме Кол-во вакансий

Page 46: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

ЧТО СМОТРИМ:

• AngularJS

• Ember

• Knockout

• Backbone.js + проекты-расширения

• React + Flux

• Dojo

• ExtJS 6 =)

46

Page 47: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

<CUT />: ЧТО НЕ ПОДОШЛО

• Backbone

• Ember

• Knockout

• Dojo

• ExtJS 6

47

Page 48: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

• Версия 1.*

• Хорошая модульность

• Нет единого стиля разработки

• Трудно дебажить

• Многовато «магии»

• Сложно интегрировать с новыми технологиями

• Код будет несовместим с версией 2.*

48

Page 49: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

Посмотрели 2.*

• Аж три языка — TypeScript, Javascript и Dart.

• Вот это выглядит как то, что надо.

• Сильно лучше версии 1.*

• Окей, надо разбираться…

49

Page 50: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

+ Понятный data flow

+ Структурность, понятный data flow, изолированность компонент

+ Когда-то в будущем будет популярным мейн-стримом

- Собственные шаблоны с кодом

- Все приложение работает как дерево компонентов, как таковых Controller’ов нет

- Непонятно, когда же оно зарелизится

50

Page 51: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

+ Не фреймворк, а UI-библиотека

+ структурность

+ понятный data flow, изолированность компонент

+ нет какого-то магического синтаксиса (кастомных атрибутов, фильтров)

+ понятная и простая возможность тюнинга производительности

? и даже серверный рендеринг

51

Page 52: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

+ Архитектура, но не фреймворк

+ one-way data flow, синхронная обработка

+ Как приложение делится на независимые блоки с помощью денормализации — понятно

+ Единый Event Bus (Dispatcher) и уникальные события — круто.

- Как обеспечивается динамика — непонятно

- Смешение концепций — Store’ы и хранят данные и реализуют бизнес-логику…

52

Page 53: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

• Кода от самого Facebook считай, почти нет.

• Посмотрели реальные фреймворки — fluxxor, DeLorean, ReFlux.js, Este.js:

– уже лучше, но все еще нет динамики

– видно общий прогресс стандартизации в виде ES6, npm-модулей, изоморфности и т. д.

– с разработкой веб-приложений беда… невозможно, например, создать два instance’а одного Store’а, чтобы они не воевали друг с другом.

– нет интернационализации

– нет примеров тестов

53

Page 54: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

Попутно прониклись Typescript

54

Page 55: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

TYPESCRIPT

Шанс уменьшить «креативность» разработчиков разных отделов

55

Page 56: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

КОНТРАКТЫ

56

Page 57: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

ИНТЕРФЕЙСЫ

Стандартизирует код + клей между разными частями приложения

57

Page 58: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

А ТАКЖЕ

• Дженерики

• Декораторы

• Составные типы

58

Page 59: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

В ИТОГЕ?

• Вопросов стало только больше =)

• «Серебряной пули» нет. В этом плане ExtJS «держит удар».

• Хотим фреймворк с Typescript!

59

Page 60: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

Сфокусируемся

60

Page 61: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

ВЕРНЕМСЯ К ЗАДАЧЕ

• JS-кодеры должны писать код, верстальщики — делать шаблоны

• Нужен проще UI слой, понятнее архитектура, четкое разделение (языков, технологий), больше границ, правил и стандартов.

• На Typescript

• Не являющийся монолитным монстром все-в-одном

61

Page 62: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

ПОРТИРУЕМ FLUX

• Взяли за основу Flux+React фреймворк Este.js, как наиболее инновационный.

• Плавно переписывали, пока за три захода от него не осталось ничего, кроме конфига сборщика.

62

Page 63: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

Трудности

63

Page 64: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

1. STORE’Ы

• Разные зоны ответственности

• Store -> область хранения данных (Store) и отдельно логика (Controller) (сообразно тому, куда идет развитие Flux)

64

Page 65: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

State, BizLogicState, BizLogic State, BizLogic, Ui logic

Model

View

Child View

SubController

SubController2

Child View

Controller

Server API

М С V

Примерно как было65

Page 66: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

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

Примерно как станет

Page 67: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

2. JSX

• JSX — это опять мешанина кода и HTML.

• Обратили внимание на wix-react-templates

• Написали свой похожий

67

Page 68: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

68

Шаблон

Page 69: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

69

JS-код шаблона

Page 70: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

70

UI-компонент

Page 71: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

2. JSX

• Появился TSX

• Второй вариант — ограничить применение кода в шаблонах, создав свои теги в TSX (это JSX в Typesript)

71

Page 72: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

3. ДИНАМИКА

• Нет динамического создания Store’ов и View-компонент.

• Как организовать независимую работу двух одинаковых блоков на одной странице?

72

Page 73: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

Что получилось?

73

Page 74: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

ПОЛУЧИЛОСЬ:

• Хороший ООП с интерфейсами и дженериками

• С dependency injection

• Только две внешние библиотеки — React и lodash

• Можно поменять что угодно

• С нормальной сборкой

74

Page 75: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

Битва «пилотов»75

vs.6

Page 76: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

БИТВА «ПИЛОТОВ»

• Обрезанная копия существующей админки «с нуля»:

– ExtJS 6 + TypeScript

– Flux + React + Typescript

• Сложности:

– анимации

– кастомный скроллбар

– интерфейс меняется для узких экранов

– мобильная версия

– JSON-REST API с авторизацией

76

Page 77: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

ЦИФРЫ*

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

* В реальном проекте разница в объемах кода и скорости инициализации будет меньше

77

Page 78: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

ПЛАНЫ

• Изучаем 2.0 beta

• Запиливаем первый боевой мини-проект, выбираем, что лучше

78

Page 79: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

Переход

79

Page 80: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

ТЕХНОЛОГИЯ МИГРАЦИИ

• Варианты:

– Новые проекты пишем на новом стеке.

– Старый код не трогаем, новый встраиваем целыми страницами, как iframe.

– При модификации старого кода — или правь, как есть, или портируй.

80

Page 81: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

81

Page 82: SECON'2016. Сергей Аверин. Javascript-фреймворки: должен остаться только один

СПАСИБО! ВОПРОСЫ?

82

@ryba_xek

ryba.xek

Слайды, предыдущие доклады:

http://averin.ru/slides/http://slideshare.net/[email protected]