90
1 HTML5 Web Components: следующий шаг к модульности вашего проекта Андрей Рахманов, Enaza

HTML5 Web Components: следующий шаг к модульности вашего проекта

Embed Size (px)

Citation preview

Page 1: HTML5 Web Components: следующий шаг к модульности вашего проекта

1

HTML5 Web Components: следующий шаг к модульности вашего проекта

Андрей Рахманов, Enaza

Page 2: HTML5 Web Components: следующий шаг к модульности вашего проекта

2

Page 3: HTML5 Web Components: следующий шаг к модульности вашего проекта

Как мы решили попробовать

3

Page 4: HTML5 Web Components: следующий шаг к модульности вашего проекта

Single-Page App

4

Page 5: HTML5 Web Components: следующий шаг к модульности вашего проекта

5

Page 6: HTML5 Web Components: следующий шаг к модульности вашего проекта

6

Page 7: HTML5 Web Components: следующий шаг к модульности вашего проекта

Код победил!

7

Page 9: HTML5 Web Components: следующий шаг к модульности вашего проекта

Google I/O 2014

<google-map></google-map>

9

Page 10: HTML5 Web Components: следующий шаг к модульности вашего проекта

10

Page 11: HTML5 Web Components: следующий шаг к модульности вашего проекта

Поиск подходящего решения

• Плохо сочетать Backbone.js с другими фреймворками

• Надо использовать native-реализацию или библиотеку

11

Page 12: HTML5 Web Components: следующий шаг к модульности вашего проекта

Составные части Web Components

• Templates

• HTML Imports

• Custom Elements

• Shadow DOM

12

Page 13: HTML5 Web Components: следующий шаг к модульности вашего проекта

Native: Пока весьма печально…

Templates

HTML Imports

Custom Elements

Shadow DOM

13

Page 14: HTML5 Web Components: следующий шаг к модульности вашего проекта

Polyfills: Уже лучше!

Templates

HTML Imports

Custom Elements

Shadow DOM

14

Page 15: HTML5 Web Components: следующий шаг к модульности вашего проекта

Что нам предлагают на текущий момент?

Bosonic

X-Tag (Mozilla)

Native

Polymer (Google)

15

Page 16: HTML5 Web Components: следующий шаг к модульности вашего проекта

Мы выбрали Polymer

• Декларативное описание элементов

• Удобный «синтаксический сахар» над нативнойреализацией

16

Page 17: HTML5 Web Components: следующий шаг к модульности вашего проекта

17

На пороге интеграции в существующий проект

Page 18: HTML5 Web Components: следующий шаг к модульности вашего проекта

Стек технологий

18

Page 19: HTML5 Web Components: следующий шаг к модульности вашего проекта

Стек технологий

19

Page 20: HTML5 Web Components: следующий шаг к модульности вашего проекта

Стек технологий

20

Page 21: HTML5 Web Components: следующий шаг к модульности вашего проекта

Как делаем мы

21

Page 22: HTML5 Web Components: следующий шаг к модульности вашего проекта

Чего ожидает от нас Polymer

<dom-module>

<style>

</style>

<template>

</template>

</dom-module>

<script>

</script>

Файл с компонентом

}

22

Page 23: HTML5 Web Components: следующий шаг к модульности вашего проекта

Подключаем один компонент

my-component

23

Page 24: HTML5 Web Components: следующий шаг к модульности вашего проекта

Подключаем один компонент

my-component

level_1_1

polymer.html

24

Page 25: HTML5 Web Components: следующий шаг к модульности вашего проекта

Подключаем один компонент

my-component

level_2_1

level_2_2

level_2_3

level_1_1

polymer.html

25

Page 26: HTML5 Web Components: следующий шаг к модульности вашего проекта

1 import == 6 запросов

а за ним пойдут…

26

Page 27: HTML5 Web Components: следующий шаг к модульности вашего проекта

Out-of-box: Polymer Vulcanize

27

Реализация:

Использование:

Page 28: HTML5 Web Components: следующий шаг к модульности вашего проекта

Можно ли ограничиться минимумом сетевых запросов?

vendor.js

app.js

28

Page 29: HTML5 Web Components: следующий шаг к модульности вашего проекта

Как положить всё в скрипты

???

vendor.jswebcomponents-lite.js

прочие библиотеки

polymer.html

app.js

<наши компоненты>.html

???29

Page 30: HTML5 Web Components: следующий шаг к модульности вашего проекта

Очевидное решение:Browserify Transform (polymerize)

30

Page 31: HTML5 Web Components: следующий шаг к модульности вашего проекта

Использовать - удобно

31

Page 32: HTML5 Web Components: следующий шаг к модульности вашего проекта

1) Требуется fix для Polymer:

