SlideShare a Scribd company logo
История создания БЭМ
        Кратко, сбивчиво и неполно

        Виталий Харисов
        @harisov #b_ #yasubbotnik

        Я.Субботник, Минск, 2 июня 2012 года



Сегодня я вам расскажу историю создания БЭМ, откуда взялись сущности БЭМ и почему они сейчас
именно такие.

В конце покажу, что БЭМ гибок и может применяться в том объёме, в каком это возможно в вашем
проекте.
Статья
        clubs.ya.ru/bem/replies.xml?item_no=1398




        2

Всё, что сейчас расскажу подробно описано в статье, опубликованной в нашем клубе на Яру.
Доисторические времена




        3

Итак, начнём с самого начала.
Яндекс.Адреса, 2005




        4

Когда я начал работать над Яндекс.Адресами в далёком 2005 году, вёрстку я делал так.
Яндекс.Адреса, 2005
          Файловая система

              about.html
              index.html
              …
              adresa.css
              adresa.js
              i/
                  yandex.png


          5

На   файловой системе:
 •   Делались статические html-странички
 •   Стили для них складывались в один файл на весь проект — adresa.css
 •   Скрипты — в adresa.js. Скриптов было очень мало
 •   Картинки — в директорию в отдельную директорию
Яндекс.Адреса, 2005
        Структура CSS-файла

            /* Content container (begin) */
                #body
                {
                    font: 0.8em Arial, sans-serif;

                           margin: 0.5em 1.95% 0.5em 2%;
                }
            /* Content container (end) */

        6

Все стили были в одном файле и для отделения стилей разных частей страницы использовались
комментарии с указанием начала и конца.

В вёрстке использовались как id, так и классы.
Яндекс.Музыка, 2006




        7

Адреса были маленьким проектом с несколькими страницами и такой подход к вёрстке был
удобен.

При вёрстке первой версии Яндекс.Музыки в начале 2006 стало понятно, что для проекта с
большим количеством разных страниц этот подход работает плохо.

Тяжело подбирать названия классам, код всего проекта сложно держать в голове и писать так,
чтобы изменения на одной странице ничего не ломали на другой.
Яндекс.Музыка, 2006
        Типичный CSS код

            /* Albums (begin) */
               .result .albums .info {…}

               .result .albums .info i {…}

               .result .albums .album .listen {…}

            /* Albums (end) */

        8

Типичный код того времени.

Используется длинный каскад.
Яндекс.Музыка, 2006
        Типичный CSS код

            /* Картинки на фоне (begin) */
               .#foot div {…}

                .#foot div div {…}
                …
                .#foot div div div div div div {…}

            /* Картинки на фоне (end) */

        9

Или вот ещё пример.

Используются id и тэги.
Яру, 2006




        10

Одновременно с Музыкой началась вёрстка Яру.

Это проект с десятками страниц и такой подход не работает — вёрстка становится
неуправляемой.
Появление блоков




        11

И мы ввели понятие блока для частей страниц, которые имеют самостоятельное значение в
дизайне.
Яру, 2006
        Появление блоков
        b- block
           независимый блок, может использоваться
           в любом месте страницы
        с- control
           контрол (независимый блок) с которым
           ассоциирован javascript-объект

        g- global
           глобальное определение, используется по
           необходимости, количество сведено к минимуму
        12

Классы блоков получили префиксы (b-, c-, g-), чтобы отличаться от классов внутри.
Появление элементов




        13

Внутренние классы мы стали называть элементами.
Яру, 2006
        Появление элементов

         /* Head (begin) */
            .b-head {…}

               /* Search (begin) */
                  .b-head .search {…}
                  .b-head .search div div,
                  .b-head .search div div i {…}
               /* Search (end) */

        14

Элементы, у которых много кода, выделялись комментариями.
Структура вёрстки проекта




        15

Изменилась структура вёрстки проекта.
Яру, 2006
        Структура вёрстки проекта

          index.html
          css/
               yaru.css
               yaru-ie.css
          js/
               yaru.js
          i/
               yandex.png

        16

Ввели директории для технологий css и js.
Яру, 2006
        yaru.css

         /* Common definitions (begin) */
             body {…}
             * html body {…}
         /* Common definitions (end) */

         /* Head (begin) */
            .b-head {…}
         /* Head (end) */

        17

Валидные хаки для MSIE писали в основном CSS-файле.
Яру, 2006
        yaru-ie.css

         .b-artist .i i {
           top: expression(7 + (90 -
                this.parentNode
                .getElementsByTagName('img')[0]
                .height)/2);

             filter:progid:DXImageTransform.
               Microsoft.AlphaImageLoader(src='…’)

        18

Невалидные — в файле -ie.css.
Зачатки общепортального
        фреймворка




        19

При верстке нескольких проектов с похожим дизайном есть общие блоки.

Очень быстро понимаешь, что copy/paste этих блоков с проекта на проект не выход и надо делать
common.

Так появилось общее хранилище для стилей шапки, подвала, статического текста на специальном
сервере.
Зачатки общепортального фреймворка
        Структура CSS-файла

         @import url(http://…/css/head/common.css);
         @import url(http://…/css/foot/common.css);

         /* Header (begin) */
           /* Service (begin)                   */
             .b-head .service                   h1 {…}
             .b-head .service                   h1,
             .b-head .service                   h1 a {…}

        20

Cтили с него подключались в основной проектный файл с помощью импортов.

Чтобы с этим можно было уйти в продакшн, появился процесс сборки, во время которого вместо
@import подставляется содержимое этих файлов.
Вёрстка независимыми
        блоками




        21

К осени 2007 года правила вёрстки уже устоялись, и о них захотелось рассказать вне Яндекса.
Доклад на ClientSide‘2007
      «Вёрстка независимыми блоками»




        22

На ClientSide'2007 я сделал доклад «Вёрстка независимыми блоками»
Доклад на ClientSide‘2007
        Статья

        vitaly.harisov.name/
        article/independent-blocks.html




        23

Содержимое доклада можно прочитать в статье, а я сейчас расскажу самое важное.
Доклад на ClientSide‘2007
        Блок
        Блоком будем называть фрагмент
        страницы, который описывается
        своей разметкой и стилями.




        24

В докладе вводится понятие «Блок».
Доклад на ClientSide‘2007
        Правила независимости блока
        1) для описания элемента используется
           class, но не id
        2) каждый блок имеет префикс
        3) в таблице стилей нет классов
           вне блоков
        clubs.ya.ru/bem/replies.xml?item_no=4

        25

Формулируются правила независимости блока.

Отказ от id даёт возможность использовать один и тот же блок несколько раз на странице.

А также позволяет использовать на одном DOM-узле несколько классов, что в дальнейшем нам
пригодилось.
Доклад на ClientSide‘2007
        Простые и составные блоки
        В простые блоки нельзя вкладывать
        другие блоки, в составные — можно.
        clubs.ya.ru/bem/replies.xml?item_no=42




        26

Блоки делятся на простые и составные.

В простые блоки нельзя вкладывать другие блоки, в составные — можно.

Это было очень наивное деление, мы неоднократно сталкивались с тем, что даже в самые простые
блоки вкладывались другие и приходилось переделывать вёрстку.
Доклад на ClientSide‘2007
        Полная независимость блоков
        1) никогда не опираться на элементы,
           только на классы:
           .b-user b => .b-user .first-letter
        2) всем классам внутри блока давать
           имена начинающиеся с имени этого
           блока:
           .b-user .first-letter => .b-user__first-letter


        27

Так же были сформулированы правила полной независимости блоков:

1) Нельзя использовать теги в селекторах
2) Нужно задавать каждому DOM-узлу свой класс
Доклад на ClientSide‘2007
        Абсолютно-независимые блоки


        clubs.ya.ru/bem/replies.xml?item_no=43




        28

Позже мы назвали это АНБ (абсолютно-независимые блоки): clubs.ya.ru/bem/replies.xml?
item_no=43

Но класс у каждого DOM-узла существенно увеличивает HTML-код.

На тот момент мы считали, что это дорого и применяли такой подход в исключительных случаях.
Доклад на ClientSide‘2007
        Префиксы
        Имена блоков начинаются с префиксов

        b- обычные блоки
        h- обёртки
        l-     раскладки
        g-      глобальные стили

        29

Тогда же, сформулировали правила для префиксов.
Доклад на ClientSide‘2007
       Модификация блоков
       1. Модификация блока от контекста

       2. Модификация постфиксом
          не зависимо от контекста,
          добавляя постфикс к имени блока:
          b-block b-block-postfix

       30

Ввели понятие модификации:

1. Блок может изменить свой внешний вид в зависимости от того, где он находится.
   Это модификация от контекста.

2. Можно добавить блоку второй класс, это модификация постфиксом, она не зависит от
   контекста.
Общепортальный фреймворк




        31

Весной 2008 года была поставлена задача сделать брендбук, описывающий наш портальный
стиль.

Я начал с того, что умел лучше всего — делать HTML/CSS код.

Если делать просто описание — оно устареет, не успев дописаться до конца.
Лего 1.0, 2008




        32

Проект получил название Лего.
Лего 1.0, 2008
        Структура репозитория

         css/
         html/
         js/
         xml/
         xsl/
        33

Первичное разделение на верхнем уровне репозитория идёт по технологиям.

