Компонентный подход: скучно, неинтересно,...

78
Компонентный подход: cкучно, неинтересно, бесперспективно Роман Дворнов Ostrovok.ru Самара, 2013

Upload: basisjs

Post on 15-Jun-2015

2.026 views

Category:

Technology


1 download

DESCRIPTION

Использование компонентного подхода это тяжеловесно, медленно, не гибко. Так ли это? Доклад с фестиваля 404, Самара, 13 октября 2013 Видео: https://www.youtube.com/watch?v=QpZy0WW0Ig4

TRANSCRIPT

Page 1: Компонентный подход: скучно, неинтересно, бесперспективно

Компонентный подход:cкучно, неинтересно, бесперспективно

Роман ДворновOstrovok.ruСамара, 2013

Page 2: Компонентный подход: скучно, неинтересно, бесперспективно

2

Page 3: Компонентный подход: скучно, неинтересно, бесперспективно

Немного о себе

• Работаю в Ostrovok.ru

• Ранее руководилвеб-разработкой в ПС Единый кошелек

• Автор и мейтейнер фреймворка basis.js

3

Page 4: Компонентный подход: скучно, неинтересно, бесперспективно

Веб-приложения

4

Page 5: Компонентный подход: скучно, неинтересно, бесперспективно

Это практично, удобно и воcтребовано

5

Page 6: Компонентный подход: скучно, неинтересно, бесперспективно

Все больше сайтов становятся SPA*

6

* Single page application

Page 7: Компонентный подход: скучно, неинтересно, бесперспективно

Как делать?

7

Page 8: Компонентный подход: скучно, неинтересно, бесперспективно

jQuery style

8

Zepto, KnockoutJS, etc.

Page 9: Компонентный подход: скучно, неинтересно, бесперспективно

Предназначены для декорация сайтов, а не для разработки приложений

9

Page 10: Компонентный подход: скучно, неинтересно, бесперспективно

Да, можно использовать для приложений

10

Page 11: Компонентный подход: скучно, неинтересно, бесперспективно

Но лучше не стоит ;)

11

Page 12: Компонентный подход: скучно, неинтересно, бесперспективно

Работа «мечты»

12

Page 13: Компонентный подход: скучно, неинтересно, бесперспективно

MVC

13

Page 14: Компонентный подход: скучно, неинтересно, бесперспективно

Определены роли и разделена

ответственность

14

Page 15: Компонентный подход: скучно, неинтересно, бесперспективно

Примерно так

15

(из википедии)

Page 16: Компонентный подход: скучно, неинтересно, бесперспективно

Каждый понимает по-своему

16

Page 17: Компонентный подход: скучно, неинтересно, бесперспективно

Не определен подход к декомпозиции

17

Page 18: Компонентный подход: скучно, неинтересно, бесперспективно

Много вопросов

18

• Как поступать со сложносоставными моделями?

• Как разбивать большие view на части?

• Часто не понятно, кто должен отвечать за функциональность

Page 19: Компонентный подход: скучно, неинтересно, бесперспективно

Пример

19

Page 20: Компонентный подход: скучно, неинтересно, бесперспективно

Это все одно view

20

Page 21: Компонентный подход: скучно, неинтересно, бесперспективно

В цифрах

• 1 JavaScript файл на 4500+ строк

• 150+ методов

• 150+ свойств

21

Page 22: Компонентный подход: скучно, неинтересно, бесперспективно

22

Page 23: Компонентный подход: скучно, неинтересно, бесперспективно

«Это может случиться даже с лучшими из нас»

23

Page 24: Компонентный подход: скучно, неинтересно, бесперспективно

24

Понять и простить...

Page 25: Компонентный подход: скучно, неинтересно, бесперспективно

Компонентный подход

25

Page 26: Компонентный подход: скучно, неинтересно, бесперспективно

«Component-based software engineering (CBSE) ... is a reuse-based approach

to defining, implementing and composing loosely coupled independent components

into systems...»

26

http://en.wikipedia.org/wiki/Software_component

Page 27: Компонентный подход: скучно, неинтересно, бесперспективно

Слабые связи и декомпозиция

27

Page 28: Компонентный подход: скучно, неинтересно, бесперспективно

Обычный подход

28

list

item

item

item

item

item

Page 29: Компонентный подход: скучно, неинтересно, бесперспективно

Компонентный подход

29

list item

item

item

item

