100
DOM-шаблонизаторы не только «быстро» Июнь 2014 Роман Дворнов Ostrovok.ru

DOM-шаблонизаторы – не только "быстро"

  • Upload
    basisjs

  • View
    1.673

  • Download
    5

Embed Size (px)

DESCRIPTION

Шаблонизация основанная на работе с DOM становится трендом: React, Ractive, Basis.js уже используют этот подход, другие идут в эту сторону. Главным преимуществом подхода считается скорость, но оно далеко не единственное! В докладе немного рассказано о возможностях, что дает DOM подход.

Citation preview

Page 1: DOM-шаблонизаторы – не только "быстро"

DOM-шаблонизаторы – не только «быстро»

Июнь 2014

Роман Дворнов Ostrovok.ru

Page 2: DOM-шаблонизаторы – не только "быстро"

О себе• Работаю в ostrovok.ru • Автор basis.js

2

Page 3: DOM-шаблонизаторы – не только "быстро"

Сегодня мы создаем динамические интерфейсы

3

Page 4: DOM-шаблонизаторы – не только "быстро"

Динамические интерфейсы=

работа с DOM

4

Page 5: DOM-шаблонизаторы – не только "быстро"

Построение интерфейса =

создание DOM-фрагментов и их композиция

5

Page 6: DOM-шаблонизаторы – не только "быстро"

Что можно использовать для создания DOM-фрагментов?

6

Page 7: DOM-шаблонизаторы – не только "быстро"

Что можно использовать для создания DOM-фрагментов?

• Руки ;)

6

Page 8: DOM-шаблонизаторы – не только "быстро"

Что можно использовать для создания DOM-фрагментов?

• Руки ;)

• String-шаблонизаторы

6

Page 9: DOM-шаблонизаторы – не только "быстро"

Что можно использовать для создания DOM-фрагментов?

• Руки ;)

• String-шаблонизаторы

• DOM-шаблонизаторы

6

Page 10: DOM-шаблонизаторы – не только "быстро"

String vs. DOM

7

Page 11: DOM-шаблонизаторы – не только "быстро"

String-шаблонизаторы

8

Page 12: DOM-шаблонизаторы – не только "быстро"

Описание шаблона = набор строк + инструкции

9

Page 13: DOM-шаблонизаторы – не только "быстро"

10

<div class="entry"> <h1>{{title}}</h1> <div class="body"> {{body}} </div></div>

… + title +… + body +…

String-шаблонизаторыОписание (handlebars) Интерпретация

Page 14: DOM-шаблонизаторы – не только "быстро"

Не известно какая в итоге получится DOM-структура и как она будет меняться

11

Page 15: DOM-шаблонизаторы – не только "быстро"

Зато достаточно универсальный подход, а HTML частный случай

12

Page 16: DOM-шаблонизаторы – не только "быстро"

Строковые шаблонизаторы производят функции,

которые производят строки

13

Page 17: DOM-шаблонизаторы – не только "быстро"

После этого innerHTML + пост-процессинг

14

Page 18: DOM-шаблонизаторы – не только "быстро"

Пост-процессинг• Получение ссылок на элементы • Навешивание обработчиков событий • Модификация DOM

(использование jQuery-like плагинов, вставка DOM фрагментов etc)

• и т.д.

15

Page 19: DOM-шаблонизаторы – не только "быстро"

Пост-процессинг самая медленная фаза

16

Page 20: DOM-шаблонизаторы – не только "быстро"

Процесс

• герерация HTML • innerHTML • пост-процессинг

17

Создание Обновление

• генерация HTML • innerHTML • пост-процессинг

Page 21: DOM-шаблонизаторы – не только "быстро"

Процесс

• герерация HTML • innerHTML • пост-процессинг

17

Создание Обновление

• генерация HTML • innerHTML • пост-процессинг

=

Page 22: DOM-шаблонизаторы – не только "быстро"

DOM-шаблонизаторы

18

Page 23: DOM-шаблонизаторы – не только "быстро"

19

Описание шаблона = DOM узлы + инструкции

Page 24: DOM-шаблонизаторы – не только "быстро"

20

<div class="entry"> {{title}}</div>

DOM шаблонизаторы

Атрибут

Текстовый узел

Элемент

Page 25: DOM-шаблонизаторы – не только "быстро"

Известно какая будет DOM-структура и как будет

меняться

21

Page 26: DOM-шаблонизаторы – не только "быстро"

... еще до построения нативного DOM

22

Page 27: DOM-шаблонизаторы – не только "быстро"

Ориентированы на работу с DOM*

23

* Но не обязательно производят только DOM