В каждой технологии своя структура.
Лего 1.0, 2008
        Структура репозитория: CSS
         css/
                block/
                    b-dropdown/
                         b-dropdown.css
                service/
                    auto/
                         block/
                             b-head-logo-auto.css
                         head.css
                util/
                    b-hmenu/
                         b-hmenu.css

        34

CSS раскладывается в три разные директории.
Лего 1.0, 2008
        Структура репозитория: CSS
         css/
                block/
                    b-dropdown/
                         b-dropdown.css
                service/
                    auto/
                         block/
                             b-head-logo-auto.css
                         head.css
                util/
                    b-hmenu/
                         b-hmenu.css

        35

block — общепортальные блоки

util — блоки, которые имеют смысл вне Яндекса, их можно выложить в Open Source

service — стили для конкретных сервисов Яндекса, подключив их на сервис можно отобразить
шапку, подвал
Лего 1.0, 2008
        Структура репозитория: HTML

         html/
             block/
                 b-dropdown.html
             service/
                 auto/
                      l-head.html
             util/
                 b-hmenu.html

        36

Структура директории html аналогична css.
Лего 1.0, 2008
        Структура репозитория: JS

          js/
                   check-is-frame.js
                   check-session.js
                   clean-on-focus.js
                   dropdown.js
                   event.add.js
                   event.del.js
        37

JS находится в зачаточном состоянии.
Лего 1.0, 2008
        Структура репозитория: XML

         xml/
                 block/
                     b-head-tabs-communication.xml
                     common-services.ru.xml
                     head-messages.ru.xml
                 service/
                     auto/
                          head.xml

        38

У каждого сервиса есть XML-файл, использующийся для построения шапки.
Лего 1.0, 2008
        Структура репозитория: XSL

         xsl/
                 block/
                     b-dropdown.xsl
                     b-head-line.xsl
                     i-common.xsl
                     i-locale.xsl
                     l-foot.xsl
                     l-head.xsl

        39

XSL блоков лежит в одной директории.

Каждому блоку соответствует один файл.
Лего 1.0, 2008
        Что ещё можно выделить
        Подключение через svn:externals
        Директории из Лего подключались на проект
        Статическая линковка




        40

Подключение Лего на проекты делалось через svn:externals.

При сборке для продакшена, код библиотеки полностью включается в проект, что можно сравнить
со статической линковкой.

Такой подход позволяет выпускать версии сервисов с разными версиями Лего и переходить на
новую версию, когда это удобно команде проекта.

Мы используем его до сих пор.
Лего 1.0, 2008
        Что ещё можно выделить
        Ручная поддержка структуры
         @import url(../../block/l-head/
                       l-head.css);
        Файлы состоят из import’ов
         @import url(../../block/b-head-logo/
                       b-head-logo.css);
         @import url(../../block/b-head-logo/
                       b-head-logo_name.css);
         @import url(block/b-head-logo-auto.css);



        41

Файлы, подключавшиеся на страницах, состояли из @import'ов реализации блоков.

Эти import’ы писались вручную.
Лего 1.0, 2008
        Что ещё можно выделить
        Именование файлов ещё не устоялось




        42

Именование файлов ещё не устоялось, мы пробуем разные варианты.
Лего 1.0, 2008
        Что ещё можно выделить
        Префиксы:
        b- визуальные блоки
        l-      раскладка блоков
        i-      вспомогательные блоки


        43

Используются три типа префиксов:

b-   для визуальных блоков
l-   для блоков задающих раскладку
i-   для вспомогательных блоков
Лего 1.2, 2008




        44

Чуть позже в рамках версии 1.2 был сделан рефакторинг…
Лего 1.2, 2008
        Структура репозитория
         common/
             css/
             js/
             xml/
             xsl/
         example/
             html/
         service/
             auto/
                  css/
                  xml/
        45

…и структура Лего изменилась.
Лего 1.2, 2008
        Структура репозитория: CSS

          common/
              css/
                          b-dropdown/
                              arr/
                                   b-dropdown.arr.css
                                   b-dropdown.arr.ie.css
                              b-dropdown.css
                              b-dropdown.ie.css

        46

Убрано разделение на util и block, весь общий CSS лежит в common/css.

От идеи выноса кода в Open Source на тот момент отказались.

Вернулись к ней только через два года.
Лего 1.2, 2008
        Структура репозитория: CSS

         common/
             css/
                         b-dropdown/
                             arr/
                                  b-dropdown.arr.css
                                  b-dropdown.arr.ie.css
                             b-dropdown.css
                             b-dropdown.ie.css

        47

Файлы для MSIE переименованы.

Расширения у файлов теперь могут быть из нескольких слов.
Лего 1.2, 2008
        Структура репозитория: CSS

         common/
             css/
                         b-dropdown/
                             arr/
                                  b-dropdown.arr.css
                                  b-dropdown.arr.ie.css
                             b-dropdown.css
                             b-dropdown.ie.css

        48

Опциональный CSS блоков вынесен в директории.

В основном файле блока стало меньше кода.
Лего 1.2, 2008
        Структура репозитория: CSS

         .b-head-tabs-grey

         .b-head-tabs_grey

             b-head-tabs_grey.css
        49

Для модификации постфиксом вместо минуса начали использовать подчёркивание.

Это позволило визуально отделить имя блока от модификатора, что потом пригодилось при
реализации инструментов, помогающих работать с кодом.
БЭМ




        50

В марте 2009 выходит версия Лего 2.0.

Этим событием заканчивается «Вёрстка независимыми блоками» и начинается «БЭМ».
Лего 2.0, 2009




        51

Что же принципиально изменилось с выходом версии 2.0?
Лего 2.0, 2009
        Блоки первичны
        Блоки первичны
        Технологии вторичны
        clubs.ya.ru/bem/replies.xml?item_no=237




        52

Самое главное изменение — мы вывели вперёд блоки, а не технологии.

Блоки стали первичны, а технологии их реализации — вторичны.

Реализация блока делалась в отдельной директории, а технологии — это файлы внутри неё.

В том числе появилась документация к блоку — это файл .wiki внутри блока.
Терминология




       53

Какими терминами мы тогда оперировали?
Лего 2.0, 2009
        Терминология: Блоки

          XML:            <lego:l-head>
                          <lego:b-head-logo>

          HTML:           <table class="l-head">
                          <div class="b-head-logo">

          CSS:            .l-head
                          .b-head-logo

        54

Независимый блок,

который может быть использован в любом месте страницы.

В XML он представлен тегом в неймспейсе lego, в HTML класс у блока, такой же, как имя этого
тега.
Лего 2.0, 2009
        Терминология: Блоки

          common/
              block/
                  b-head-logo/
                      b-head-logo.css
                      b-head-logo.xsl
                      b-head-logo.js
                      b-head-logo.wiki

        55

Все файлы (css, js, html, xsl), относящиеся к блоку, кладутся в его директорию.
Лего 2.0, 2009
        Терминология: Элементы

         XML:          <lego:b-head-logo>
                           <lego:name/>
                       </lego:b-head-logo>

         HTML:         <div class="b-head-logo">
                           <span class="name">Авто</span>
                       </div>

         CSS:          .b-head-logo .name

        56

Элементы в XML пишутся в неймспейсе lego без префикса.

Класс в HTML — тоже без префикса.
Лего 2.0, 2009
        Терминология: Элементы

         common/
             block/
                 b-head-logo/
                     name/
                         b-head-logo.name.css
                         b-head-logo.name.png
                         b-head-logo.name.wiki


        57

Файлы для вложенного элемента кладутся в отдельную директорию.
Лего 2.0, 2009
        Терминология: Модификаторы

         XML:          <lego:b-head-tabs lego:theme="grey">

         HTML:         <div class="b-head-tabs
                                   b-head-tabs_grey">

         CSS:          .b-head-tabs_grey




        58

Модификаторы в XML представлены атрибутами в неймспейсе lego.

В HTML используется дополнительный класс.
Лего 2.0, 2009
        Терминология: Модификаторы

         common/
             block/
                 b-head-logo/
                     _theme/
                         b-head-logo_gray.css
                         b-head-logo_gray.png
                         b-head-logo_gray.wiki

        59

Файлы для модификатора кладутся в отдельную директорию, с подчёркиванием в начале имени.

Модификатор имеет тип и значение.
Декларация используемых
       блоков




       60

Все лего-компоненты проекта описываются…
Лего 2.0, 2009
       Декларация

         <lego:page>
             <lego:l-head>
                 <lego:b-head-logo>
                     <lego:name/>
                 </lego:b-head-logo>

                        <lego:b-head-tabs
                            type="search-and-content"/>

       61

…в XML-файле.

Из него генерируются…
Лего 2.0, 2009
        Генерируется CSS

         @import url(../../common/block/
                   b-head-logo/b-head-logo.css);
         @import url(../../common/block/
                   b-head-logo/name/
                   b-head-logo.name.css);
         @import url(block/
                   b-head-logo/b-head-logo.css);


        62

…CSS-файлы.

Сначала идёт общий код, а потом добавляются стили, чтобы привести лего-блоки к дизайну
проекта.

