Сергей Бережной "Экзотическая шаблонизация, или как...

100
руководитель отдела разработки поисковых интерфейсов Экзотическая шаблонизация или как писать HTML для блоков Сергей Бережной

Upload: yandex

Post on 05-Jul-2015

837 views

Category:

Technology


3 download

DESCRIPTION

Существует большое количество разных HTML-шаблонизаторов, и, зная это, мы написали свой, экзотический! Мы расскажем о том, что получилось в итоге и зачем мы это сделали. А также подробнее остановимся на синтаксисе, семантике, оптимизации и компиляции шаблонов в эффективный JavaScript.

TRANSCRIPT

Page 8: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

Классика

8

Page 9: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

{ settings: { weather: true, traffic: false }, weather: { temp: 4 }, traffic: { level: 2 }}

Классика

9

Page 10: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

<ul> [% IF settings.weather %] <li>[% weather.temp %]</li> [% END %] [% IF settings.traffic %] <li>[% traffic.level %]</li> [% END %]</ul>

Классика

10

Page 11: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

Data → HTML

Классика

11

Page 12: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

Альтернатива

Основная часть

Page 13: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

{ settings: { weather: true, traffic: false }, weather: { temp: 4 }, traffic: { level: 2 }}

Альтернатива

13

Page 14: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

var items = [];

if(settings.weather) items.push({ elem: 'item', content: weather.temp });

if(settings.traffic) items.push({ elem: 'item', content: traffic.level });

return { block: 'menu', content: items };

Альтернатива

14

Page 15: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

{ block: 'menu', content: [ { elem: 'item', content: 4 } ]}

Альтернатива

15

Page 16: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

block menu { tag: 'ul' elem item, tag: 'li'}

Альтернатива

16

Page 17: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

<ul class="menu"> <li class="menu__item"> +4 °С </li></ul>

Альтернатива

17

Page 18: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

Data → View → HTML

Альтернатива

18

Page 19: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

Data → БЭМ-дерево → HTML

Альтернатива

19

Page 20: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

Data → БЭМ-дерево ⤙BEMHTML⤚ HTML

Альтернатива

20

Page 22: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

Альтернатива

• блоки рисуются сами• не нужна интеграция нового HTML в шаблоны

22

Page 23: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

<ul> [% IF settings.weather %] <li>[% weather.temp %]</li> [% END %] [% IF settings.traffic %] <li>[% traffic.level %]</li> [% END %]</ul>

Альтернатива

23

Page 24: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

Альтернатива

• блоки рисуются сами• не нужна интеграция нового HTML в шаблоны• можно прототипировать HTML/CSS без реальных данных

24

Page 25: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

Data → БЭМ-дерево → HTML

Альтернатива

25

Page 26: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

Data → БЭМ-дерево → HTML

Альтернатива

26

Page 27: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

Альтернатива

• блоки рисуются сами• не нужна интеграция нового HTML в шаблоны• можно прототипировать HTML/CSS без реальных данных• меньше копипаста, больше повторного использования

27

Page 28: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

<ul> [% IF settings.weather %] <li>[% weather.temp %]</li> [% END %] [% IF settings.traffic %] <li>[% traffic.level %]</li> [% END %]</ul>

Альтернатива

28

Page 29: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

block menu { tag: 'ul' elem item, tag: 'li'}

Альтернатива

29

Page 30: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

Альтернатива

• блоки рисуются сами• не нужна интеграция нового HTML в шаблоны• можно прототипировать HTML/CSS без реальных данных• меньше копипаста, больше повторного использования• очень похоже на CSS

30

Page 31: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

block menu { tag: 'ul' elem item, tag: 'li'}

Альтернатива

31

Page 32: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

/* CSS */.header { font-size: 140%;}

// BEMHTMLblock header, tag: 'h1'

Альтернатива

32

Page 33: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

Файлы

Основная часть

Page 34: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

blocks/

Файлы

34

Page 35: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

blocks/ header/ menu/

Файлы

35

Page 36: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

blocks/ header/ menu/ __item/

Файлы

36

Page 37: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

blocks/ header/ header.css menu/ __item/ menu__item.css menu.css

Файлы

37

Page 38: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

blocks/ header/ header.css header.bemhtml menu/ __item/ menu__item.css menu__item.bemhtml menu.css menu.bemhtml

Файлы

38

Page 39: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

blocks/pages/

Файлы

39

Page 40: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

blocks/pages/ index/

Файлы

40

Page 41: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

blocks/pages/ index/ index.css

Файлы

41

Page 42: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

pages/index/index.css

@import url(../../blocks/header/header.css);@import url(../../blocks/menu/menu.css);@import url(../../blocks/menu/__item/menu__item.css);

Файлы

42

Page 43: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

bem build --output-name=index --decl=pages/index/index.bemdecl.js --level=blocks/ --tech=css

Файлы

43

Page 44: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

blocks/pages/ index/ index.bemdecl.js // декларация

Файлы

44

Page 45: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

bem build --output-name=index --decl=pages/index/index.bemdecl.js --level=blocks/ --tech=css --tech=bemhtml

Файлы

45

Page 46: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

blocks/pages/ index/ index.bemdecl.js // декларация

Файлы

46

Page 47: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

blocks/pages/ index/ index.bemdecl.js // декларация index.css // сборка index.bemhtml.js // сборка

Файлы

47

Page 48: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

bem.info/tools/bem

Файлы

48

Page 49: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

Переопределения

Основная часть

Page 50: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

/* CSS */.header { font-size: 140%; font-weight: bold;}

Переопределения

50

Page 51: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

<!-- HTML --><h1 class="header"> Заголовок 1</h1>

Переопределения

51

Page 52: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

// BEMHTMLblock header, tag: 'h1'

Переопределения

52