2) Требуется HTML Inject:

Но реализация - неудачная

32

Page 33: HTML5 Web Components: следующий шаг к модульности вашего проекта

Что будет, если регистрировать веб-компонент из скрипта?

33

Page 34: HTML5 Web Components: следующий шаг к модульности вашего проекта

Результат

• Такой код неудобно поддерживать

• Нерешенный вопрос с подключением polymer.html

34

Page 35: HTML5 Web Components: следующий шаг к модульности вашего проекта

Итак, Vulcanize

polymer.html

component_1.html

component_2.html component_3.html

styles.css

script.js

35

Page 36: HTML5 Web Components: следующий шаг к модульности вашего проекта

Варианты подключения

36

components.html

?index.html

Page 37: HTML5 Web Components: следующий шаг к модульности вашего проекта

Внедрение в index.html

37

Меньше запросов

Сборкане кэшируется

Page 38: HTML5 Web Components: следующий шаг к модульности вашего проекта

HTML Import сборки

38

1 лишний запросне так страшен

Сборкакэшируется

Page 39: HTML5 Web Components: следующий шаг к модульности вашего проекта

Резюме

• Подключение компонентов в сборки JS –нестабильное решение

• Vulcanize снижает число сетевых запросов и решает проблему

39

Page 40: HTML5 Web Components: следующий шаг к модульности вашего проекта

40

Хочется удобства: подружим Polymer, Jade,

Stylus и Browserify

Page 41: HTML5 Web Components: следующий шаг к модульности вашего проекта

41

Page 42: HTML5 Web Components: следующий шаг к модульности вашего проекта

42

vulcanize

Page 43: HTML5 Web Components: следующий шаг к модульности вашего проекта

43

? vulcanize

Page 44: HTML5 Web Components: следующий шаг к модульности вашего проекта

Вот кто нам поможет!44

Page 45: HTML5 Web Components: следующий шаг к модульности вашего проекта

Gulp Task: Jade -> HTML

45

Page 46: HTML5 Web Components: следующий шаг к модульности вашего проекта

Gulp Task: Stylus -> CSS

46

Page 47: HTML5 Web Components: следующий шаг к модульности вашего проекта

Gulp Task: склеим 3 файла в 1

47

Page 48: HTML5 Web Components: следующий шаг к модульности вашего проекта

48

first.html

second.html

third.html

Page 49: HTML5 Web Components: следующий шаг к модульности вашего проекта

49

first.html

second.html

third.html

vulcanize

register_components.html

html imports:

first.htmlsecond.htmlthird.html

Page 50: HTML5 Web Components: следующий шаг к модульности вашего проекта

Этот реестр формирует Gulp

50

Page 51: HTML5 Web Components: следующий шаг к модульности вашего проекта

51

Управление JS-зависимостями

<script src="…"> VS require('module')

Page 52: HTML5 Web Components: следующий шаг к модульности вашего проекта

<script src="…"> VS require('module')

• Одного JS-файла в компоненте не хватает

• Почему не использовать <script src="…">?CommonJS удобнее!

• Polymer не поддерживает CommonJS.Как собрать самим?

52

Page 53: HTML5 Web Components: следующий шаг к модульности вашего проекта

* jQuery *

* plugins *

* lodash *

* Backbone *

vendor.js

expose external

app.js

external

components.htmlmain.js

module_1.js

* jQuery *не дублируется

53

Page 54: HTML5 Web Components: следующий шаг к модульности вашего проекта

Как сделать так, чтобы компоненты писались сами?

54

Page 55: HTML5 Web Components: следующий шаг к модульности вашего проекта

55

Page 56: HTML5 Web Components: следующий шаг к модульности вашего проекта

Резюме

• Web Components успешно интегрируются с имеющимися инструментами

• Gulp способен решить множество задач по сборке компонентов

• Создание нового компонента сводится к одной строке кода для генератора

56

Page 57: HTML5 Web Components: следующий шаг к модульности вашего проекта

57

Где применитьвеб-компоненты?

Page 58: HTML5 Web Components: следующий шаг к модульности вашего проекта

Декомпозиция Single-Page App

Переиспользуемые логические блоки

На высоком уровне

Расширение стандартных элементов управления

На низком уровне

58

Page 59: HTML5 Web Components: следующий шаг к модульности вашего проекта

59

Низкий уровень

Расширение стандартных элементов управления

Page 60: HTML5 Web Components: следующий шаг к модульности вашего проекта

Расширение стандартных элементов управления

• <input is="up-autoresizable" />- автоподстройка длины

• <input is="up-colorpicker" />- выбор цвета с альфа-каналом- указание цвета числом

• <up-textarea-count></..>- подсчет числа оставшихся символов