Page 28: DOM-шаблонизаторы – не только "быстро"

DOM-шаблонизаторы производят и обслуживают

DOM-фрагменты

24

Page 29: DOM-шаблонизаторы – не только "быстро"

Знания о DOM структуре позволяют использовать

оптимизации

25

Page 30: DOM-шаблонизаторы – не только "быстро"

Например

• cloneNode(true) – быстрое создание DOM-фрагмента

• обработка событий через один глобальный capture-обработчик на документе для каждого уникального события

26

Page 31: DOM-шаблонизаторы – не только "быстро"

Процесс

• построение DOM-фрагмента или cloneNode(true)

• DOM-операции

27

Создание Обновление

• DOM-операции

Page 32: DOM-шаблонизаторы – не только "быстро"

Работают быстрее

28

Page 33: DOM-шаблонизаторы – не только "быстро"

Могут проигрывать при генерации больших

фрагментов неизменяемой верстки

29

Page 34: DOM-шаблонизаторы – не только "быстро"

Но выигрывают на генерации повторяющихся

фрагментов

30

Page 35: DOM-шаблонизаторы – не только "быстро"

TodoMVC

31

100 items 1000 items

AngularJS 125 ms 1491 ms

Backbone 53 ms 510 ms

Knockout 39 ms 489 ms

jQuery 20 ms 184 ms

Backbone + basis.js templates 18 ms 202 ms

basis.js 8 ms 95 ms

Page 36: DOM-шаблонизаторы – не только "быстро"

Всегда выигрывают на обновлении

32

Page 37: DOM-шаблонизаторы – не только "быстро"

Подробнее в докладе

Как построить DOM

33

tinyurl.com/build-dom

Page 38: DOM-шаблонизаторы – не только "быстро"

Уже используется в ...• Ractive • Basis.js • Ember: HTMLBars (в разработке) • Meteor • React*

34

* нет шаблонизатора, но внутри DOM-подход

Page 39: DOM-шаблонизаторы – не только "быстро"

Не холивара ради…

35

DOMString

Универсальное решение для сайтов и

приложений, подходит для сервера и клиента

Оптимально для больших динамических

одностраничных приложений

Page 40: DOM-шаблонизаторы – не только "быстро"

String-шаблонизаторы

36

Page 41: DOM-шаблонизаторы – не только "быстро"

DOM-шаблонизаторы

37

Page 42: DOM-шаблонизаторы – не только "быстро"

Развивая идеи DOM-шаблонизации…

38

На примере basis.js

Page 43: DOM-шаблонизаторы – не только "быстро"

Абстрагирование от верстки

39

Page 44: DOM-шаблонизаторы – не только "быстро"

В коде• Абстрагируемся от верстки

• Нет селекторов

• Нет указания CSS классов, имен тегов

• Нет HTML

• Нет стилей

40

Page 45: DOM-шаблонизаторы – не только "быстро"

Не знаем о разметке и как используются

значения

41

Page 46: DOM-шаблонизаторы – не только "быстро"

42

<div{el} class="example"> {text}</div>

