Про шаблонизаторы вообще
и BEMHTML в частности
Сергей Бережной
руководитель отдела
разработки поисковых интерфейсов

Я.Субботник, Москва, 8 сентября 2012 года
про шаблонизаторЫ
                вообще


     и
    BEMHTML
в частности
Шаблонизаторы вообще…




3
Шаблонизаторы вообще
Задачи




4
Шаблонизаторы вообще
Задачи
— HTML




5
Шаблонизаторы вообще
Задачи
— HTML
— текст




6
Шаблонизаторы вообще
Задачи
— HTML
— текст
— DOM




7
Шаблонизаторы вообще
Многообразие видов
Шаблонизаторы вообще
Многообразие видов
— по семантике




9
Шаблонизаторы вообще
Многообразие видов
— по семантике
     — интерполяция строк




10
Шаблонизаторы вообще
Многообразие видов
— по семантике
     — интерполяция строк



 "Шоколад ни в чем не виноват, %username%."




11
Шаблонизаторы вообще
Многообразие видов
— по семантике
     — интерполяция строк
       – Mustache
       – Handlebars
       – Dust
       – Jade
       – …
12
Шаблонизаторы вообще
Многообразие видов
— по семантике
     — интерполяция строк
     — data bind




13
Шаблонизаторы вообще
Многообразие видов
— по семантике
     — data bind
var html = 'Шоколад ни в чем не виноват,'
    + '<span class="name"/>.'
  , data = { username: 'John Smith' }
  , map = plates.Map();

map.class('name').to('username');
plates.bind(html, data, map);

14
Шаблонизаторы вообще
Многообразие видов
— по семантике
     — интерполяция строк
     — data bind
       – Flatiron.js templates
       – Transparency
       – Angular.js
       – Pure
15
Шаблонизаторы вообще
Многообразие видов
— по семантике
     — интерполяция строк
     — data bind
     — live data bind




16
Шаблонизаторы вообще
Многообразие видов
— по семантике
     — интерполяция строк
     — data bind
     — live data bind
       – Knockout.js




17
Шаблонизаторы вообще
Многообразие видов
— по семантике
     — интерполяция строк
     — data bind
     — live data bind
     — data driven




18
Шаблонизаторы вообще
Многообразие видов
— по семантике
     — data driven
 <xsl:template match="username">
     <span class="name">
         <xsl:apply-templates/>
     </span>
 </xsl:template>


19
Шаблонизаторы вообще
Многообразие видов
— по семантике
     — data driven
 <xsl:template match="username">
     <span class="name">
         <xsl:apply-templates/>
     </span>
 </xsl:template>

 Шоколад ни в чем не виноват, <username>John Smith</username>.
 Вы просто созданы для лепрозория, <username>veged</username>!



20
Шаблонизаторы вообще
Многообразие видов
— по семантике
     — data driven
 Шоколад ни в чем не виноват, <span class="name">John Smith</span>.
 Вы просто созданы для лепрозория, <span class="name">veged</span>!




21
Шаблонизаторы вообще
Многообразие видов
— по семантике
     — интерполяция строк
     — data bind
     — live data bind
     — data driven
       – XSLT
       – BEMHTML
22
Шаблонизаторы вообще
Многообразие видов
— по семантике
— по синтаксису




23
Шаблонизаторы вообще
Многообразие видов
— по семантике
— по синтаксису
     — текст в финальном виде + вставки




24
Шаблонизаторы вообще
Многообразие видов
— по семантике
— по синтаксису
     — текст в финальном виде + вставки

 <span class="name">[% username %]</span>




25
Шаблонизаторы вообще
Многообразие видов
— по семантике
— по синтаксису
     — текст в финальном виде + вставки
     — сокращённый синтаксис




26
Шаблонизаторы вообще
Многообразие видов
— по семантике
— по синтаксису
     — сокращённый синтаксис

 span.name #{username}



27
Шаблонизаторы вообще
Многообразие видов
— по семантике
— по синтаксису
     — текст в финальном виде + вставки
     — сокращённый синтаксис
     — предметно-ориентированный синтаксис




28
Шаблонизаторы вообще
Многообразие видов
— по семантике
— по синтаксису
     — предметно-ориентированный синтаксис
<xsl:template match="username">
    <span class="name">
        <xsl:apply-templates/>
    </span>
</xsl:template>


29
Шаблонизаторы вообще
Многообразие видов
— по семантике
— по синтаксису
     — предметно-ориентированный синтаксис
