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

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

  • Upload
    ontico

  • View
    892

  • Download
    3

Embed Size (px)

Citation preview

Page 1: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

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

Page 2: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

Про что докладКак выбирали новый веб-фреймворк

1. Немного о компании

2. Бекграунд

3. Задача

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

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

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

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

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

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

2

Page 3: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

3

Page 4: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

Про компанию

4

Page 5: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

Масштаб• 5 000 000 пользователей

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

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

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

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

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

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

5

Page 6: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

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

6

Page 7: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

Проблема

7

Page 8: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

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

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

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

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

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

8

Page 9: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

Задача

9

Page 10: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

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

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

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

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

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

10

Page 11: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

Оценка

11

Page 12: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

Что имеем?• Dojo

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

• Angular 1.x

• RoR+jQuery

• ExtJS 4

12

Page 13: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

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

13

395 классов

Page 14: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

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

Page 15: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

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

Page 16: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

16

Page 17: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

17

Page 18: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

18

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

Page 19: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

19

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

Page 20: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

layouting20

Page 21: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

layouting21

Page 22: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

deep in layouting code…

22

Page 23: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

deep in layouting code…

23

Page 24: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

Вы еще помните,что эта секция называется

«Производительность фронтенда»?

24

Page 25: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

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

Page 26: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

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

26

Page 27: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

Полезли в код приложения• Мало комментариев

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

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

27

Page 28: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

State, BizLogicState, BizLogic State, BizLogic, Ui logic

Model

View

Child View

SubController

SubController2

Child View

Controller

Server API

М С V

M+CV28

Page 29: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

Полезли в код приложения• Мало комментариев

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

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

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

29

Page 30: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

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

Page 31: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

31

Page 32: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

Вопрос на засыпку

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

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

32

Page 33: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

33

Page 34: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

34

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

Выводы…

Page 35: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

35

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

Выводы…

Page 36: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

Настоящие выводы• Очень сложный фреймворк

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

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

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

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

36

Page 37: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

Куда направить усилия?• нужен проще UI слой

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

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

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

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

37

Page 38: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

Второй вывод

«производительность фронтенда»:

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

Получаем производительность фронтенд-продуктов

38

Page 39: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

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

39

Page 40: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

…что нам подскажет интернет?

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

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

40

Page 41: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

Что нам подскажет интернет?

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

41

Page 42: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

Github

42

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

Angular

Backbone

Dojo

React

ExtJS

Yahoo UI

Ember

Meteor

Kendo

Polymer

Knockout

0 700 000 1 400 000

Page 43: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

Конференции 2015

43

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 44: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

Тренды

44

Page 45: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

Тренды

45

Page 46: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

Codeanywhere(cloud IDE)

46

Page 47: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

Рынок вакансий

47

0

125

250

375

500

Angular React Ember Backbone ExtJS Knockout Meteor

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

Page 48: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

Что смотрим:• AngularJS

• Ember

• Knockout

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

• React + Flux

• Dojo

• ExtJS 6 =)

48

Page 49: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

<cut />: что не подошло• Backbone

• Ember

• Knockout

• Dojo

• ExtJS 6

49

Page 50: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

Версия 1.*

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

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

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

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

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

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

50

Page 51: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

Посмотрели 2.0.0-alpha

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

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

• …только шансов на скорый релиз нет.

• …и везде в документации написано «предварительно»… …«может поменяться»…

51

Page 52: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

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

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

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

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

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

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

52

Page 53: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

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

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

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

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

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

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

53

Page 54: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

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

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

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

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

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

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

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

54

Page 55: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

Попутно нашли…

55

Page 56: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

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

56

Page 57: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

Контракты

57

Page 58: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

Интерфейсы

58

Page 59: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

А также• Дженерики

• Декораторы

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

59

Page 60: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

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

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

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

60

Page 61: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

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

61

Page 62: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

Вернемся к задаче• JS-кодеры должны писать код, верстальщики — делать

шаблоны

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

• На Typescript

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

62

Page 63: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

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

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

63

Page 64: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

Трудности

64

Page 65: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

1. Store’ы• Разные зоны ответственности

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

65

Page 66: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

State, BizLogicState, BizLogic State, BizLogic, Ui logic

Model

View

Child View

SubController

SubController2

Child View

Controller

Server API

М С V

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

Page 67: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

67

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 68: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

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

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

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

68

Page 69: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

69

Шаблон

Page 70: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

70

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

Page 71: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

71

UI-­‐компонент

Page 72: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

3. Переводы (i18n)• Все Flux-фреймворки обошли эту тему стороной

72

Page 73: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

73

Шаблон

Page 74: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

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

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

74

Page 75: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

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

75

Page 76: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

Получилось:• Хороший ООП с интерфейсами и дженериками

• С dependency injection

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

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

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

76

Page 77: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

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

vs.6

Page 78: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

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

• ExtJS 6 + TypeScript

• Flux + React + Typescript

Сложности:

• анимации

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

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

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

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

78

Page 79: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

Цифры*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

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

79

Page 80: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

Переход

80

Page 81: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

Оценка работы над UIА что понадобится?

• 60 простых

• 15 сложных

81

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

82

Page 83: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

Оценка работы над UI• 10% = 2000 строк кода HTML+CSS+TS

• Заняло 4 дня 1 человека

83

Page 84: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

Технология миграцииВарианты:

1. Новые проекты пишем на новом фреймворке.

2. Старый код не трогаем, новый встраиваем «независимыми блоками» — как iframe или кастомный UI-компонент для ExtJS.

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

84

Page 85: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

85

Page 86: Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)

Спасибо! Вопросы?

86

@ryba_xek

ryba.xek

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

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