{ el: <div>, text: #text, set: function(name, value){ // black magic box }}

Описание Интерфейс к экземпляру

Работаем с интерфейсом

Отдаем значения, но что там происходит не знаем

Page 47: DOM-шаблонизаторы – не только "быстро"

Не знаем какие классы в разметке, не используем селекторы в JavaScript

43

Page 48: DOM-шаблонизаторы – не только "быстро"

44

<div{el} class="example"> <h1>{text}</h1> <ul{content}/></div>

el = fragment.firstChildtext = el.firstChild.firstChildcontent = el.lastChild

Описание Получение ссылок

Жизнь без селекторов

(пути генерирует шаблонизатор)

Page 49: DOM-шаблонизаторы – не только "быстро"

Подключение стилей <b:style>

45

Page 50: DOM-шаблонизаторы – не только "быстро"

46

<b:style src="block.css"/>!

<div class="block block_{hidden}"> {caption}</div>

Подключение стилей

.block{ ...}.block_hidden{ ...}

block.cssblock.tmpl

Page 51: DOM-шаблонизаторы – не только "быстро"

Включение других шаблонов <b:include>

47

Page 52: DOM-шаблонизаторы – не только "быстро"

48

<b:style src="./example.css"/><div class="wrapper"> <b:include src="./button.tmpl"> <b:after ref="caption"> {count}</b:after> </b:include></div>

Включение шаблонов

Результат

example.tmpl

<b:style src="./button.css"/><b:style src="./example.css"/><div class="wrapper"> <button class="button"> {caption} {count} </button></div>

<b:style src="./button.css"/><button class="button"> {caption}</button>

button.tmpl

Page 53: DOM-шаблонизаторы – не только "быстро"

Изоляция стилей <b:isolate>

49

Page 54: DOM-шаблонизаторы – не только "быстро"

50

<b:style src="option.css"/>!

<div class="xo-bookings-change-status-popup-option xo-bookings-change-status-popup-option_{disabled} xo-bookings-change-status-popup-option_{hidden}"> <span class="xo-bookings-change-status-popup-option__caption xo-bookings-change-status-popup-option__caption_{selected}"> {title} </span></div>

До

Page 55: DOM-шаблонизаторы – не только "быстро"

51

<b:style src="option.css"/><b:isolate/>!

<div class="option {disabled} {hidden}"> <span class="caption caption_{selected}"> {title} </span></div>

После

Page 56: DOM-шаблонизаторы – не только "быстро"

В топку BEM?

52

Page 57: DOM-шаблонизаторы – не только "быстро"

В топку префиксы!

53

Page 58: DOM-шаблонизаторы – не только "быстро"

Но фишка не только в префиксах…

54

Page 59: DOM-шаблонизаторы – не только "быстро"

Переопределение стилей вместо добавления модификаторов

55

Page 60: DOM-шаблонизаторы – не только "быстро"

56

Безопасное дополнение стилей

<b:style src="./button.css"/><button class="button"> click me</div>

button.tmpl<b:isolate/><b:style> .button { color: green; }</b:style><b:include src="./button.tmpl"/>

ok-button.tmpl

<b:isolate/><b:style> .button { color: red; }</b:style><b:include src="./button.tmpl"/>

cancel-button.tmpl

Page 61: DOM-шаблонизаторы – не только "быстро"

57

<b:isolate/><b:style> .abc-foo { color: red; } .xyz-foo { color: blue; }</b:style><div class="panel"> <b:include src="./foo.tmpl" isolate="abc-"/> <b:include src="./foo.tmpl" isolate="xyz-"/></div>

Изоляция включений

<b:style src="./foo.css"/><div class="foo"> example</div>

example.tmpl foo.tmpl

Page 62: DOM-шаблонизаторы – не только "быстро"

58

Изоляция включений: результат<b:style src="./foo.css?prefix=hs83shyf_abc-"/><b:style src="./foo.css?prefix=hs83shyf_xyz-"/><b:style> .hs83shyf_abc-foo { color: red; } .hs83shyf_xyz-foo { color: blue; }</b:style><div class="hs83shyf_panel"> <div class="hs83shyf_abc-foo"> example </div> <div class="hs83shyf_xyz-foo"> example </div></div>

Page 63: DOM-шаблонизаторы – не только "быстро"

59

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

<b:style src="./bootstrap.css" ns="bt"/><b:style src="./glyphs.css" ns="glyph"/><b:style src="./style.css"/>!

<div class="glyph:active bt:active active"> ...</div>

(Побочный продукт методики)

Page 64: DOM-шаблонизаторы – не только "быстро"

Гарантия уникальности классов=

более сильные оптимизации

60

Page 65: DOM-шаблонизаторы – не только "быстро"

61

Например

<b:isolate/><b:style src="./style.css"/><div class="foo bar"> ..</div>

.foo { color: red; width: 100px;}.bar { color: green;}

example.tmpl style.css

Page 66: DOM-шаблонизаторы – не только "быстро"

62

Оптимизация: слияние стилей

<b:isolate/><b:style src="./style.css"/><div class="baz"> ..</div>

.baz { /* color: red; */ width: 100px; color: green;}

example.tmpl style.css

Page 67: DOM-шаблонизаторы – не только "быстро"

И мы продолжаем экспериментировать ;)

63

Page 68: DOM-шаблонизаторы – не только "быстро"

«Эээ… но у нас же есть Web Components…»

64

Кто-то из зала

Page 69: DOM-шаблонизаторы – не только "быстро"

Все таки их пока нет* ;)

65

* в процессе разработки и имплементации

Page 70: DOM-шаблонизаторы – не только "быстро"

Web Components – деклативная обертка для

инкапсулированных ресурсов (DOM, CSS, JS)

66

В моем понимании

Page 71: DOM-шаблонизаторы – не только "быстро"

В простом случае: !

1 DOM фрагмент +

DOM-манипуляции*

67

* мог бы делать шаблонизатор

Page 72: DOM-шаблонизаторы – не только "быстро"

В комплексном случае: !

Много фрагментов +

возвращаемся к проблеме шаблонизации

68

Page 73: DOM-шаблонизаторы – не только "быстро"

Web Components

69