item

Page 30: Компонентный подход: скучно, неинтересно, бесперспективно

Обычный подход

30

window

form

field

field

button panel

button button

Page 31: Компонентный подход: скучно, неинтересно, бесперспективно

Компонентный подход

31

window formfield

field

button panel

button button

Page 32: Компонентный подход: скучно, неинтересно, бесперспективно

Фреймворки

32

Page 33: Компонентный подход: скучно, неинтересно, бесперспективно

Компонентные фреймворки

33

• Dojo Toolkit

• qooxdoo

• YUI

• Ext.js (Sencha)

• Google Closure

Page 34: Компонентный подход: скучно, неинтересно, бесперспективно

Преимущество

34

Page 35: Компонентный подход: скучно, неинтересно, бесперспективно

Недостатки• Сложные – необъятное API, много классов, свойств и пр.

• Большой объем (ext-all.js min ~1.5 MB)

• Медленные• Сложно кастомизировать, переопределять поведение и стили

• Слишком большие для простых приложений

35

Page 36: Компонентный подход: скучно, неинтересно, бесперспективно

Эти факторы сформировали

негативное отношение к компонентному походу

36

Page 37: Компонентный подход: скучно, неинтересно, бесперспективно

Фреймворки меняются к лучшему, но недостаточно сильно, чтобы изменить устоявшееся мнение

37

Page 38: Компонентный подход: скучно, неинтересно, бесперспективно

Почему так получилось?

38

Page 39: Компонентный подход: скучно, неинтересно, бесперспективно

Время появления фреймворков

• Dojo Toolkit – 2004

• qooxdoo – 2005

• YUI – 2006

• Ext.js – 2007

39

Page 40: Компонентный подход: скучно, неинтересно, бесперспективно

Не было понимания как делать веб-приложения, но был опыт разработки

desktop-приложений

40

Page 41: Компонентный подход: скучно, неинтересно, бесперспективно

Desktop IDE

41

Borland Delphi 6

Page 42: Компонентный подход: скучно, неинтересно, бесперспективно

Особенности• Для отрисовки нужно работать с GDI и другими системными API

• Управление памятью• Компилируемые языки и статическая типизация

• Для упрощения множество классов были объеденены в единое целое и представлялись одним компонентом

42

Page 43: Компонентный подход: скучно, неинтересно, бесперспективно

Настройка компонент

43

Page 44: Компонентный подход: скучно, неинтересно, бесперспективно

Сложность отрисовки

44

Много свойств, отвечающих за внешний вид

Page 45: Компонентный подход: скучно, неинтересно, бесперспективно

Разработчики фреймворков не стали изобретать новых подходов

45

Page 46: Компонентный подход: скучно, неинтересно, бесперспективно

Сложности перевода

46

• Отсутсвие в javascript приватных свойств (private, protected etc), getters/setters*→ большое количество свойств и сложное API

• В javascript используется прототипное наследование→ эмуляция классической модели в ущерб производительности

* стандартизированы только в ES5

Page 47: Компонентный подход: скучно, неинтересно, бесперспективно

Наследство

• Подходы к построению API, именованию

• Структура компонент• Большие компоненты• Стилизация в коде

47

Page 48: Компонентный подход: скучно, неинтересно, бесперспективно

Эти факторы определили первоначальный вид компонентных фреймворков

48

Page 49: Компонентный подход: скучно, неинтересно, бесперспективно

А сейчас большинству мешает тяжелоенаследие

49

Page 50: Компонентный подход: скучно, неинтересно, бесперспективно

Все ли так плохо?

50

Page 51: Компонентный подход: скучно, неинтересно, бесперспективно

1. Сложность

51

Page 52: Компонентный подход: скучно, неинтересно, бесперспективно

Основа компонент

52

Фреймворк Класс Кол-во свойств

qooxdoo qx.ui.core.Widget 538

ext.js Ext.Component 391

YUI Y.Widget 180

Google Closure goog.ui.Containergoog.ui.Control

164172

basis.js basis.ui.Node 126

Dojo dijit._Widget 87

Page 53: Компонентный подход: скучно, неинтересно, бесперспективно

Строим дерево

53

Page 54: Компонентный подход: скучно, неинтересно, бесперспективно

Ext.js

• Больше часа, чтобы разобраться

• Примеры не помогают

• Вручную дерево не построить, только через store или «хитрым» методом, найденым методом научного тыка

