Войти с помощью github
Форум /

Хочу в этой теме обсудить структуру проекта по бэму для верстальщика. Верстальщиком называю человека, который превращает PSD в html/css и немного js. Фронтендеры пишут жирный JS и БЭМ :)

Начну из далека. У обычных верстальщиков структура примерно такая (взято из TARS):

static/                                     #  Folder for static-files. You can choose the name for that folder in tars-config.js
    └── fonts/                              # Fonts (can contain subdirectories)
    └── img/                                # Images. You can choose the name for that folder in tars-config.js
        └── content/                        # Images for content (can contain subdirectories)
        └── plugins/                        # Images for plugins (can contain subdirectories)
        └── general/                        # General images for project (can contain subdirectories)
        └── sprite/                         # Raster images, which is included in png-sprite.
            └── 96dpi/                      # Images for displays with dpi 96
            ...
            └── 384dpi/                     # Images for displays with dpi 384 (more info in images-processing)
        └── svg/                            # SVG-images
    └── js/                                 # js
        └── framework/                      # js-frameworks (backbone, for example)
        └── libraries/                      # js-libraries (jquery, for-example)
        └── plugins/                        # js-plugins
        └── separate-js/                    # js-files, which must not be included in ready bundle
    └── misc/                               # General files, which will be moved to root directory of ready project — favicons, robots.txt and so on  (can contain subdirectories)
    └── scss  
        ├── entry/                          # Styles for entry points for css in case of manual css-processing More info [here](css-manual-processing.md).                
        └── etc/                            # Styles, which will be included in the end of ready css-file (can contain subdirectories)
        └── libraries/                      # Styles for libraries (can contain subdirectories)
        └── plugins/                        # Styles for plugins (can contain subdirectories)
        └── sprite-generator-templates/     # Templates for sprite generating
        └── sprites-scss/                   # Mixins for sprites
        ├── separate-css/                   # Css-files, which must not be included in ready bundle
        ├── common.scss                     # General styles
        ├── fonts.scss                      # Styles for fonts
        ├── GUI.scss                        # Styles for GUI elements (inputs, buttons and so on)
        ├── mixins.scss                     # Project's mixins
        ├── normalize.scss                  # Styles reset
        ├── vars.scss                       # Variables

Всё разделено по реализациям и технологиям, и всё инклюдится :)

В бэме эту структуру перевернули с ног на голову и засунули всё в блок.

button
  button.css
  button.js

Допустим у нас одностраничный сайт, и все блоки лежат плоской структурой. Уровней переопределения нет.

project
  index.html
  static
    header
    footer
    button
      button.css
      button.js

Если у нас несколько страниц сайта, то появляется необходимость выделить блоки страниц на отдельный уровень переопределения. К тому же, в этом проекте воспользовались несколькими сторонними библиотеками блоков, которые тоже следует выделить на отдельный уровень переопределения. Уже на этом этапе встает вопрос о том, как удобней и универсальней это сделать.

Первый вариант я подсмотрел в исходниках сайта bem.info.

project
  about.html
  index.html
  static
    blocks
      about               # 3 level
        button
      common              # 2 level
        button
      index               # 3 level
        button
    libs                  # 1 level
      foo-components
        button

Для меня основное неудобство этого варианта в том, что общие блоки common визуально смешиваются и теряются в дереве каталогов страниц.

Второй вариант - это явно указать где что лежит.

project
  about.html
  index.html
  static
    common                # 2 level
      button
    libs                  # 1 level
      foo-components
        button
    pages                 # 3 level
      about
        button
      index
        button

Остановимся на втором варианте. Теперь нам нужно сделать мобильную версию сайта. У нас уровни переопределения будут разветвляться на платформы desktop и mobile. При этом блоки common из общих для всех страниц, превращаются в общие для платформ.

Вариант "в лоб".

project
  about.html
  index.html
  static
    common                # 2 level
      button
    libs                  # 1 level
      foo-components
        button
    desktop
      common              # 3a level
        button
      pages               # 4a level
        about
          button
    mobile
      common              # 3b level
        button
      pages               # 4b level
        about
          button

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

Можно эту структуру представить в плоском виде. При этом в названиях папок через точку определять ее "тип". В этом месте мы подбираемся к "бэму головного мозга". Добавим к этому, что источников библиотек у нас стало несколько (допустим, они не пересекаются в плане используемых блоков).

project
  about.html
  index.html
  static
    bower.libs
      foo-components
        button
    common.blocks
      button
    desktop.blocks
      button
    desktop.pages
      about
        button
    mobile.blocks
      button
    mobile.pages
      about
        button
    npm.libs
      bar-components
        input

Схлопнутый вариант:

bower.libs
common.blocks
desktop.blocks
desktop.pages
mobile.blocks
mobile.pages
npm.libs

Если для генерации html использовать шаблонизаторы, то их можно хранить внутри блоков, либо как технология проекта *.templates.

Резюмируя, у меня получается такая структура проекта. Для собранной верстки с последующей отдачей бэкендерам, можно предусмотреть папки в технологии *.dist.

bower.libs
common.blocks
common.templates
desktop.blocks
desktop.dist
desktop.pages
desktop.templates
mobile.blocks
mobile.dist
mobile.pages
mobile.templates
npm.libs

Хочется определиться со структурой и придерживаться ее во всех проектах любой сложности. Надеюсь на вашу помощь в плане того, правильно ли я понял и применяю идею технологий реализации проекта как блока. Также очень интересно узнать как бы вы по бэму положили в проект шрифты, спрайты, переменные и миксины (SCSS, LESS).