Имена файлов элементов пишутся через точку: b-head-logo.name.css
Лего 2.0, 2009
        Генерируется JS

         include("../../common/block/
                  i-locale/i-locale.js");
         include("../../common/block/
                  b-dropdown/b-dropdown.js");
         include("../../common/block/b-search/
                  sample/b-search.sample.js");



        63

Из XML-декларации генерируются и JS-файлы.
Лего 2.0, 2009
        Генерируется XSL

         <xsl:import href="../../common/block/
              l-head/l-head.xsl"/>
         <xsl:import href="../../common/block/
              b-head-logo/b-head-logo.xsl"/>
         <xsl:import href="../../common/block/
              b-head-logo/name/
              b-head-logo.name.xsl"/>


        64

А также XSL-файлы.

Мы перестали писать эти файлы руками, началась генерация кода.
Проблема скорости
        селекторов, 2009




        65

При реализации новой версии Яндекс.Почты была задача сделать её такой быстрой как программа
на компьютере.

Но возникли проблемы.

При исследовании обнаружили, что тормозят селекторы CSS.
Скорость селекторов, 2009


        clubs.ya.ru/bem/replies.xml?item_no=338




        66

Результаты исследования подробно описаны в статье.
Скорость селекторов, 2009
        Решение
        Абсолютно-Независимые Блоки (АНБ)
        clubs.ya.ru/bem/replies.xml?item_no=43




        67

Мы поняли, что решение этой проблемы у нас есть давно — это абсолютно-независимые блоки.
Скорость селекторов, 2009
        Решение

         <div class="b-head-logo">
             <span class="b-head-logo__name">
                 Авто
             </span>
         </div>




        68

В классы элементов вносится имя блока, селекторы получаются простыми и быстрыми.
Стабилизация нотации




        69

Постепенно мы пришли к тому, что нотация в коде и структура на файловой системе устоялась и с
тех пор уже не меняется.
Стабилизация нотации
        Разделитель элемента

         Было
            b-block.elem.css

         Стало
             b-block__elem.css
        70

В именах файлов разделитель . был заменён на __.

Теперь они совпадают с CSS-селекторами.
Стабилизация нотации
        Модификаторы элементов

         .b-block__elem_theme_green

         по аналогии с

         .b-block_theme_green

        71

Были реализованы модификаторы у элементов по аналогии с модификаторами блоков.
Стабилизация нотации
        Тип модификатора

         Было
                       .b-menu__item_current

         Стало
                       .b-menu__item_state_current



        72

В имя файла модификатора и в его класс внесён тип модификатора.

Причина этого изменения — работа с модификаторами из JS.
Open Source (2010)
        github.com/bem




        73

В 2010 году мы создали организацию bem на github’е чтобы вести разработку в open source.
Библиотека блоков bem-bl




        74

Мы начали выносить блоки из Лего в bem-bl, проводя одновременно с этим рефакторинг.
Библиотека блоков bem-bl


        github.com/bem/bem-bl
        clubs.ya.ru/bem/posts.xml?tag=8486525




        75

Вместе с выносом блоков публиковали информацию про них в клубе.

Работы по выносу блоков в Open Source пока не закончены.
Инструменты
        github.com/bem/bem-tools




        76

Начали реализацию инструментов bem-tools, которые помогают работать с файлами по БЭМ-
методу.

Инструменты реализуются на JavaScript под Node.js.
Инструменты
        Уровни переопределения

         bem-bl/
             b-logo/
         lego/
             b-logo/
         auto/
             blocks/
                 b-logo/

        77

Директории с реализацией блоков стали называть «уровнем переопределения».

Например, на проекте может быть

1) публичная библиотека блоков с github
2) внутренняя библиотека lego
3) и блоки самого проекта
Инструменты
        Схемы именования

         .bem/
             level.js




        78

На уровне переопределения можно задать другую схему именования папок/файлов, отличную от
нашей.

Например, вы можете задать другие разделители между именем блока и элемента, или не
раскладывать всё по директориям, а сделать плоскую структуру из файлов.
BEMHTML
       JavaScript шаблонизатор




       79

После экспериментов с разными шаблонизаторами, был разработан шаблонизатор BEMHTML.
BEMHTML
        JavaScript шаблонизатор
        — Шаблоны в БЭМ-терминах
        — Уровни переопределения
        — На сервере и в браузере




        80

Этот шаблонизатор

1) позволяет писать шаблоны в БЭМ-терминах
2) доопределять их на уровнях переопределения
3) исполнять эти шаблоны, как на сервере, так и в браузере, поскольку шаблоны компилируются в
простой и быстрый JavaScript
BEMHTML
        JavaScript шаблонизатор


        clubs.ya.ru/bem/replies.xml?item_no=898
        clubs.ya.ru/bem/replies.xml?item_no=899
        clubs.ya.ru/bem/replies.xml?item_no=1153
        clubs.ya.ru/bem/replies.xml?item_no=1172
        clubs.ya.ru/bem/replies.xml?item_no=1391
        81

Подробности в клубе на Яру.
Варианты использования БЭМ




        82

Как вы можете видеть, БЭМ не появился сразу. У нас был долгий период проб и подбора наиболее
подходящего нам варианта.

Но хочу обратить внимание, что всё это время это был БЭМ.

То, что мы используем сейчас — не единственно верное решение.

Наоборот, вы можете использовать БЭМ на своих проектах в том объёме, в котором он принесёт
наибольшую пользу.

БЭМ методология очень гибкая и позволяет вам настраивать её под свои процессы, под свои
текущие технологии.

Давайте посмотрим на примерах.
Блоки в одном файле




        83

У вас есть проект, в котором вы хотите применить БЭМ для вёрстки и ни для чего более.

Хорошо, мы тоже с этого начинали.

Выбирайте подходящую вам схему…
Блоки в одном файле
        Префиксы и классы без них

         .b-block
         .b-block .elem
         .b-block_size_l
         .b-block .elem_size_l


        84

С префиксами и каскадом.
Блоки в одном файле
        АНБ с префиксами

         .b-block
         .b-block__elem
         .b-block_size_l
         .b-block__elem_size_l


        85

Или задайте класс каждому DOM-узлу и используйте абсолютно-независимые блоки.
Блоки в одном файле
       АНБ без префиксов

         .block
         .block__elem
         .block_size_l
         .block__elem_size_l


       86

Или можно убрать префиксы.
Блоки в одном файле
        И верстаете

         myfacebook/
             myfacebook.css
             myfacebook.js
             myfacebook.html


        87

И начинайте делать вёрстку на проекте по БЭМ.

Используйте самую простую схему на файловой системе, когда реализация блоков лежит в одном
файле.

При использовании этого варианта всё делается руками, без bem-tools.
Блоки в директории




        88

Когда вы поймёте, что ваш проект вырос, можно начать раскладывать реализацию блоков по
файлам и использовать сборку.
Блоки в директории


         blocks/
             b-myblock.css
             b-myblock.js
             b-yourblock.css
             b-yourblock.js
        89

В этом случае можно начинать использовать bem-tools для сборки проекта.
Не обязательное в файлах




        90

Если в ваших блоках есть элементы/модификаторы, которые используются не на всех страницах…
Не обязательное в файлах


         blocks/
           b-myblock/
             b-myblock_mod_val1.css
             b-myblock__opt-elem.css
             b-myblock__opt-elem_mod_val1.css
             b-myblock.css


        91

…можно вынести их реализацию в отдельные файлы, чтобы подключать только то, что нужно.
Модификаторы в директориях




       92

Если модификаторов много…
Модификаторы в директориях


         blocks/
           b-myblock/
             _mod/
               b-myblock_mod_val1.css
             b-myblock__opt-elem.css
             b-myblock__opt-elem_mod_val1.css
             b-myblock.css

       93

…для каждого можно сделать отдельную директорию. Это разгрузит корневую директорию
блока.
Опциональные элементы
       в директориях




       94

Предпоследний по сложности вариант, когда…
Опциональные элементы
        в директориях
         blocks/
           b-myblock/
             _mod/
               b-myblock_mod_val1.css
             __opt-elem/
               b-myblock__opt-elem.css
                 b-myblock.css

        95

…в директории выносятся ещё и необязательные элементы, а код обязательных элементов лежит в
основных файлах блока.

Мы используем сейчас именно этот вариант при разработке Лего и bem-bl.
ВСЕ элементы/модификаторы
        в директориях




        96

Самый сложный в разработке, но самый понятный вариант по конечной структуре, когда ВСЕ
элементы блока и ВСЕ модификаторы имеют свои директории.
Все элементы/модификаторы
        в директориях
         blocks/
           b-myblock/
             _mod/
               b-myblock_mod_val1.css
             __elem/
               b-myblock__elem.css
                 b-myblock.css

        97

Этот вариант очень наглядный, при взгляде на файловую систему можно увидеть всю структуру
блока.

Мы сейчас спорим, надо нам переходить на него в Лего или нет.
Подведём итог




        98

Итак, давайте подведём итог.
Подведём итог

        методология организации работы
        нет единственно правильного варианта
        набор правил
        команда встраивает в свой процесс



        99

БЭМ — это методология организации работы над проектом, которая позволяет команде работать
c единым кодом и говорить на одном языке.

При этом нет единственно правильного варианта и мы не стремимся его получить.

Наоборот, мы рассматриваем БЭМ как набор правил.

Каждая конкретная команда встраивает его в свой процесс разработки и использует так, как им
удобно.
Статья
        clubs.ya.ru/bem/replies.xml?item_no=1398




        100