54

Page 55: Компонентный подход: скучно, неинтересно, бесперспективно

Google Сlosure

• ~20 минут чтобы разобраться

• Помог пример• +15 мин чтобы оптимизировать и уменьшить время вдвое (можно манипулировать узлами)

55

Page 56: Компонентный подход: скучно, неинтересно, бесперспективно

qooxdoo

• Не взлетел Потребовалась "помощь из зала"• Чтобы сделать приложение надо использовать инструменты на python (!)

• Примеры в скомпилированом виде

• Примеров мало

56

Page 57: Компонентный подход: скучно, неинтересно, бесперспективно

Dojo

• Очень сложно• Запутанная документация и примеры• Кое как получилось построить дерево, но не получилось разобраться как его менять

57

Page 58: Компонентный подход: скучно, неинтересно, бесперспективно

basis.js

• Ну вы понимаете ;)

• Есть примеры• Документация пишется (готово ~30%)

• Сам интерфейс – большое дерево

• Можно быстро собрать собственное дерево используя basis.ui.Node

58

Page 59: Компонентный подход: скучно, неинтересно, бесперспективно

basis.ui.Node• listener, состояние, синхронизация, подписка

• хранение данных, привязка данных• управление дочерними узлами• сортировка, группировка• selection, disabled/enabled

• взаимодействие с шаблоном59

Page 60: Компонентный подход: скучно, неинтересно, бесперспективно

2. Размер сборки

60

Page 61: Компонентный подход: скучно, неинтересно, бесперспективно

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

зависимостей

61

Page 62: Компонентный подход: скучно, неинтересно, бесперспективно

В сборку попадает только то, что используется

в проекте

62

Page 63: Компонентный подход: скучно, неинтересно, бесперспективно

Сравниваем

63

Page 64: Компонентный подход: скучно, неинтересно, бесперспективно

TodoMVC

• Ext.js – 1.2 MB фреймворк + уже неважно ;)

• YUI – 300 KB

• Dojo – 298 KB

• basis.js – 152 KB

• Google Closure – 55 KB

64

Page 65: Компонентный подход: скучно, неинтересно, бесперспективно

TodoMVC

• Ember.js – 403 KB

• Knockback – 197 KB

• jQuery (+handlebars) – 133 KB

• backbone.js – 132 KB

• AngularJS – 83 KB

• KnockoutJS – 52 KB

65

Page 66: Компонентный подход: скучно, неинтересно, бесперспективно

3. Производительность

66

Page 67: Компонентный подход: скучно, неинтересно, бесперспективно

Построение дерева

67

Фреймворк 100 листьев 2000 листьев

qooxdoo 131* ms 3024* ms

Ext.js 52 ms 859 ms

Google Closure 13 ms 216 ms

basis.js 3 ms 68 ms

* не включает рендеринг

Page 68: Компонентный подход: скучно, неинтересно, бесперспективно

TodoMVC

68

100 todo 1000 todo

AngularJS 125 ms 1491 ms

Backbone.js 53 ms 523 ms

Knockout 39 ms 489 ms

vanilla 23 ms 1882 ms

jQuery 20 ms 184 ms

basis.js 8 ms 95 ms

Page 69: Компонентный подход: скучно, неинтересно, бесперспективно

Заключение

69

Page 70: Компонентный подход: скучно, неинтересно, бесперспективно

Все еще нет четкого понимания как должны быть устроенны веб-приложения

70

Page 71: Компонентный подход: скучно, неинтересно, бесперспективно

Веб-приложения – это не просто сайт, но и desktop практикинеэффективны

71

Page 72: Компонентный подход: скучно, неинтересно, бесперспективно

jQuery, knockout, Backbone.js, AngularJS,

Ember.js и др.

72

Становятся все больше и сложнее, приводят к неэффективным

решениям

Page 73: Компонентный подход: скучно, неинтересно, бесперспективно

Ext.js, Dojo, YUI, Google Closure, qooxdoo и др.

73

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

Page 74: Компонентный подход: скучно, неинтересно, бесперспективно

Изучайте компонентный подход!

74

Page 75: Компонентный подход: скучно, неинтересно, бесперспективно

Используйте

75

Page 76: Компонентный подход: скучно, неинтересно, бесперспективно

Творите

76

Page 77: Компонентный подход: скучно, неинтересно, бесперспективно

Это круто! ;)

77