БЭМ с человеческим лицом и интеграция с backend

Верстка современных web-проектов – это сложно, долго и дорого. Казалось бы, с переходом IE на автоматические обновления, HTML5, окончанием поддержки Win XP все мы должны зажить в сказочной стране с пони и радугой. Почему легче не стало?



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


Хочется:



Самое простое решение – отказаться от серверной шаблонизации вовсе, перейти на REST-API и SPA


Плюсы



Минусы




Минусы довольно серьезные. Какие варианты, если шаблоны на сервере?


Фронтедщик редактирует серверные шаблоны


Плюсы



Минусы




Фронтэдщик редактирует свои шаблоны в чистом html без серверных вставок (возможно с препроцессорами) и передает бэкэндщику


Плюсы



Минусы




Фронтэдщик использует серверный движок при верстке и самостоятельно выделяет лейауты, блоки и шаблоны


Плюсы



Минусы




Я пробовал все описанные подходы. Мой опыт говорит, что в зависимости от типа проекта при прочих равных лучше всего работают первый и последний варианты.

Причем здесь БЭМ?


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

.

Я пробовал работать с «БЭМом» и «семантичной» версткой и пришел к выводу, что постоянные изменения требований и модификации приводят к частой необходимости в смене разметки и завязываться на имена тегов и каскады в CSS – идея так себе.

Чем плохи каскады?

Идея «выкинуть» из «каскадных» страниц стилей каскад на первый взгляд кажется крамольной, но:


Мой чеклист


Общие требования

  1. Верстка должна быть кроссбразуерной и по сетке, допускается исправление ошибок в отступах в дизайне
  2. Верстка должна быть реализована по БЭМ-методологии
  3. Верстка должна проходить w3c-валидацию
  4. Верстка удовлетворять требованиям этого чек-листа
  5. Таблицы должны использоваться только для представления табличных данных, вложенные таблицы запрещены

Формы

  1. Формы всегда должны быть оформлены с помощью тега form, тег должен содержать атрибут action
  2. Кнопки должны быть оформлены тегами input или button
  3. Для телефонов необходимо использовать маску ввода
  4. Должна быть реализована валидация

БЭМ

  1. Запрещено использовать id элементов и имена тегов, кроме исключений ниже, для задания стилей
  2. Классы должны именоваться по следующему принципу: some-block__ some-element_ some-modificator
  3. Запрещено использование inline-стилей
  4. Названия блоков и элементов должны соответствовать их назначению и функции, а не тому, как они отображаются.
    Если блоки выполняют разные функции, но выглядят одинаково, их нужно оформить как один блок с нейтральным названием, отражающим их сходство. Нет излишнему дублированию кода
  5. Необходимо использовать нормализацию для всех тегов, которые не могут иметь имени класса (случаи описаны ниже), использование reset.css не допустимо. Использование normalize.css допустимо, ровно как и вариант нормализации только для тегов, для которых невозможно задать класс
  6. Запрещено использовать каскадные стили, глубиной более одного элемента (например table td), за исключением следующей ситуации: в зависимости от примененного модификатора блока, дочерние элементы/блоки должны отображаться по-разному. Каскад будет коротким, при динамическом переключении модификатора java-script реализация гораздо проще и эффективнее с точки зрения взаимодействия с DOM, чем в случае модификации стилей всех дочерних элементов.
  7. Прификсы b- для блоков не используются
  8. Глобальные модификаторы должны быть объявлены отдельным классом, например _uppercase. Underscore в начале указывает, что это модификатор, а не блок. Для адаптивной верстки необходимо использовать глобальные модификаторы _desktop, _tablet и _phone для блоков, которые нужно отображать только на определенном девайсе. Предпочтительно использовать подход mobile-first: от простого – к сложному
  9. Стили должны быть применены к тегам через родительский каскад в случаях, когда невозможно контролировать классы элементов, например:
    • Контент вводит пользователь через форму на сайте, создается динамически или попадает из других источников, неподконтрольных нам
    • Элементы управления в форме: предпочтительно использование родительского каскада, потому что элементы формы могут создаваться с помощью серверного кода. Потребуется дополнительное переформатирование, чтобы сохранить стили элементов. Это нежелательно.

Форматирование и файловая система

  1. Использование одного большого CSS-файла или JS-файла недопустимо, необходимо использовать разветвленную файловую структуру, а именно:
  2. Каждый блок располагается в своей папке, повторно используемые блоки и основной лейауты располагаются в папке shared.
  3. Описание блока и всех элементов располагается в одном файле, именуемом <BLOCK_NAME>.css. Если описание блоков и элементов превышает 600 строк, необходимо декомпозировать его
  4. Имена классов и CSS-правила сортируются по-алфавиту
  5. Модификатор должен переопределять не более 40% стилей, в противном случае лучше создать новый блок
  6. Html-шаблон блока находится в той-же папке (используется серверная или клиентская технология шаблонизации)
  7. Лейауты отделены от страниц, все необходимые страницы «нарезаны» отдельными файлами

Бандлинг, минификация и сборка

  1. Все ресурсы должны быть подготовлены для продакшна и разделены на бандлы. Бандлы следует группировать таким образом, чтобы их количество было минимальным, а вес бандла не превышал 250КБ.
  2. Допускается и поощряется использование серверной технологии для разбиения html-макетов на лейауты, страницы и блоки
  3. Сдача-приемка производится после «сборки». Результатом является n html-страниц и файл index.html со ссылками на все сверстанные страницы. Допустимо передавать верстку в «исходниках», с приложенным bat/make-файлом и «сборщиком», если размер «сборщика» не превышает 10МБ и гарантированно может быть запущен на ОС принимающего верстку.
  4. Ссылки в css и js файлах должны быть абсолютными, в противном случае есть риск, что они не будут корректно работать после минификации



Подборка хороших материалов по БЭМ:



Просто офигенный getting started guide для новых сотрудников

Использовать в качестве чек-листа сложно из-за масштабности этого документа: habrahabr.ru/post/114256. Тут сокращенный вариант, который подойдет в качестве чек-листа: github.com/delka/html5checklist.

Проверка БЭМ

s=document.createElement('script');s.src ="//2gis.github.io/makeup/autoload/script.js";document.body.appendChild(s)
@marshinov
18.12.2014 04:07 UTC
Первоисточник