Ещё раз обращаю ваше внимание, что всё, что я сейчас рассказывал более подробно описано в
статье, опубликованной в нашем клубе на Яру.
Виталий Харисов
                                  vitaly@yandex-team.ru

                                  @harisov

                                   #b_ #yasubbotnik




Спасибо за внимание.

Я готов ответить на вопросы сейчас и после доклада.

More Related Content

What's hot

Современная верстка с адекватными трудозатратами Максим Тимохин, технолог, И...
 Современная верстка с адекватными трудозатратами Максим Тимохин, технолог, И... Современная верстка с адекватными трудозатратами Максим Тимохин, технолог, И...
Современная верстка с адекватными трудозатратами Максим Тимохин, технолог, И...
Тарасов Константин
 
Создание дистрибутивов Drupal. Почему, зачем и как?
Создание дистрибутивов Drupal. Почему, зачем и как?Создание дистрибутивов Drupal. Почему, зачем и как?
Создание дистрибутивов Drupal. Почему, зачем и как?Alexei Gorobets
 
Методологии верстки
Методологии версткиМетодологии верстки
Методологии верстки
Elizaveta Selivanova
 
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScriptCSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript
Alexey Ivanov
 
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...
IT-Portfolio
 
JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.
Igor Shkulipa
 
Телепортация MODX - MODX Meetup Minsk
Телепортация MODX - MODX Meetup MinskТелепортация MODX - MODX Meetup Minsk
Телепортация MODX - MODX Meetup Minsk
MODX Беларусь
 
Sozdanie saita v_ mc_mediadw3_steps
Sozdanie saita v_ mc_mediadw3_stepsSozdanie saita v_ mc_mediadw3_steps
Sozdanie saita v_ mc_mediadw3_steps
Stiv-redter
 
Внутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpackВнутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpack
Alexey Ivanov
 
Development and deployment freedom - MODX Meetup Minsk
Development and deployment freedom - MODX Meetup MinskDevelopment and deployment freedom - MODX Meetup Minsk
Development and deployment freedom - MODX Meetup Minsk
MODX Беларусь
 
ДАМП 2015 Екатеринбург
ДАМП 2015 ЕкатеринбургДАМП 2015 Екатеринбург
ДАМП 2015 Екатеринбург
Alexey Ivanov
 
Мастер-класс наоборот: вы пишете БЭМ-проект, а мы подсказываем — Евгений Конс...
Мастер-класс наоборот: вы пишете БЭМ-проект, а мы подсказываем — Евгений Конс...Мастер-класс наоборот: вы пишете БЭМ-проект, а мы подсказываем — Евгений Конс...
Мастер-класс наоборот: вы пишете БЭМ-проект, а мы подсказываем — Евгений Конс...
Yandex
 
Rich UI on Dojo Toolkit and Zend Framework
Rich UI on Dojo Toolkit and Zend FrameworkRich UI on Dojo Toolkit and Zend Framework
Rich UI on Dojo Toolkit and Zend Framework
Georgy Turevich
 
Жека Константинов, Дима Белицкий, Слава Аристов — Мастер-класс: разрабатываем...
Жека Константинов, Дима Белицкий, Слава Аристов — Мастер-класс: разрабатываем...Жека Константинов, Дима Белицкий, Слава Аристов — Мастер-класс: разрабатываем...
Жека Константинов, Дима Белицкий, Слава Аристов — Мастер-класс: разрабатываем...
Yandex
 
C# Web. Занятие 13.
C# Web. Занятие 13.C# Web. Занятие 13.
C# Web. Занятие 13.
Igor Shkulipa
 
A вы верите в систематизацию
A вы верите в систематизацию A вы верите в систематизацию
A вы верите в систематизацию
Irina Levina
 
C# Web. Занятие 12.
C# Web. Занятие 12.C# Web. Занятие 12.
C# Web. Занятие 12.
Igor Shkulipa
 
Drupal -organizaciya_razrabotki
Drupal  -organizaciya_razrabotkiDrupal  -organizaciya_razrabotki
Drupal -organizaciya_razrabotkidrupalconf
 

What's hot (19)

Современная верстка с адекватными трудозатратами Максим Тимохин, технолог, И...
 Современная верстка с адекватными трудозатратами Максим Тимохин, технолог, И... Современная верстка с адекватными трудозатратами Максим Тимохин, технолог, И...
Современная верстка с адекватными трудозатратами Максим Тимохин, технолог, И...
 
Создание дистрибутивов Drupal. Почему, зачем и как?
Создание дистрибутивов Drupal. Почему, зачем и как?Создание дистрибутивов Drupal. Почему, зачем и как?
Создание дистрибутивов Drupal. Почему, зачем и как?
 
Методологии верстки
Методологии версткиМетодологии верстки
Методологии верстки
 
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScriptCSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript
 
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...
 
JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.
 
Телепортация MODX - MODX Meetup Minsk
Телепортация MODX - MODX Meetup MinskТелепортация MODX - MODX Meetup Minsk
Телепортация MODX - MODX Meetup Minsk
 
Sozdanie saita v_ mc_mediadw3_steps
Sozdanie saita v_ mc_mediadw3_stepsSozdanie saita v_ mc_mediadw3_steps
Sozdanie saita v_ mc_mediadw3_steps
 
Внутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpackВнутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpack
 
Development and deployment freedom - MODX Meetup Minsk
Development and deployment freedom - MODX Meetup MinskDevelopment and deployment freedom - MODX Meetup Minsk
Development and deployment freedom - MODX Meetup Minsk
 
Chef @DevWeb
Chef @DevWebChef @DevWeb
Chef @DevWeb
 
ДАМП 2015 Екатеринбург
ДАМП 2015 ЕкатеринбургДАМП 2015 Екатеринбург
ДАМП 2015 Екатеринбург
 
Мастер-класс наоборот: вы пишете БЭМ-проект, а мы подсказываем — Евгений Конс...
Мастер-класс наоборот: вы пишете БЭМ-проект, а мы подсказываем — Евгений Конс...Мастер-класс наоборот: вы пишете БЭМ-проект, а мы подсказываем — Евгений Конс...
Мастер-класс наоборот: вы пишете БЭМ-проект, а мы подсказываем — Евгений Конс...
 
Rich UI on Dojo Toolkit and Zend Framework
Rich UI on Dojo Toolkit and Zend FrameworkRich UI on Dojo Toolkit and Zend Framework
Rich UI on Dojo Toolkit and Zend Framework
 
Жека Константинов, Дима Белицкий, Слава Аристов — Мастер-класс: разрабатываем...
Жека Константинов, Дима Белицкий, Слава Аристов — Мастер-класс: разрабатываем...Жека Константинов, Дима Белицкий, Слава Аристов — Мастер-класс: разрабатываем...
Жека Константинов, Дима Белицкий, Слава Аристов — Мастер-класс: разрабатываем...
 
C# Web. Занятие 13.
C# Web. Занятие 13.C# Web. Занятие 13.
C# Web. Занятие 13.
 
A вы верите в систематизацию
A вы верите в систематизацию A вы верите в систематизацию
A вы верите в систематизацию
 
C# Web. Занятие 12.
C# Web. Занятие 12.C# Web. Занятие 12.
C# Web. Занятие 12.
 
Drupal -organizaciya_razrabotki
Drupal  -organizaciya_razrabotkiDrupal  -organizaciya_razrabotki
Drupal -organizaciya_razrabotki
 

Viewers also liked

SFPUG - DVDStore Performance Benchmark and PostgreSQL
SFPUG - DVDStore Performance Benchmark and PostgreSQLSFPUG - DVDStore Performance Benchmark and PostgreSQL
SFPUG - DVDStore Performance Benchmark and PostgreSQL
Jignesh Shah
 
OLTP Performance Benchmark Review
OLTP Performance Benchmark ReviewOLTP Performance Benchmark Review
OLTP Performance Benchmark ReviewJignesh Shah
 
PostgreSQL High Availability in a Containerized World
PostgreSQL High Availability in a Containerized WorldPostgreSQL High Availability in a Containerized World
PostgreSQL High Availability in a Containerized World
Jignesh Shah
 
PostgreSQL and Benchmarks
PostgreSQL and BenchmarksPostgreSQL and Benchmarks
PostgreSQL and Benchmarks
Jignesh Shah
 
PostgreSQL High Availability in a Containerized World
PostgreSQL High Availability in a Containerized WorldPostgreSQL High Availability in a Containerized World
PostgreSQL High Availability in a Containerized World
Jignesh Shah
 
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Yandex
 
The Phase Transition
The Phase TransitionThe Phase Transition
The Phase Transition
Yandex
 

Viewers also liked (7)

SFPUG - DVDStore Performance Benchmark and PostgreSQL
SFPUG - DVDStore Performance Benchmark and PostgreSQLSFPUG - DVDStore Performance Benchmark and PostgreSQL
SFPUG - DVDStore Performance Benchmark and PostgreSQL
 
OLTP Performance Benchmark Review
OLTP Performance Benchmark ReviewOLTP Performance Benchmark Review
OLTP Performance Benchmark Review
 
PostgreSQL High Availability in a Containerized World
PostgreSQL High Availability in a Containerized WorldPostgreSQL High Availability in a Containerized World
PostgreSQL High Availability in a Containerized World
 
PostgreSQL and Benchmarks
PostgreSQL and BenchmarksPostgreSQL and Benchmarks
PostgreSQL and Benchmarks
 