var html = 'Шоколад ни в чем не виноват,<span class="name"/>.'
  , data = { username: 'John Smith' }
  , map = plates.Map();

map.class('name').to('username');
plates.bind(html, data, map);



30
Шаблонизаторы вообще
Многообразие видов
— по семантике
— по синтаксису
— по базовому языку




31
Шаблонизаторы вообще
Многообразие видов
— по семантике
— по синтаксису
— по базовому языку
     — один базовый язык




32
Шаблонизаторы вообще
Многообразие видов
— по семантике
— по синтаксису
— по базовому языку
     — один базовый язык
     — компилируется в несколько языков




33
Шаблонизаторы вообще
Многообразие видов
— по семантике
— по синтаксису
— по базовому языку




34
…и BEMHTML в частности




35
…и BEMHTML в частности
Задачи




36
…и BEMHTML в частности
Задачи
…и BEMHTML в частности
Задачи
— разделение HTML и логики представления




38
…и BEMHTML в частности
Задачи
— разделение HTML и логики представления
— гибкая библиотека блоков




39
…и BEMHTML в частности
Задачи
— разделение HTML и логики представления
— гибкая библиотека блоков
 [% BLOCK menu %]
     <ul>
          [% FOREACH item IN items %]
              <li>[% item %]</li>
          [% END %]
     </ul>
 [% END %]



40
…и BEMHTML в частности
Задачи
— разделение HTML и логики представления
— гибкая библиотека блоков
 [% BLOCK menu %]
     <ul>
          [% FOREACH item IN items %]
              [% PROCESS item content = i %]
          [% END %]
     </ul>
 [% END %]



41
…и BEMHTML в частности
Задачи
— разделение HTML и логики представления
— гибкая библиотека блоков
— скорость




42
…и BEMHTML в частности
Задачи
— разделение HTML и логики представления
— гибкая библиотека блоков
— скорость
— БЭМ




43
…и BEMHTML в частности
Что получилось




44
…и BEMHTML в частности
Что получилось
…и BEMHTML в частности
Что получилось

— БЭМ-дерево ⟹ HTML




46
…и BEMHTML в частности
Что получилось

— БЭМ-дерево ⟹ HTML

 { block: 'button', content: 'Найти' }

 <input
     class="button"
     type="button"
     value="Найти"/>


47
…и BEMHTML в частности
Что получилось

— БЭМ-дерево ⟹ HTML
 {
     block: 'button',
     mods: { size: 'm' },
     content: 'Найти'
 }

 <input
     class="button button_size_m"
     type="button" value="Найти"/>



48
…и BEMHTML в частности
Что получилось

— БЭМ-дерево ⟹ HTML
— синтаксис




49
…и BEMHTML в частности
Что получилось

— БЭМ-дерево ⟹ HTML
— синтаксис
     — чуть больше чем JavaScript




50
…и BEMHTML в частности
Что получилось

— БЭМ-дерево ⟹ HTML
— синтаксис
     — чуть больше чем JavaScript
     — шаблоны с предикатами




51
…и BEMHTML в частности
Что получилось

— БЭМ-дерево ⟹ HTML
— синтаксис
     — чуть больше чем JavaScript
     — шаблоны с предикатами
     — БЭМ
     — несколько ключевых слов


52
…и BEMHTML в частности
Что получилось

— БЭМ-дерево ⟹ HTML
— синтаксис
 block button, tag: 'input'




53
…и BEMHTML в частности
Что получилось

— БЭМ-дерево ⟹ HTML
— синтаксис
 block button {
     tag: 'input'
     attrs: ({ type: 'button' })
 }



54
…и BEMHTML в частности
Что получилось

— БЭМ-дерево ⟹ HTML
— синтаксис
 block button {
     tag: 'input'
     attrs: ({
         type: 'button',
         value: apply('content')
     })
     content: ''
 }


55
…и BEMHTML в частности
Что получилось

— БЭМ-дерево ⟹ HTML
— синтаксис
 { block: 'button', content: 'Найти' }

 <input
     class="button"
     type="button"
     value="Найти"/>


56
…и BEMHTML в частности
Что получилось

— БЭМ-дерево ⟹ HTML
— синтаксис
— гибкость и расширяемость "по построению"




57
…и BEMHTML в частности
Что получилось
— гибкость и расширяемость "по построению"
 block button, attrs: ({ type: 'button' })