• <up-select></..>- иерархия- запрещенные значения в списке

60

Page 61: HTML5 Web Components: следующий шаг к модульности вашего проекта

<input is="up-autoresizable"/>

| наследование | от input

| подключение | плагина

| отключение | плагина

61

| зависимости через | Browserify

Page 62: HTML5 Web Components: следующий шаг к модульности вашего проекта

<input is="up-colorpicker"/>

62

| наследование | от input

| кастомное| событие

Page 63: HTML5 Web Components: следующий шаг к модульности вашего проекта

63

Page 64: HTML5 Web Components: следующий шаг к модульности вашего проекта

<up-textarea-count>

64

| Public API | для взаимодействия|||

Page 65: HTML5 Web Components: следующий шаг к модульности вашего проекта

65

Page 66: HTML5 Web Components: следующий шаг к модульности вашего проекта

<up-select>

66

| свойства| для биндинга|||||||

Page 67: HTML5 Web Components: следующий шаг к модульности вашего проекта

67

Page 68: HTML5 Web Components: следующий шаг к модульности вашего проекта

68

Высокий уровень

Переиспользуемыелогические блоки

Page 69: HTML5 Web Components: следующий шаг к модульности вашего проекта

Переиспользуемые логические блоки

<внешний блок (атрибуты…)>

<внутренний блок 1 (атрибуты…)>

<поле 1>

<поле 2>

<внутренний блок 2 (атрибуты…)>

<поле 1>

<поле 2>

69

Page 70: HTML5 Web Components: следующий шаг к модульности вашего проекта

Полигон для испытаний70

Page 71: HTML5 Web Components: следующий шаг к модульности вашего проекта

Полигон для испытаний71

Page 72: HTML5 Web Components: следующий шаг к модульности вашего проекта

<up-inspector>

<up-inspector-list label="Позиционирование"

<!– элементы управления -->

<up-inspector label="Свойства"…

<!– элементы управления -->

<up-inspector-list label="Отступы"

<!– элементы управления -->

<!– элементы управления -->

72

Page 73: HTML5 Web Components: следующий шаг к модульности вашего проекта

73

Page 74: HTML5 Web Components: следующий шаг к модульности вашего проекта

74

Page 75: HTML5 Web Components: следующий шаг к модульности вашего проекта

<up-sausage>

<up-state-marker />

<up-sausage type="full" inner-length="200" length="400" …

75

Page 76: HTML5 Web Components: следующий шаг к модульности вашего проекта

76

Page 77: HTML5 Web Components: следующий шаг к модульности вашего проекта

Резюме

• Web Components сильны на обоих уровнях

• Система превращается в набор логических блоков

• Полученный результат удобно поддерживать

77

Page 78: HTML5 Web Components: следующий шаг к модульности вашего проекта

Так здорово ли работать с веб-компонентами в реальном проекте?

78

Page 79: HTML5 Web Components: следующий шаг к модульности вашего проекта

79

Определенно, ДА!

Page 80: HTML5 Web Components: следующий шаг к модульности вашего проекта

Наиболее частые проблемы

• Не все документировано

• Возможны изменения API

• Мало информации на stackoverflowпо свежим версиям библиотек (…но это временно)

80

Page 81: HTML5 Web Components: следующий шаг к модульности вашего проекта

81

Перспективы развития

Page 82: HTML5 Web Components: следующий шаг к модульности вашего проекта

Если вы начинаете прямо сейчас и прямо с Polymer

0.5

0.9

1.0

Много готовых компонентов

База API для 1.0

Обещают уже летом!

82

Page 83: HTML5 Web Components: следующий шаг к модульности вашего проекта

Производительность polyfills (меньше - лучше)https://github.com/polymerlabs/benchmarks

83

Page 84: HTML5 Web Components: следующий шаг к модульности вашего проекта

webcomponents.org

84

Page 85: HTML5 Web Components: следующий шаг к модульности вашего проекта

customelements.io

85

Page 87: HTML5 Web Components: следующий шаг к модульности вашего проекта

Pluralsight - HTML5 Web Component Fundamentals

87

Page 88: HTML5 Web Components: следующий шаг к модульности вашего проекта

polymer-project.org

88

Page 89: HTML5 Web Components: следующий шаг к модульности вашего проекта

Резюме

• Интеграция в реальный проект – уже возможна

• Инструменты – активно развиваются

• Библиотеки уже сегодня имеют широкие возможности

• Вы получаете модульность, о которой можно только мечтать!

89

Page 90: HTML5 Web Components: следующий шаг к модульности вашего проекта

Андрей Рахманов[email protected]

Дмитрий Чертков[email protected]

goo.gl/qOuhYP

Попробуйте Web Components.Это вкусно!

90