Page 53: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

blocks/ header/ header.css header.bemhtml

Переопределения

53

Page 54: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

/* CSS */

.header { font-size: 140%; font-weight: bold;}

.header_level_2 { font-size: 120%;}

Переопределения

54

Page 55: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

blocks/ header/ _level/ header_level_2.css header.css

Переопределения

55

Page 56: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

<!-- HTML --><h2 class="header header_level_2"> Заголовок 2</h2>

Переопределения

56

Page 57: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

// BEMHTML

block header, tag: 'h1'

block header, mod level 2, tag: 'h2'

Переопределения

57

Page 58: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

blocks/ header/ _level/ header_level_2.css header_level_2.bemhtml header.css header.bemhtml

Переопределения

58

Page 59: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

pages/index/index.css

@import url(../../blocks/header/header.css);@import url(../../blocks/header/_level/header_level_2.css);

Переопределения

59

Page 60: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

mylib/ blocks/ header/ _level/ header_level_2.css header_level_2.bemhtml header.css header.bemhtml

Переопределения

60

Page 61: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

mylib/ blocks/ header/ _level/ header_level_2.css header_level_2.bemhtml header.css header.bemhtmlblocks/

Переопределения

61

Page 62: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

/* CSS */.header { font-weight: normal;}

Переопределения

62

Page 63: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

<!-- HTML -->

<h2 class="header"> Заголовок 1</h2>

<h3 class="header header_level_2"> Заголовок 2</h3>

Переопределения

63

Page 64: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

// BEMHTML

block header, tag: 'h2'

block header, mod level 2, tag: 'h3'

Переопределения

64

Page 65: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

mylib/blocks/ header/ _level/ header_level_2.bemhtml header.css header.bemhtml

Переопределения

65

Page 66: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

bem build --output-name=index --decl=pages/index/index.bemdecl.js --level=blocks/ --tech=css --tech=bemhtml

Переопределения

66

Page 67: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

bem build --output-name=index --decl=pages/index/index.bemdecl.js --level=mylib/blocks/ --level=blocks/ --tech=css --tech=bemhtml

Переопределения

67

Page 68: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

pages/index/index.css

@import url(../../mylib/blocks/header/header.css);@import url(../../blocks/header/header.css);

Переопределения

68

Page 69: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

Многопроходность

Основная часть

Page 70: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

<ul class="menu"> <li class="menu__item"> +4 °С </li></ul>

Многопроходность

70

Page 71: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

{ block: 'menu', content: [ { elem: 'item', content: 4 } ]}

Многопроходность

71

Page 72: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

block menu { tag: 'ul' elem item, tag: 'li'}

Многопроходность

72

Page 73: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

<ul class="menu"> <li class="menu__item"> <span class="menu__item-wrap"> +4 °С </span> </li></ul>

Многопроходность

73

Page 74: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

block menu { tag: 'ul' elem item, tag: 'li' elem item-wrap, tag: 'span'}

Многопроходность

74

Page 75: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

{ block: 'menu', content: [ { elem: 'item', content: { elem: 'item-wrap', content: 4 } } ]}

Многопроходность

75

Page 76: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

block menu { tag: 'ul' elem item { tag: 'li' content: { elem: 'item-wrap', content: applyNext() } } elem item-wrap, tag: 'span'}

Многопроходность

76

Page 77: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

{ block: 'menu', content: [ { elem: 'item', content: 4 } ]}

Многопроходность

77

Page 78: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

<ul class="menu"> <li class="menu__item"> <span class="menu__item-wrap"> +4 °С </span> </li></ul>

Многопроходность

78

Page 79: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

JavaScript

Основная часть

Page 80: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

JavaScript

80

Page 81: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

JavaScript

81

Page 82: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

{ block: 'ya-user', content: 'veged'}

JavaScript

82

Page 83: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

<a class="ya-user" href="//i.yandex.ru"> <span class="ya-user__first"> v </span> eged</a>

JavaScript

83

Page 84: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

block ya-user { tag: 'a' attrs: { href: '//i.yandex.ru' }

elem first, tag: 'span'}

JavaScript

84

Page 85: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

{ block: 'ya-user', content: [ { elem: 'first', content: 'v' }, 'eged' ]}

JavaScript

85

Page 86: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

block ya-user, content: { var oldContent = applyNext(); return [ { elem: 'first', content: oldContent[0] }, oldContent.substring(1) ]}

JavaScript

86

Page 87: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

{ block: 'ya-user', content: 'veged'}

JavaScript

87

Page 88: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

<a class="ya-user" href="//i.yandex.ru"> <span class="ya-user__first"> v </span> eged</a>

JavaScript

88

Page 89: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

Скорость

Основная часть

Page 90: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

github.com/veged/xjst

Скорость

90

Page 92: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

Secinājums

• декларативность

92

Page 93: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

Secinājums

• декларативность• блоки рисуются сами

92

Page 94: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

Secinājums

• декларативность• блоки рисуются сами• переопределения

92

Page 95: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

Secinājums

• декларативность• блоки рисуются сами• переопределения• многопроходность

92

Page 96: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

Secinājums

• декларативность• блоки рисуются сами• переопределения• многопроходность• БЭМ

92

Page 97: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

Secinājums

• существуют другие способы писать шаблоны

93

Page 98: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

Secinājums

• существуют другие способы писать шаблоны• попробовать БЭМ: github.com/bem/project-stub

93

Page 99: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

Secinājums

• существуют другие способы писать шаблоны• попробовать БЭМ: github.com/bem/project-stub• попробовать: XSLT, XJST, написать своё

93

Page 100: Сергей Бережной "Экзотическая шаблонизация, или как писать HTML для блоков"

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

[email protected]

Спасибо

Сергей Бережной

@veged

github.com/veged