58
…и BEMHTML в частности
Что получилось
— гибкость и расширяемость "по построению"
 block button, attrs: ({ type: 'button' })

 block button, mod type submit, attrs: ({
    type: 'submit'
 })




59
…и BEMHTML в частности
Что получилось

— БЭМ-дерево ⟹ HTML
— синтаксис
— гибкость и расширяемость "по построению"
— многопроходность




60
…и BEMHTML в частности
Что получилось
— многопроходность

 { block: 'box', content: 'text' }




61
…и BEMHTML в частности
Что получилось
— многопроходность

 { block: 'box', content: 'text' }

 <div class="box">
   <div class="box__top"></div>
   <div class="box__content">text</div>
   <div class="box__bottom"></div>
 </div>

62
…и BEMHTML в частности
Что получилось
— многопроходность
 block box, content: [
     { elem: 'top' },
     {
         elem: 'content',
         content: applyNext()
     },
     { elem: 'bottom' }
 ]


63
…и BEMHTML в частности
Что получилось
— многопроходность

 { block: 'box', content: 'text' }

 <div class="box">
   <div class="box__top"></div>
   <div class="box__content">text</div>
   <div class="box__bottom"></div>
 </div>

64
…и BEMHTML в частности
Что получилось

— БЭМ-дерево ⟹ HTML
— синтаксис
— гибкость и расширяемость "по построению"
— многопроходность
— полноценный JavaScript



65
…и BEMHTML в частности
Что получилось
— полноценный JavaScript

 block box, content: {
     var res = { /* ... */ };
     // ...
     return res;
 }


66
…и BEMHTML в частности
Что получилось

— БЭМ-дерево ⟹ HTML
— синтаксис
— гибкость и расширяемость "по построению"
— многопроходность
— полноценный JavaScript
— XJST: bit.ly/xjst


67
…и BEMHTML в частности
Где применять




68
…и BEMHTML в частности
Где применять
…и BEMHTML в частности
Где применять
— возможность исполнять JavaScript




70
…и BEMHTML в частности
Где применять
— возможность исполнять JavaScript
     — на сервере
     — на клиенте




71
…и BEMHTML в частности
Где применять
— возможность исполнять JavaScript
— много HTML




72
…и BEMHTML в частности
Где применять
— возможность исполнять JavaScript
— много HTML
— HTML+CSS пишут отдельные специалисты




73
…и BEMHTML в частности
Где применять
— возможность исполнять JavaScript
— много HTML
— HTML+CSS пишут отдельные специалисты
— БЭМ




74
…и BEMHTML в частности
Где применять
— возможность исполнять JavaScript
— много HTML
— HTML+CSS пишут отдельные специалисты
— БЭМ, хотя бы в CSS




75
…и BEMHTML в частности
Где применять
— возможность исполнять JavaScript
— много HTML
— HTML+CSS пишут отдельные специалисты
— БЭМ, хотя бы в CSS
— частые итерации изменения HTML+CSS




76
…и BEMHTML в частности
Где применять
— возможность исполнять JavaScript
— много HTML
— HTML+CSS пишут отдельные специалисты
— БЭМ, хотя бы в CSS
— частые итерации изменения HTML+CSS
— есть общие блоки


77
…и BEMHTML в частности
Где лучше попробовать




78
…и BEMHTML в частности
Где лучше попробовать
…и BEMHTML в частности
Где лучше попробовать
— cтанок CSS-верстальщика




80
…и BEMHTML в частности
Где лучше попробовать
— cтанок CSS-верстальщика
— Node.js проект "с нуля"




81
…и BEMHTML в частности
Где лучше попробовать
— cтанок CSS-верстальщика
— Node.js проект "с нуля"
— Клиентское приложение "с нуля"




82
…и BEMHTML в частности
Как попробовать




83
…и BEMHTML в частности
Как попробовать
…и BEMHTML в частности
Как попробовать
— шаблон проекта: bit.ly/bem-stub




85
…и BEMHTML в частности
Как попробовать
— шаблон проекта: bit.ly/bem-stub
— документация bem-tools: bit.ly/bem-tools




86
…и BEMHTML в частности
Как попробовать
— шаблон проекта: bit.ly/bem-stub
— документация bem-tools: bit.ly/bem-tools
— документация про BEMHTML: bit.ly/bemhtml




87
Сергей Бережной
руководитель отдела
разработки поисковых интерфейсов
veged@yandex-team.ru
github.com/veged
@veged

Сергей Бережной "Про шаблонизаторы вообще и BEMHTML в частности"