Хорошо для виджетов (проигрыватели, карты и т.д)

Page 74: DOM-шаблонизаторы – не только "быстро"

Web Components

70

Не решает проблем самих компонент и приложений

Page 75: DOM-шаблонизаторы – не только "быстро"

Не совсем про шаблонизатор, но мы храним

шаблоны в отдельных файлах

71

И остальные тоже скоро будут так делать ;)

Page 76: DOM-шаблонизаторы – не только "быстро"

Абстрагирование +

внешние файлы =

Live update72

Page 77: DOM-шаблонизаторы – не только "быстро"

Live update – обновление DOM-фрагментов без перезагрузки страницы

73

Page 78: DOM-шаблонизаторы – не только "быстро"

74

<div class="sidebar"> ...

<ul class="list"> <li>item 1</li> <li>item 2</li> </ul> ...

</div>

<div class="list-wrapper"> <h2>Header</h2> <ul class="list"> </ul></div>

Замена DOM-фрагментаСтарый DOM Новый DOM

Page 79: DOM-шаблонизаторы – не только "быстро"

74

<div class="sidebar"> ...

<ul class="list"> <li>item 1</li> <li>item 2</li> </ul> ...

</div>

<div class="list-wrapper"> <h2>Header</h2> <ul class="list"> </ul></div>

insertBefore

Замена DOM-фрагментаСтарый DOM Новый DOM

Page 80: DOM-шаблонизаторы – не только "быстро"

74

<div class="sidebar"> ...

<ul class="list"> <li>item 1</li> <li>item 2</li> </ul> ...

</div>

<div class="list-wrapper"> <h2>Header</h2> <ul class="list"> </ul></div>

replaceChild

insertBefore

Замена DOM-фрагментаСтарый DOM Новый DOM

Page 81: DOM-шаблонизаторы – не только "быстро"

Live update экономит время и

разгоняет разработку

75

Page 82: DOM-шаблонизаторы – не только "быстро"

Live update +

Логика =

Адаптивные View76

Page 83: DOM-шаблонизаторы – не только "быстро"

Абстрагирование +

Наборы шаблонов =

Темы77

Page 84: DOM-шаблонизаторы – не только "быстро"

78

Результатbasis.template.theme('base').define({ foo: resource('path/to/file.tmpl'), ...});basis.template.theme('myTheme').define({ foo: resource('path/to/file.tmpl'), ...});!

var view = new basis.ui.Node({ template: basis.template.get('foo'), ...});

Набор шаблонов базовой темы

Еще одна тема

Использование шаблона по имени

Page 85: DOM-шаблонизаторы – не только "быстро"

Тема = HTML + CSS

79

Page 86: DOM-шаблонизаторы – не только "быстро"

Тоже без перезагрузки страницы

80

Но это побочный эффект ;)

Page 87: DOM-шаблонизаторы – не только "быстро"

Экземпляры шаблонов хранят мета-информацию*

81

* только в dev-режиме

Page 88: DOM-шаблонизаторы – не только "быстро"

Это дает возможность определять к какому шаблону

относится DOM-узел

82

Page 89: DOM-шаблонизаторы – не только "быстро"

Heat mapпоказывает где и

как часто меняется DOM

83

Page 90: DOM-шаблонизаторы – не только "быстро"

Demo

84

github.com/lahmatiy/template-demos

Page 91: DOM-шаблонизаторы – не только "быстро"

Вне шаблонизатора

85

Page 92: DOM-шаблонизаторы – не только "быстро"

Анализ и выявление проблем• какие классы используются в разметке, но их нет в стилях

• какие селекторы никогда не сработают

• конфликты стилей

• и т.д.

86

Page 93: DOM-шаблонизаторы – не только "быстро"

Оптимальная сборка• Минимизация классов

• Удаление разметки и стилей, которые не используются

• и т.д.

87

Page 94: DOM-шаблонизаторы – не только "быстро"

И многое другое…

88

Page 95: DOM-шаблонизаторы – не только "быстро"

И все благодаря DOM

89

Page 96: DOM-шаблонизаторы – не только "быстро"

В строковых шаблонизаторах многое из этого невозможно

или крайне сложно

90

Page 97: DOM-шаблонизаторы – не только "быстро"

DOM это круто!

91

Page 98: DOM-шаблонизаторы – не только "быстро"

Главное начать думать в терминах DOM

92

Page 99: DOM-шаблонизаторы – не только "быстро"

Попробуйте ;)

93

Page 100: DOM-шаблонизаторы – не только "быстро"

Вопросы?

94

Роман Дворнов @rdvornov [email protected]

basis.js basisjs.com

github.com/basisjs