PostgreSQL High Availability in a Containerized World
PostgreSQL High Availability in a Containerized WorldPostgreSQL High Availability in a Containerized World
PostgreSQL High Availability in a Containerized World
 
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
 
The Phase Transition
The Phase TransitionThe Phase Transition
The Phase Transition
 

Similar to Виталий Харисов "История создания БЭМ. Кратко, сбивчиво и неполно"

Владимир Гриненко "i-bem.js: JavaScript в БЭМ-терминах"
Владимир Гриненко "i-bem.js: JavaScript в БЭМ-терминах"Владимир Гриненко "i-bem.js: JavaScript в БЭМ-терминах"
Владимир Гриненко "i-bem.js: JavaScript в БЭМ-терминах"
Yandex
 
Александр Баумгертнер — Преимущества БЭМ для небольших проектов и компаний
Александр Баумгертнер — Преимущества БЭМ для небольших проектов и компанийАлександр Баумгертнер — Преимущества БЭМ для небольших проектов и компаний
Александр Баумгертнер — Преимущества БЭМ для небольших проектов и компаний
Yandex
 
как стать хорошим веб технологом. нарек мкртчян. зал 4
как стать хорошим веб технологом. нарек мкртчян. зал 4как стать хорошим веб технологом. нарек мкртчян. зал 4
как стать хорошим веб технологом. нарек мкртчян. зал 4rit2011
 
Alex baumgertner bem_in_small_projects
Alex baumgertner bem_in_small_projectsAlex baumgertner bem_in_small_projects
Alex baumgertner bem_in_small_projects
Alexander Baumgertner
 
BEM — block, element, modification conception
BEM — block, element, modification conceptionBEM — block, element, modification conception
BEM — block, element, modification conceptionVadim Patsev
 
Презентация к докладу про БЭМ by Mikhail Troshev
Презентация к докладу про БЭМ  by Mikhail TroshevПрезентация к докладу про БЭМ  by Mikhail Troshev
Презентация к докладу про БЭМ by Mikhail Troshev
1 1
 
Жизнь в изоляции / Роман Дворнов (Avito)
Жизнь в изоляции / Роман Дворнов (Avito)Жизнь в изоляции / Роман Дворнов (Avito)
Жизнь в изоляции / Роман Дворнов (Avito)
Ontico
 
DOM-шаблонизаторы – не только "быстро"
DOM-шаблонизаторы – не только "быстро"DOM-шаблонизаторы – не только "быстро"
DOM-шаблонизаторы – не только "быстро"
Roman Dvornov
 
Создание веб-сайта. Курс молодого бойца
Создание веб-сайта. Курс молодого бойцаСоздание веб-сайта. Курс молодого бойца
Создание веб-сайта. Курс молодого бойца
Anton Cherepov
 
Компонентная разработка на Stylus, Jade, Typescript - Леонид Ширманов
Компонентная разработка на Stylus, Jade, Typescript - Леонид ШирмановКомпонентная разработка на Stylus, Jade, Typescript - Леонид Ширманов
Компонентная разработка на Stylus, Jade, Typescript - Леонид Ширманов
MoscowJS
 
Виталий Харисов "Настоящее и будущее БЭМ"
Виталий Харисов "Настоящее и будущее БЭМ"Виталий Харисов "Настоящее и будущее БЭМ"
Виталий Харисов "Настоящее и будущее БЭМ"
Yandex
 
Components now! (in russian)
Components now! (in russian)Components now! (in russian)
Components now! (in russian)
Mikhail Davydov
 
Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса"
Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса"Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса"
Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса"
Yandex
 
Yury Glushkov.What should we build a website.Drupal Camp Kyiv 2011
Yury Glushkov.What should we build a website.Drupal Camp Kyiv 2011Yury Glushkov.What should we build a website.Drupal Camp Kyiv 2011
Yury Glushkov.What should we build a website.Drupal Camp Kyiv 2011camp_drupal_ua
 
Yaremchuk - Корпоративные сайты
Yaremchuk - Корпоративные сайтыYaremchuk - Корпоративные сайты
Yaremchuk - Корпоративные сайтыAndrii Podanenko
 
Денис Бугарчев "Внедрение идей БЭМ на не-Яндекс проект"
Денис Бугарчев "Внедрение идей БЭМ на не-Яндекс проект"Денис Бугарчев "Внедрение идей БЭМ на не-Яндекс проект"
Денис Бугарчев "Внедрение идей БЭМ на не-Яндекс проект"
Yandex
 
Denis Bugarchev
Denis BugarchevDenis Bugarchev
Denis Bugarchev
yaevents
 
Разработка адаптивных шаблонов на базе Omega
Разработка адаптивных шаблонов на базе OmegaРазработка адаптивных шаблонов на базе Omega
Разработка адаптивных шаблонов на базе OmegaTaras Omelianenko
 
Как быть с большими сайтами на Word press
Как быть с большими сайтами  на Word pressКак быть с большими сайтами  на Word press
Как быть с большими сайтами на Word press
vovasik
 

Similar to Виталий Харисов "История создания БЭМ. Кратко, сбивчиво и неполно" (20)

Yac2012
Yac2012Yac2012
Yac2012
 
Владимир Гриненко "i-bem.js: JavaScript в БЭМ-терминах"
Владимир Гриненко "i-bem.js: JavaScript в БЭМ-терминах"Владимир Гриненко "i-bem.js: JavaScript в БЭМ-терминах"
Владимир Гриненко "i-bem.js: JavaScript в БЭМ-терминах"
 
Александр Баумгертнер — Преимущества БЭМ для небольших проектов и компаний
Александр Баумгертнер — Преимущества БЭМ для небольших проектов и компанийАлександр Баумгертнер — Преимущества БЭМ для небольших проектов и компаний
Александр Баумгертнер — Преимущества БЭМ для небольших проектов и компаний
 
как стать хорошим веб технологом. нарек мкртчян. зал 4
как стать хорошим веб технологом. нарек мкртчян. зал 4как стать хорошим веб технологом. нарек мкртчян. зал 4
как стать хорошим веб технологом. нарек мкртчян. зал 4
 
Alex baumgertner bem_in_small_projects
Alex baumgertner bem_in_small_projectsAlex baumgertner bem_in_small_projects
Alex baumgertner bem_in_small_projects
 
BEM — block, element, modification conception
BEM — block, element, modification conceptionBEM — block, element, modification conception
BEM — block, element, modification conception
 
Презентация к докладу про БЭМ by Mikhail Troshev
Презентация к докладу про БЭМ  by Mikhail TroshevПрезентация к докладу про БЭМ  by Mikhail Troshev
Презентация к докладу про БЭМ by Mikhail Troshev
 
Жизнь в изоляции / Роман Дворнов (Avito)
Жизнь в изоляции / Роман Дворнов (Avito)Жизнь в изоляции / Роман Дворнов (Avito)
Жизнь в изоляции / Роман Дворнов (Avito)
 
DOM-шаблонизаторы – не только "быстро"
DOM-шаблонизаторы – не только "быстро"DOM-шаблонизаторы – не только "быстро"
DOM-шаблонизаторы – не только "быстро"
 
Создание веб-сайта. Курс молодого бойца
Создание веб-сайта. Курс молодого бойцаСоздание веб-сайта. Курс молодого бойца
Создание веб-сайта. Курс молодого бойца
 
Компонентная разработка на Stylus, Jade, Typescript - Леонид Ширманов
Компонентная разработка на Stylus, Jade, Typescript - Леонид ШирмановКомпонентная разработка на Stylus, Jade, Typescript - Леонид Ширманов
Компонентная разработка на Stylus, Jade, Typescript - Леонид Ширманов
 
Виталий Харисов "Настоящее и будущее БЭМ"
Виталий Харисов "Настоящее и будущее БЭМ"Виталий Харисов "Настоящее и будущее БЭМ"
Виталий Харисов "Настоящее и будущее БЭМ"
 
Components now! (in russian)
Components now! (in russian)Components now! (in russian)
Components now! (in russian)
 
Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса"
Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса"Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса"
Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса"
 
Yury Glushkov.What should we build a website.Drupal Camp Kyiv 2011
Yury Glushkov.What should we build a website.Drupal Camp Kyiv 2011Yury Glushkov.What should we build a website.Drupal Camp Kyiv 2011
Yury Glushkov.What should we build a website.Drupal Camp Kyiv 2011
 
Yaremchuk - Корпоративные сайты
Yaremchuk - Корпоративные сайтыYaremchuk - Корпоративные сайты
Yaremchuk - Корпоративные сайты
 
Денис Бугарчев "Внедрение идей БЭМ на не-Яндекс проект"
Денис Бугарчев "Внедрение идей БЭМ на не-Яндекс проект"Денис Бугарчев "Внедрение идей БЭМ на не-Яндекс проект"
Денис Бугарчев "Внедрение идей БЭМ на не-Яндекс проект"
 
Denis Bugarchev
Denis BugarchevDenis Bugarchev
Denis Bugarchev
 
Разработка адаптивных шаблонов на базе Omega
Разработка адаптивных шаблонов на базе OmegaРазработка адаптивных шаблонов на базе Omega
Разработка адаптивных шаблонов на базе Omega
 
Как быть с большими сайтами на Word press
Как быть с большими сайтами  на Word pressКак быть с большими сайтами  на Word press
Как быть с большими сайтами на Word press
 

More from Yandex

Предсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksПредсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of Tanks
Yandex
 
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Yandex
 
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаСтруктурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Yandex
 
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаПредставление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Yandex
 
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Yandex
 
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Yandex
 
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Yandex
 
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Yandex
 
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Yandex
 
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Yandex
 
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Yandex
 
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Yandex
 
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровКак защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Yandex
 
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Yandex
 
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Yandex
 
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Yandex
 
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Yandex
 
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Yandex
 
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Yandex
 
Эталонное описание фильма на основе десятков дубликатов
Эталонное описание фильма на основе десятков дубликатовЭталонное описание фильма на основе десятков дубликатов
Эталонное описание фильма на основе десятков дубликатов
Yandex
 

More from Yandex (20)

Предсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksПредсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of Tanks
 
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
 
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаСтруктурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
 
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаПредставление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
 
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
 
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
 
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
 
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
 
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
 
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
 
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
 
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
 
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровКак защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
 
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
 
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
 
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
 
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
 
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
 
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
 
Эталонное описание фильма на основе десятков дубликатов
Эталонное описание фильма на основе десятков дубликатовЭталонное описание фильма на основе десятков дубликатов
Эталонное описание фильма на основе десятков дубликатов
 

Виталий Харисов "История создания БЭМ. Кратко, сбивчиво и неполно"

  • 1. История создания БЭМ Кратко, сбивчиво и неполно Виталий Харисов @harisov #b_ #yasubbotnik Я.Субботник, Минск, 2 июня 2012 года Сегодня я вам расскажу историю создания БЭМ, откуда взялись сущности БЭМ и почему они сейчас именно такие. В конце покажу, что БЭМ гибок и может применяться в том объёме, в каком это возможно в вашем проекте.
  • 2. Статья clubs.ya.ru/bem/replies.xml?item_no=1398 2 Всё, что сейчас расскажу подробно описано в статье, опубликованной в нашем клубе на Яру.
  • 3. Доисторические времена 3 Итак, начнём с самого начала.
  • 4. Яндекс.Адреса, 2005 4 Когда я начал работать над Яндекс.Адресами в далёком 2005 году, вёрстку я делал так.
  • 5. Яндекс.Адреса, 2005 Файловая система about.html index.html … adresa.css adresa.js i/ yandex.png 5 На файловой системе: • Делались статические html-странички • Стили для них складывались в один файл на весь проект — adresa.css • Скрипты — в adresa.js. Скриптов было очень мало • Картинки — в директорию в отдельную директорию
  • 6. Яндекс.Адреса, 2005 Структура CSS-файла /* Content container (begin) */ #body { font: 0.8em Arial, sans-serif; margin: 0.5em 1.95% 0.5em 2%; } /* Content container (end) */ 6 Все стили были в одном файле и для отделения стилей разных частей страницы использовались комментарии с указанием начала и конца. В вёрстке использовались как id, так и классы.
  • 7. Яндекс.Музыка, 2006 7 Адреса были маленьким проектом с несколькими страницами и такой подход к вёрстке был удобен. При вёрстке первой версии Яндекс.Музыки в начале 2006 стало понятно, что для проекта с большим количеством разных страниц этот подход работает плохо. Тяжело подбирать названия классам, код всего проекта сложно держать в голове и писать так, чтобы изменения на одной странице ничего не ломали на другой.
  • 8. Яндекс.Музыка, 2006 Типичный CSS код /* Albums (begin) */ .result .albums .info {…} .result .albums .info i {…} .result .albums .album .listen {…} /* Albums (end) */ 8 Типичный код того времени. Используется длинный каскад.
  • 9. Яндекс.Музыка, 2006 Типичный CSS код /* Картинки на фоне (begin) */ .#foot div {…} .#foot div div {…} … .#foot div div div div div div {…} /* Картинки на фоне (end) */ 9 Или вот ещё пример. Используются id и тэги.
  • 10. Яру, 2006 10 Одновременно с Музыкой началась вёрстка Яру. Это проект с десятками страниц и такой подход не работает — вёрстка становится неуправляемой.
  • 11. Появление блоков 11 И мы ввели понятие блока для частей страниц, которые имеют самостоятельное значение в дизайне.
  • 12. Яру, 2006 Появление блоков b- block независимый блок, может использоваться в любом месте страницы с- control контрол (независимый блок) с которым ассоциирован javascript-объект g- global глобальное определение, используется по необходимости, количество сведено к минимуму 12 Классы блоков получили префиксы (b-, c-, g-), чтобы отличаться от классов внутри.
  • 13. Появление элементов 13 Внутренние классы мы стали называть элементами.
  • 14. Яру, 2006 Появление элементов /* Head (begin) */ .b-head {…} /* Search (begin) */ .b-head .search {…} .b-head .search div div, .b-head .search div div i {…} /* Search (end) */ 14 Элементы, у которых много кода, выделялись комментариями.
  • 15. Структура вёрстки проекта 15 Изменилась структура вёрстки проекта.
  • 16. Яру, 2006 Структура вёрстки проекта index.html css/ yaru.css yaru-ie.css js/ yaru.js i/ yandex.png 16 Ввели директории для технологий css и js.
  • 17. Яру, 2006 yaru.css /* Common definitions (begin) */ body {…} * html body {…} /* Common definitions (end) */ /* Head (begin) */ .b-head {…} /* Head (end) */ 17 Валидные хаки для MSIE писали в основном CSS-файле.
  • 18. Яру, 2006 yaru-ie.css .b-artist .i i { top: expression(7 + (90 - this.parentNode .getElementsByTagName('img')[0] .height)/2); filter:progid:DXImageTransform. Microsoft.AlphaImageLoader(src='…’) 18 Невалидные — в файле -ie.css.
  • 19. Зачатки общепортального фреймворка 19 При верстке нескольких проектов с похожим дизайном есть общие блоки. Очень быстро понимаешь, что copy/paste этих блоков с проекта на проект не выход и надо делать common. Так появилось общее хранилище для стилей шапки, подвала, статического текста на специальном сервере.
  • 20. Зачатки общепортального фреймворка Структура CSS-файла @import url(http://…/css/head/common.css); @import url(http://…/css/foot/common.css); /* Header (begin) */ /* Service (begin) */ .b-head .service h1 {…} .b-head .service h1, .b-head .service h1 a {…} 20 Cтили с него подключались в основной проектный файл с помощью импортов. Чтобы с этим можно было уйти в продакшн, появился процесс сборки, во время которого вместо @import подставляется содержимое этих файлов.
  • 21. Вёрстка независимыми блоками 21 К осени 2007 года правила вёрстки уже устоялись, и о них захотелось рассказать вне Яндекса.
  • 22. Доклад на ClientSide‘2007 «Вёрстка независимыми блоками» 22 На ClientSide'2007 я сделал доклад «Вёрстка независимыми блоками»
  • 23. Доклад на ClientSide‘2007 Статья vitaly.harisov.name/ article/independent-blocks.html 23 Содержимое доклада можно прочитать в статье, а я сейчас расскажу самое важное.
  • 24. Доклад на ClientSide‘2007 Блок Блоком будем называть фрагмент страницы, который описывается своей разметкой и стилями. 24 В докладе вводится понятие «Блок».
  • 25. Доклад на ClientSide‘2007 Правила независимости блока 1) для описания элемента используется class, но не id 2) каждый блок имеет префикс 3) в таблице стилей нет классов вне блоков clubs.ya.ru/bem/replies.xml?item_no=4 25 Формулируются правила независимости блока. Отказ от id даёт возможность использовать один и тот же блок несколько раз на странице. А также позволяет использовать на одном DOM-узле несколько классов, что в дальнейшем нам пригодилось.
  • 26. Доклад на ClientSide‘2007 Простые и составные блоки В простые блоки нельзя вкладывать другие блоки, в составные — можно. clubs.ya.ru/bem/replies.xml?item_no=42 26 Блоки делятся на простые и составные. В простые блоки нельзя вкладывать другие блоки, в составные — можно. Это было очень наивное деление, мы неоднократно сталкивались с тем, что даже в самые простые блоки вкладывались другие и приходилось переделывать вёрстку.
  • 27. Доклад на ClientSide‘2007 Полная независимость блоков 1) никогда не опираться на элементы, только на классы: .b-user b => .b-user .first-letter 2) всем классам внутри блока давать имена начинающиеся с имени этого блока: .b-user .first-letter => .b-user__first-letter 27 Так же были сформулированы правила полной независимости блоков: 1) Нельзя использовать теги в селекторах 2) Нужно задавать каждому DOM-узлу свой класс
  • 28. Доклад на ClientSide‘2007 Абсолютно-независимые блоки clubs.ya.ru/bem/replies.xml?item_no=43 28 Позже мы назвали это АНБ (абсолютно-независимые блоки): clubs.ya.ru/bem/replies.xml? item_no=43 Но класс у каждого DOM-узла существенно увеличивает HTML-код. На тот момент мы считали, что это дорого и применяли такой подход в исключительных случаях.
  • 29. Доклад на ClientSide‘2007 Префиксы Имена блоков начинаются с префиксов b- обычные блоки h- обёртки l- раскладки g- глобальные стили 29 Тогда же, сформулировали правила для префиксов.
  • 30. Доклад на ClientSide‘2007 Модификация блоков 1. Модификация блока от контекста 2. Модификация постфиксом не зависимо от контекста, добавляя постфикс к имени блока: b-block b-block-postfix 30 Ввели понятие модификации: 1. Блок может изменить свой внешний вид в зависимости от того, где он находится. Это модификация от контекста. 2. Можно добавить блоку второй класс, это модификация постфиксом, она не зависит от контекста.
  • 31. Общепортальный фреймворк 31 Весной 2008 года была поставлена задача сделать брендбук, описывающий наш портальный стиль. Я начал с того, что умел лучше всего — делать HTML/CSS код. Если делать просто описание — оно устареет, не успев дописаться до конца.
  • 32. Лего 1.0, 2008 32 Проект получил название Лего.
  • 33. Лего 1.0, 2008 Структура репозитория css/ html/ js/ xml/ xsl/ 33 Первичное разделение на верхнем уровне репозитория идёт по технологиям. В каждой технологии своя структура.
  • 34. Лего 1.0, 2008 Структура репозитория: CSS css/ block/ b-dropdown/ b-dropdown.css service/ auto/ block/ b-head-logo-auto.css head.css util/ b-hmenu/ b-hmenu.css 34 CSS раскладывается в три разные директории.
  • 35. Лего 1.0, 2008 Структура репозитория: CSS css/ block/ b-dropdown/ b-dropdown.css service/ auto/ block/ b-head-logo-auto.css head.css util/ b-hmenu/ b-hmenu.css 35 block — общепортальные блоки util — блоки, которые имеют смысл вне Яндекса, их можно выложить в Open Source service — стили для конкретных сервисов Яндекса, подключив их на сервис можно отобразить шапку, подвал
  • 36. Лего 1.0, 2008 Структура репозитория: HTML html/ block/ b-dropdown.html service/ auto/ l-head.html util/ b-hmenu.html 36 Структура директории html аналогична css.
  • 37. Лего 1.0, 2008 Структура репозитория: JS js/ check-is-frame.js check-session.js clean-on-focus.js dropdown.js event.add.js event.del.js 37 JS находится в зачаточном состоянии.
  • 38. Лего 1.0, 2008 Структура репозитория: XML xml/ block/ b-head-tabs-communication.xml common-services.ru.xml head-messages.ru.xml service/ auto/ head.xml 38 У каждого сервиса есть XML-файл, использующийся для построения шапки.
  • 39. Лего 1.0, 2008 Структура репозитория: XSL xsl/ block/ b-dropdown.xsl b-head-line.xsl i-common.xsl i-locale.xsl l-foot.xsl l-head.xsl 39 XSL блоков лежит в одной директории. Каждому блоку соответствует один файл.
  • 40. Лего 1.0, 2008 Что ещё можно выделить Подключение через svn:externals Директории из Лего подключались на проект Статическая линковка 40 Подключение Лего на проекты делалось через svn:externals. При сборке для продакшена, код библиотеки полностью включается в проект, что можно сравнить со статической линковкой. Такой подход позволяет выпускать версии сервисов с разными версиями Лего и переходить на новую версию, когда это удобно команде проекта. Мы используем его до сих пор.
  • 41. Лего 1.0, 2008 Что ещё можно выделить Ручная поддержка структуры @import url(../../block/l-head/ l-head.css); Файлы состоят из import’ов @import url(../../block/b-head-logo/ b-head-logo.css); @import url(../../block/b-head-logo/ b-head-logo_name.css); @import url(block/b-head-logo-auto.css); 41 Файлы, подключавшиеся на страницах, состояли из @import'ов реализации блоков. Эти import’ы писались вручную.
  • 42. Лего 1.0, 2008 Что ещё можно выделить Именование файлов ещё не устоялось 42 Именование файлов ещё не устоялось, мы пробуем разные варианты.
  • 43. Лего 1.0, 2008 Что ещё можно выделить Префиксы: b- визуальные блоки l- раскладка блоков i- вспомогательные блоки 43 Используются три типа префиксов: b- для визуальных блоков l- для блоков задающих раскладку i- для вспомогательных блоков
  • 44. Лего 1.2, 2008 44 Чуть позже в рамках версии 1.2 был сделан рефакторинг…
  • 45. Лего 1.2, 2008 Структура репозитория common/ css/ js/ xml/ xsl/ example/ html/ service/ auto/ css/ xml/ 45 …и структура Лего изменилась.
  • 46. Лего 1.2, 2008 Структура репозитория: CSS common/ css/ b-dropdown/ arr/ b-dropdown.arr.css b-dropdown.arr.ie.css b-dropdown.css b-dropdown.ie.css 46 Убрано разделение на util и block, весь общий CSS лежит в common/css. От идеи выноса кода в Open Source на тот момент отказались. Вернулись к ней только через два года.
  • 47. Лего 1.2, 2008 Структура репозитория: CSS common/ css/ b-dropdown/ arr/ b-dropdown.arr.css b-dropdown.arr.ie.css b-dropdown.css b-dropdown.ie.css 47 Файлы для MSIE переименованы. Расширения у файлов теперь могут быть из нескольких слов.
  • 48. Лего 1.2, 2008 Структура репозитория: CSS common/ css/ b-dropdown/ arr/ b-dropdown.arr.css b-dropdown.arr.ie.css b-dropdown.css b-dropdown.ie.css 48 Опциональный CSS блоков вынесен в директории. В основном файле блока стало меньше кода.
  • 49. Лего 1.2, 2008 Структура репозитория: CSS .b-head-tabs-grey .b-head-tabs_grey b-head-tabs_grey.css 49 Для модификации постфиксом вместо минуса начали использовать подчёркивание. Это позволило визуально отделить имя блока от модификатора, что потом пригодилось при реализации инструментов, помогающих работать с кодом.
  • 50. БЭМ 50 В марте 2009 выходит версия Лего 2.0. Этим событием заканчивается «Вёрстка независимыми блоками» и начинается «БЭМ».
  • 51. Лего 2.0, 2009 51 Что же принципиально изменилось с выходом версии 2.0?
  • 52. Лего 2.0, 2009 Блоки первичны Блоки первичны Технологии вторичны clubs.ya.ru/bem/replies.xml?item_no=237 52 Самое главное изменение — мы вывели вперёд блоки, а не технологии. Блоки стали первичны, а технологии их реализации — вторичны. Реализация блока делалась в отдельной директории, а технологии — это файлы внутри неё. В том числе появилась документация к блоку — это файл .wiki внутри блока.
  • 53. Терминология 53 Какими терминами мы тогда оперировали?
  • 54. Лего 2.0, 2009 Терминология: Блоки XML: <lego:l-head> <lego:b-head-logo> HTML: <table class="l-head"> <div class="b-head-logo"> CSS: .l-head .b-head-logo 54 Независимый блок, который может быть использован в любом месте страницы. В XML он представлен тегом в неймспейсе lego, в HTML класс у блока, такой же, как имя этого тега.
  • 55. Лего 2.0, 2009 Терминология: Блоки common/ block/ b-head-logo/ b-head-logo.css b-head-logo.xsl b-head-logo.js b-head-logo.wiki 55 Все файлы (css, js, html, xsl), относящиеся к блоку, кладутся в его директорию.
  • 56. Лего 2.0, 2009 Терминология: Элементы XML: <lego:b-head-logo> <lego:name/> </lego:b-head-logo> HTML: <div class="b-head-logo"> <span class="name">Авто</span> </div> CSS: .b-head-logo .name 56 Элементы в XML пишутся в неймспейсе lego без префикса. Класс в HTML — тоже без префикса.
  • 57. Лего 2.0, 2009 Терминология: Элементы common/ block/ b-head-logo/ name/ b-head-logo.name.css b-head-logo.name.png b-head-logo.name.wiki 57 Файлы для вложенного элемента кладутся в отдельную директорию.
  • 58. Лего 2.0, 2009 Терминология: Модификаторы XML: <lego:b-head-tabs lego:theme="grey"> HTML: <div class="b-head-tabs b-head-tabs_grey"> CSS: .b-head-tabs_grey 58 Модификаторы в XML представлены атрибутами в неймспейсе lego. В HTML используется дополнительный класс.
  • 59. Лего 2.0, 2009 Терминология: Модификаторы common/ block/ b-head-logo/ _theme/ b-head-logo_gray.css b-head-logo_gray.png b-head-logo_gray.wiki 59 Файлы для модификатора кладутся в отдельную директорию, с подчёркиванием в начале имени. Модификатор имеет тип и значение.
  • 60. Декларация используемых блоков 60 Все лего-компоненты проекта описываются…
  • 61. Лего 2.0, 2009 Декларация <lego:page> <lego:l-head> <lego:b-head-logo> <lego:name/> </lego:b-head-logo> <lego:b-head-tabs type="search-and-content"/> 61 …в XML-файле. Из него генерируются…
  • 62. Лего 2.0, 2009 Генерируется CSS @import url(../../common/block/ b-head-logo/b-head-logo.css); @import url(../../common/block/ b-head-logo/name/ b-head-logo.name.css); @import url(block/ b-head-logo/b-head-logo.css); 62 …CSS-файлы. Сначала идёт общий код, а потом добавляются стили, чтобы привести лего-блоки к дизайну проекта. Имена файлов элементов пишутся через точку: b-head-logo.name.css
  • 63. Лего 2.0, 2009 Генерируется JS include("../../common/block/ i-locale/i-locale.js"); include("../../common/block/ b-dropdown/b-dropdown.js"); include("../../common/block/b-search/ sample/b-search.sample.js"); 63 Из XML-декларации генерируются и JS-файлы.
  • 64. Лего 2.0, 2009 Генерируется XSL <xsl:import href="../../common/block/ l-head/l-head.xsl"/> <xsl:import href="../../common/block/ b-head-logo/b-head-logo.xsl"/> <xsl:import href="../../common/block/ b-head-logo/name/ b-head-logo.name.xsl"/> 64 А также XSL-файлы. Мы перестали писать эти файлы руками, началась генерация кода.
  • 65. Проблема скорости селекторов, 2009 65 При реализации новой версии Яндекс.Почты была задача сделать её такой быстрой как программа на компьютере. Но возникли проблемы. При исследовании обнаружили, что тормозят селекторы CSS.
  • 66. Скорость селекторов, 2009 clubs.ya.ru/bem/replies.xml?item_no=338 66 Результаты исследования подробно описаны в статье.
  • 67. Скорость селекторов, 2009 Решение Абсолютно-Независимые Блоки (АНБ) clubs.ya.ru/bem/replies.xml?item_no=43 67 Мы поняли, что решение этой проблемы у нас есть давно — это абсолютно-независимые блоки.
  • 68. Скорость селекторов, 2009 Решение <div class="b-head-logo"> <span class="b-head-logo__name"> Авто </span> </div> 68 В классы элементов вносится имя блока, селекторы получаются простыми и быстрыми.
  • 69. Стабилизация нотации 69 Постепенно мы пришли к тому, что нотация в коде и структура на файловой системе устоялась и с тех пор уже не меняется.
  • 70. Стабилизация нотации Разделитель элемента Было b-block.elem.css Стало b-block__elem.css 70 В именах файлов разделитель . был заменён на __. Теперь они совпадают с CSS-селекторами.
  • 71. Стабилизация нотации Модификаторы элементов .b-block__elem_theme_green по аналогии с .b-block_theme_green 71 Были реализованы модификаторы у элементов по аналогии с модификаторами блоков.
  • 72. Стабилизация нотации Тип модификатора Было .b-menu__item_current Стало .b-menu__item_state_current 72 В имя файла модификатора и в его класс внесён тип модификатора. Причина этого изменения — работа с модификаторами из JS.
  • 73. Open Source (2010) github.com/bem 73 В 2010 году мы создали организацию bem на github’е чтобы вести разработку в open source.
  • 74. Библиотека блоков bem-bl 74 Мы начали выносить блоки из Лего в bem-bl, проводя одновременно с этим рефакторинг.
  • 75. Библиотека блоков bem-bl github.com/bem/bem-bl clubs.ya.ru/bem/posts.xml?tag=8486525 75 Вместе с выносом блоков публиковали информацию про них в клубе. Работы по выносу блоков в Open Source пока не закончены.
  • 76. Инструменты github.com/bem/bem-tools 76 Начали реализацию инструментов bem-tools, которые помогают работать с файлами по БЭМ- методу. Инструменты реализуются на JavaScript под Node.js.
  • 77. Инструменты Уровни переопределения bem-bl/ b-logo/ lego/ b-logo/ auto/ blocks/ b-logo/ 77 Директории с реализацией блоков стали называть «уровнем переопределения». Например, на проекте может быть 1) публичная библиотека блоков с github 2) внутренняя библиотека lego 3) и блоки самого проекта
  • 78. Инструменты Схемы именования .bem/ level.js 78 На уровне переопределения можно задать другую схему именования папок/файлов, отличную от нашей. Например, вы можете задать другие разделители между именем блока и элемента, или не раскладывать всё по директориям, а сделать плоскую структуру из файлов.
  • 79. BEMHTML JavaScript шаблонизатор 79 После экспериментов с разными шаблонизаторами, был разработан шаблонизатор BEMHTML.
  • 80. BEMHTML JavaScript шаблонизатор — Шаблоны в БЭМ-терминах — Уровни переопределения — На сервере и в браузере 80 Этот шаблонизатор 1) позволяет писать шаблоны в БЭМ-терминах 2) доопределять их на уровнях переопределения 3) исполнять эти шаблоны, как на сервере, так и в браузере, поскольку шаблоны компилируются в простой и быстрый JavaScript
  • 81. BEMHTML JavaScript шаблонизатор clubs.ya.ru/bem/replies.xml?item_no=898 clubs.ya.ru/bem/replies.xml?item_no=899 clubs.ya.ru/bem/replies.xml?item_no=1153 clubs.ya.ru/bem/replies.xml?item_no=1172 clubs.ya.ru/bem/replies.xml?item_no=1391 81 Подробности в клубе на Яру.
  • 82. Варианты использования БЭМ 82 Как вы можете видеть, БЭМ не появился сразу. У нас был долгий период проб и подбора наиболее подходящего нам варианта. Но хочу обратить внимание, что всё это время это был БЭМ. То, что мы используем сейчас — не единственно верное решение. Наоборот, вы можете использовать БЭМ на своих проектах в том объёме, в котором он принесёт наибольшую пользу. БЭМ методология очень гибкая и позволяет вам настраивать её под свои процессы, под свои текущие технологии. Давайте посмотрим на примерах.
  • 83. Блоки в одном файле 83 У вас есть проект, в котором вы хотите применить БЭМ для вёрстки и ни для чего более. Хорошо, мы тоже с этого начинали. Выбирайте подходящую вам схему…
  • 84. Блоки в одном файле Префиксы и классы без них .b-block .b-block .elem .b-block_size_l .b-block .elem_size_l 84 С префиксами и каскадом.
  • 85. Блоки в одном файле АНБ с префиксами .b-block .b-block__elem .b-block_size_l .b-block__elem_size_l 85 Или задайте класс каждому DOM-узлу и используйте абсолютно-независимые блоки.
  • 86. Блоки в одном файле АНБ без префиксов .block .block__elem .block_size_l .block__elem_size_l 86 Или можно убрать префиксы.
  • 87. Блоки в одном файле И верстаете myfacebook/ myfacebook.css myfacebook.js myfacebook.html 87 И начинайте делать вёрстку на проекте по БЭМ. Используйте самую простую схему на файловой системе, когда реализация блоков лежит в одном файле. При использовании этого варианта всё делается руками, без bem-tools.
  • 88. Блоки в директории 88 Когда вы поймёте, что ваш проект вырос, можно начать раскладывать реализацию блоков по файлам и использовать сборку.
  • 89. Блоки в директории blocks/ b-myblock.css b-myblock.js b-yourblock.css b-yourblock.js 89 В этом случае можно начинать использовать bem-tools для сборки проекта.
  • 90. Не обязательное в файлах 90 Если в ваших блоках есть элементы/модификаторы, которые используются не на всех страницах…
  • 91. Не обязательное в файлах blocks/ b-myblock/ b-myblock_mod_val1.css b-myblock__opt-elem.css b-myblock__opt-elem_mod_val1.css b-myblock.css 91 …можно вынести их реализацию в отдельные файлы, чтобы подключать только то, что нужно.
  • 92. Модификаторы в директориях 92 Если модификаторов много…
  • 93. Модификаторы в директориях blocks/ b-myblock/ _mod/ b-myblock_mod_val1.css b-myblock__opt-elem.css b-myblock__opt-elem_mod_val1.css b-myblock.css 93 …для каждого можно сделать отдельную директорию. Это разгрузит корневую директорию блока.
  • 94. Опциональные элементы в директориях 94 Предпоследний по сложности вариант, когда…
  • 95. Опциональные элементы в директориях blocks/ b-myblock/ _mod/ b-myblock_mod_val1.css __opt-elem/ b-myblock__opt-elem.css b-myblock.css 95 …в директории выносятся ещё и необязательные элементы, а код обязательных элементов лежит в основных файлах блока. Мы используем сейчас именно этот вариант при разработке Лего и bem-bl.
  • 96. ВСЕ элементы/модификаторы в директориях 96 Самый сложный в разработке, но самый понятный вариант по конечной структуре, когда ВСЕ элементы блока и ВСЕ модификаторы имеют свои директории.
  • 97. Все элементы/модификаторы в директориях blocks/ b-myblock/ _mod/ b-myblock_mod_val1.css __elem/ b-myblock__elem.css b-myblock.css 97 Этот вариант очень наглядный, при взгляде на файловую систему можно увидеть всю структуру блока. Мы сейчас спорим, надо нам переходить на него в Лего или нет.
  • 98. Подведём итог 98 Итак, давайте подведём итог.
  • 99. Подведём итог методология организации работы нет единственно правильного варианта набор правил команда встраивает в свой процесс 99 БЭМ — это методология организации работы над проектом, которая позволяет команде работать c единым кодом и говорить на одном языке. При этом нет единственно правильного варианта и мы не стремимся его получить. Наоборот, мы рассматриваем БЭМ как набор правил. Каждая конкретная команда встраивает его в свой процесс разработки и использует так, как им удобно.
  • 100. Статья clubs.ya.ru/bem/replies.xml?item_no=1398 100 Ещё раз обращаю ваше внимание, что всё, что я сейчас рассказывал более подробно описано в статье, опубликованной в нашем клубе на Яру.
  • 101. Виталий Харисов vitaly@yandex-team.ru @harisov #b_ #yasubbotnik Спасибо за внимание. Я готов ответить на вопросы сейчас и после доклада.