0 added
0 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#статьи</a></p>
1
<p><a>#статьи</a></p>
2
<ul><li>17 авг 2022</li>
2
<ul><li>17 авг 2022</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><h2>Методология БЭМ: что это такое и как она упрощает жизнь разработчикам</h2>
4
</ul><h2>Методология БЭМ: что это такое и как она упрощает жизнь разработчикам</h2>
5
<p>Как БЭМ делает проект понятным и ускоряет процесс разработки и что думают об этой методологии сами разработчики.</p>
5
<p>Как БЭМ делает проект понятным и ускоряет процесс разработки и что думают об этой методологии сами разработчики.</p>
6
<p>Иллюстрация: Оля Ежак для Skillbox Media</p>
6
<p>Иллюстрация: Оля Ежак для Skillbox Media</p>
7
<p>По первому образованию программист, по второму - бухгалтер, а работает корректором и редактором. Потому что любит делать тексты красивыми. А ещё - узнавать новое и делиться этим с читателями.</p>
7
<p>По первому образованию программист, по второму - бухгалтер, а работает корректором и редактором. Потому что любит делать тексты красивыми. А ещё - узнавать новое и делиться этим с читателями.</p>
8
<p>Ещё Христофор Бонифатьевич во всем известном мультике говорил, что главное - правильное название. В "Яндексе", видимо, тоже знают об этом. Ещё в 2005 году там начали разрабатывать методологию БЭМ, в которой важная роль отведена правильному именованию. Разбираемся, что это такое, так ли полезно и используется ли сейчас.</p>
8
<p>Ещё Христофор Бонифатьевич во всем известном мультике говорил, что главное - правильное название. В "Яндексе", видимо, тоже знают об этом. Ещё в 2005 году там начали разрабатывать методологию БЭМ, в которой важная роль отведена правильному именованию. Разбираемся, что это такое, так ли полезно и используется ли сейчас.</p>
9
<p>Методология БЭМ - это список правил для фронтенд-проектов. Основные сущности, которыми оперирует БЭМ, - блок, элемент и модификатор.</p>
9
<p>Методология БЭМ - это список правил для фронтенд-проектов. Основные сущности, которыми оперирует БЭМ, - блок, элемент и модификатор.</p>
10
<p><strong>Блок</strong> - это абсолютно независимый компонент страницы. Он отвечает только за отображение элементов - то есть, например, у него не может быть внешних отступов margin. Блоки могут включать в себя другие блоки. Имя блока совпадает с именем селектора по классу:</p>
10
<p><strong>Блок</strong> - это абсолютно независимый компонент страницы. Он отвечает только за отображение элементов - то есть, например, у него не может быть внешних отступов margin. Блоки могут включать в себя другие блоки. Имя блока совпадает с именем селектора по классу:</p>
11
<p><strong>Элемент</strong> - это часть блока, которая имеет смысл только внутри своего блока и отдельно от него не используется. Имя селектора включает имя класса и - через двойное подчёркивание - имя элемента.</p>
11
<p><strong>Элемент</strong> - это часть блока, которая имеет смысл только внутри своего блока и отдельно от него не используется. Имя селектора включает имя класса и - через двойное подчёркивание - имя элемента.</p>
12
<p><strong>Модификатор</strong> - это сущность, которая описывает атрибуты блока или элемента: положение, состояние, поведение. Для разделения слов в именах всех сущностей используются дефисы. Модификатор в селекторе именуется через одно подчёркивание после имени элемента или блока.</p>
12
<p><strong>Модификатор</strong> - это сущность, которая описывает атрибуты блока или элемента: положение, состояние, поведение. Для разделения слов в именах всех сущностей используются дефисы. Модификатор в селекторе именуется через одно подчёркивание после имени элемента или блока.</p>
13
<p>Существуют разные вариации подходов к именованию: CamelCase (каждое слово в названии пишется с прописной буквы), Two Dashes (модификаторы отделяются двумя дефисами) и другие.</p>
13
<p>Существуют разные вариации подходов к именованию: CamelCase (каждое слово в названии пишется с прописной буквы), Two Dashes (модификаторы отделяются двумя дефисами) и другие.</p>
14
<p>БЭМ не накладывает строгих ограничений на правила именования и фокусируется на том, чтобы названия были понятными, а выбранный подход был един во всех проектах, с которыми работает компания. То есть вы можете выбрать свой стиль и просто следовать ему.</p>
14
<p>БЭМ не накладывает строгих ограничений на правила именования и фокусируется на том, чтобы названия были понятными, а выбранный подход был един во всех проектах, с которыми работает компания. То есть вы можете выбрать свой стиль и просто следовать ему.</p>
15
<p>Всё началось с селекторов.</p>
15
<p>Всё началось с селекторов.</p>
16
<p><strong>Селекторы.</strong>Сначала разработчики "Яндекса" отказались от селекторов по идентификаторам, а затем и по тегам. Раньше считалось, что селекторы по идентификаторам быстрее, но потом браузеры стали кэшировать и селекторы по классам - так разница в скорости перестала быть значимой.</p>
16
<p><strong>Селекторы.</strong>Сначала разработчики "Яндекса" отказались от селекторов по идентификаторам, а затем и по тегам. Раньше считалось, что селекторы по идентификаторам быстрее, но потом браузеры стали кэшировать и селекторы по классам - так разница в скорости перестала быть значимой.</p>
17
<p>В БЭМ разрешены только селекторы по классам. С их помощью можно реализовать всё, что позволяют остальные селекторы, но при этом вероятность, что имена селекторов случайно пересекутся, предельно мала.</p>
17
<p>В БЭМ разрешены только селекторы по классам. С их помощью можно реализовать всё, что позволяют остальные селекторы, но при этом вероятность, что имена селекторов случайно пересекутся, предельно мала.</p>
18
<p><strong>Абсолютно независимый блок.</strong>Со временем разработчики ввели понятие "абсолютно независимый блок" и таким образом фактически реализовали компонентный подход. Независимые блоки удобны для работы в команде, их можно объединять в библиотеки и переиспользовать от проекта к проекту.</p>
18
<p><strong>Абсолютно независимый блок.</strong>Со временем разработчики ввели понятие "абсолютно независимый блок" и таким образом фактически реализовали компонентный подход. Независимые блоки удобны для работы в команде, их можно объединять в библиотеки и переиспользовать от проекта к проекту.</p>
19
<p><strong>Модификаторы.</strong>Чтобы не увеличивать количество блоков при изменении их атрибутов, разработчики из "Яндекса" придумали модификаторы. Это классы и своеобразные "метки, несущие определённое свойство блоку". Например, на рисунке ниже - не три разных блока, а один, но с тремя разными модификаторами - "красный", "жёлтый" и "зелёный" - внутри.</p>
19
<p><strong>Модификаторы.</strong>Чтобы не увеличивать количество блоков при изменении их атрибутов, разработчики из "Яндекса" придумали модификаторы. Это классы и своеобразные "метки, несущие определённое свойство блоку". Например, на рисунке ниже - не три разных блока, а один, но с тремя разными модификаторами - "красный", "жёлтый" и "зелёный" - внутри.</p>
20
<em>Изображение: Skillbox Media</em><p>Код вместе с CSS можно посмотреть<a>на Codepen</a>.</p>
20
<em>Изображение: Skillbox Media</em><p>Код вместе с CSS можно посмотреть<a>на Codepen</a>.</p>
21
<p>Если модификатор описывает атрибуты, которым присваивается определённое значение (как на рисунке выше), лучше именовать его с помощью пары "ключ - значение". При этом важно правильно выбрать имя ключа и значения.</p>
21
<p>Если модификатор описывает атрибуты, которым присваивается определённое значение (как на рисунке выше), лучше именовать его с помощью пары "ключ - значение". При этом важно правильно выбрать имя ключа и значения.</p>
22
<p>Можно было бы назвать модификаторы traffic__light_color_red и так далее. Но такой подход хрупок. У светофора цвета вряд ли изменятся, но у других блоков - могут. И тогда придётся менять названия классов. Поэтому в имени модификатора лучше указывать название состояния, а не конкретного атрибута, связанного с этим состоянием. Вот так:</p>
22
<p>Можно было бы назвать модификаторы traffic__light_color_red и так далее. Но такой подход хрупок. У светофора цвета вряд ли изменятся, но у других блоков - могут. И тогда придётся менять названия классов. Поэтому в имени модификатора лучше указывать название состояния, а не конкретного атрибута, связанного с этим состоянием. Вот так:</p>
23
<ul><li>trafic__light_action_stop;</li>
23
<ul><li>trafic__light_action_stop;</li>
24
<li>trafic__light_action_wait;</li>
24
<li>trafic__light_action_wait;</li>
25
<li>trafic__light_action_go.</li>
25
<li>trafic__light_action_go.</li>
26
</ul><p><strong>Файловая система.</strong>Разработчики пробовали разные подходы к распределению файлов по директориям: по технологиям или типам файлов (CSS, HTML, JS, XML); по тому, является ли данный код общим для всех проектов (common) или нужен только для конкретного проекта (service).</p>
26
</ul><p><strong>Файловая система.</strong>Разработчики пробовали разные подходы к распределению файлов по директориям: по технологиям или типам файлов (CSS, HTML, JS, XML); по тому, является ли данный код общим для всех проектов (common) или нужен только для конкретного проекта (service).</p>
27
<p>Но в итоге остановились на структуре, в которой файлы разбиты по блокам. Один блок - одна директория, внутри - всё, что нужно для реализации этого блока: поведение, внешний вид, шаблоны, документация, тесты. Имя директории совпадает с именем блока, и оно же является именем класса. Опциональные, или необязательные, элементы блока выносятся в отдельные директории внутри директории блока.</p>
27
<p>Но в итоге остановились на структуре, в которой файлы разбиты по блокам. Один блок - одна директория, внутри - всё, что нужно для реализации этого блока: поведение, внешний вид, шаблоны, документация, тесты. Имя директории совпадает с именем блока, и оно же является именем класса. Опциональные, или необязательные, элементы блока выносятся в отдельные директории внутри директории блока.</p>
28
<p>Один из вариантов организации проекта по БЭМ:</p>
28
<p>Один из вариантов организации проекта по БЭМ:</p>
29
Структура директорий<em>Изображение: Skillbox Media</em><p><strong>Инструменты.</strong>В "Яндексе" создали фреймворк i-bem.js, а также собственный сборщик БЭМ-проектов: сначала bem-tools, а после - ENB. Сборщик нужен, чтобы подготовить файлы рабочего проекта к публикации. Например, сборщик может обработать все JS-файлы, удалить лишние пробелы и собрать файлы в один готовый к публикации JS-файл - бандл.</p>
29
Структура директорий<em>Изображение: Skillbox Media</em><p><strong>Инструменты.</strong>В "Яндексе" создали фреймворк i-bem.js, а также собственный сборщик БЭМ-проектов: сначала bem-tools, а после - ENB. Сборщик нужен, чтобы подготовить файлы рабочего проекта к публикации. Например, сборщик может обработать все JS-файлы, удалить лишние пробелы и собрать файлы в один готовый к публикации JS-файл - бандл.</p>
30
<p>Фреймворк, хотя его можно назвать и библиотекой, i-bem.js включает в себя базовый блок i-bem, позволяющий на его основе создавать другие блоки и писать код на JS в терминах блоков, элементов и модификаторов.</p>
30
<p>Фреймворк, хотя его можно назвать и библиотекой, i-bem.js включает в себя базовый блок i-bem, позволяющий на его основе создавать другие блоки и писать код на JS в терминах блоков, элементов и модификаторов.</p>
31
<p><strong>БЭМ-дерево.</strong>Чтобы не тратить время на написание HTML-кода руками, создали БЭМ-дерево. Оно описывает порядок блоков, а шаблонизатор BEMHTML превращает его в HTML. Схематично БЭМ-дерево выглядит как иерархия классов:</p>
31
<p><strong>БЭМ-дерево.</strong>Чтобы не тратить время на написание HTML-кода руками, создали БЭМ-дерево. Оно описывает порядок блоков, а шаблонизатор BEMHTML превращает его в HTML. Схематично БЭМ-дерево выглядит как иерархия классов:</p>
32
<em>Скриншот: Skillbox Media</em><p>В понятном для шаблонизатора формате BEMJSON эта иерархия выглядит так:</p>
32
<em>Скриншот: Skillbox Media</em><p>В понятном для шаблонизатора формате BEMJSON эта иерархия выглядит так:</p>
33
<em>Скриншот: Skillbox Media</em><p>Такой код набрать гораздо быстрее, чем HTML. Всю рутинную работу по созданию HTML сделает шаблонизатор.</p>
33
<em>Скриншот: Skillbox Media</em><p>Такой код набрать гораздо быстрее, чем HTML. Всю рутинную работу по созданию HTML сделает шаблонизатор.</p>
34
<p>БЭМ начали разрабатывать в 2005 году, и этот подход до сих пор актуален.</p>
34
<p>БЭМ начали разрабатывать в 2005 году, и этот подход до сих пор актуален.</p>
35
<p>"Кому нужно, и считает это клёвым - уже юзает, либо просто в курсе этого, кому не нужно - обходит стороной".</p>
35
<p>"Кому нужно, и считает это клёвым - уже юзает, либо просто в курсе этого, кому не нужно - обходит стороной".</p>
36
<p><a>Комментарий</a>к статье на "Хабре" от 2016 года</p>
36
<p><a>Комментарий</a>к статье на "Хабре" от 2016 года</p>
37
<ul><li><strong>Понятная структура проекта.</strong>Просто взглянув на названия селекторов, можно понять, как устроен проект и за что отвечает тот или иной класс.</li>
37
<ul><li><strong>Понятная структура проекта.</strong>Просто взглянув на названия селекторов, можно понять, как устроен проект и за что отвечает тот или иной класс.</li>
38
<li><strong>Одновременная работа над разными компонентами.</strong>Правила именования обеспечивают уникальность селекторов, вероятность повториться в именах модификаторов мала. Поэтому разработчики могут работать одновременно и не создавать коллизий.</li>
38
<li><strong>Одновременная работа над разными компонентами.</strong>Правила именования обеспечивают уникальность селекторов, вероятность повториться в именах модификаторов мала. Поэтому разработчики могут работать одновременно и не создавать коллизий.</li>
39
<li><strong>Быстрый онбординг новых сотрудников.</strong>Изучение проекта требует меньше времени, потому что компоненты по БЭМ документируют сами себя.</li>
39
<li><strong>Быстрый онбординг новых сотрудников.</strong>Изучение проекта требует меньше времени, потому что компоненты по БЭМ документируют сами себя.</li>
40
<li><strong>Высокая скорость разработки.</strong>Понятная структура облегчает рефакторинг, а возможность переиспользования - создание новых проектов.</li>
40
<li><strong>Высокая скорость разработки.</strong>Понятная структура облегчает рефакторинг, а возможность переиспользования - создание новых проектов.</li>
41
<li><strong>Безопасность при привлечении сторонних сотрудников.</strong>Проект строится из независимых блоков, поэтому каждому задействованному разработчику знать подробности всего проекта не нужно. Специалисты могут работать в рамках отдельных компонентов. Это позволяет привлекать сторонних специалистов на большие проекты.</li>
41
<li><strong>Безопасность при привлечении сторонних сотрудников.</strong>Проект строится из независимых блоков, поэтому каждому задействованному разработчику знать подробности всего проекта не нужно. Специалисты могут работать в рамках отдельных компонентов. Это позволяет привлекать сторонних специалистов на большие проекты.</li>
42
<li><strong>Гибкость.</strong>Можно применять не всю методологию, а только часть. И даже это может сделать работу над проектом удобнее.</li>
42
<li><strong>Гибкость.</strong>Можно применять не всю методологию, а только часть. И даже это может сделать работу над проектом удобнее.</li>
43
</ul><p>"…БЭМ прошел огромный путь, но вовсе не остановился. И на сегодняшний день не является какой-то отдельностоящей штукой, а отлично взаимодействует со множеством других инструментов, фреймворков, шаблонизаторов, etc.".</p>
43
</ul><p>"…БЭМ прошел огромный путь, но вовсе не остановился. И на сегодняшний день не является какой-то отдельностоящей штукой, а отлично взаимодействует со множеством других инструментов, фреймворков, шаблонизаторов, etc.".</p>
44
<p><a><strong>Владимир Гриненко</strong></a>, руководитель службы интерфейсов экосистемы "Яндекса" (<a>комментарий</a>на "Хабре")</p>
44
<p><a><strong>Владимир Гриненко</strong></a>, руководитель службы интерфейсов экосистемы "Яндекса" (<a>комментарий</a>на "Хабре")</p>
45
<p>Не все разработчики были в восторге от БЭМ. Правда, их недовольство больше похоже на раздражение от того, что приходится изучать нечто новое, или на зависть к тем, кто раньше придумал такой простой и очевидный подход.</p>
45
<p>Не все разработчики были в восторге от БЭМ. Правда, их недовольство больше похоже на раздражение от того, что приходится изучать нечто новое, или на зависть к тем, кто раньше придумал такой простой и очевидный подход.</p>
46
<p>"Нужно запретить пропаганду БЭМ, ввести штраф за публичную демонстрацию БЭМ, etc.".</p>
46
<p>"Нужно запретить пропаганду БЭМ, ввести штраф за публичную демонстрацию БЭМ, etc.".</p>
47
<p><a>Комментарий</a>на "Хабре"</p>
47
<p><a>Комментарий</a>на "Хабре"</p>
48
<p>Однако конструктивные комментарии о недостатках БЭМ найти всё же можно. Вот самые важные пункты критики:</p>
48
<p>Однако конструктивные комментарии о недостатках БЭМ найти всё же можно. Вот самые важные пункты критики:</p>
49
<p><strong>1. Использование блоков там, где можно обойтись без них.</strong>На небольших проектах код для маленьких компонентов (например, логотипа или единственной кнопки), созданный в соответствии с принципами БЭМ, может выглядеть громоздко.</p>
49
<p><strong>1. Использование блоков там, где можно обойтись без них.</strong>На небольших проектах код для маленьких компонентов (например, логотипа или единственной кнопки), созданный в соответствии с принципами БЭМ, может выглядеть громоздко.</p>
50
<p><strong>2. Длинные имена элементов и модификаторов.</strong>Названия сущностей из нескольких слов могут серьёзно усложнить названия селекторов, и разработчику, не привыкшему к БЭМ, разбираться в них будет сложно. Поэтому при разработке приходится продумывать имена более тщательно, чтобы плюсы БЭМ не превращались в минусы.</p>
50
<p><strong>2. Длинные имена элементов и модификаторов.</strong>Названия сущностей из нескольких слов могут серьёзно усложнить названия селекторов, и разработчику, не привыкшему к БЭМ, разбираться в них будет сложно. Поэтому при разработке приходится продумывать имена более тщательно, чтобы плюсы БЭМ не превращались в минусы.</p>
51
<p>"Очевидно единственный, но серьезный недостаток БЭМ, это то, что он убивает саму идею каскадности превращая css в ss.</p>
51
<p>"Очевидно единственный, но серьезный недостаток БЭМ, это то, что он убивает саму идею каскадности превращая css в ss.</p>
52
<p>Причем БЭМ не исправляет недостатки реализации каскадности, изначально заложенные в css, а именно пытается устранить ее влияние полностью".</p>
52
<p>Причем БЭМ не исправляет недостатки реализации каскадности, изначально заложенные в css, а именно пытается устранить ее влияние полностью".</p>
53
<p><a>Комментарий</a>на "Хабре"</p>
53
<p><a>Комментарий</a>на "Хабре"</p>
54
<p><strong>3. Необходимость знать БЭМ, чтобы работать с проектом и понимать принятую на проекте схему именования селекторов.</strong>Любые технологии требуют изучения, а именование в БЭМ поначалу может казаться избыточным. Но это тот случай, когда "лучше день потерять, потом за пять минут долететь".</p>
54
<p><strong>3. Необходимость знать БЭМ, чтобы работать с проектом и понимать принятую на проекте схему именования селекторов.</strong>Любые технологии требуют изучения, а именование в БЭМ поначалу может казаться избыточным. Но это тот случай, когда "лучше день потерять, потом за пять минут долететь".</p>
55
<p>"Сам долго плевался от синтаксиса и этих двойных подчеркиваний и всего такого, но в итоге сдался, потому что это чертовски удобно, вариантов используемого синтаксиса не так уж много (не любитель camelCase в CSS, поэтому остановился на BEM с синтаксисом<a>Гарри Робертса</a>, по примеру<a>Гугла</a>и <a>Salesforce</a>), а преимущества на дистанции - очень солидные".</p>
55
<p>"Сам долго плевался от синтаксиса и этих двойных подчеркиваний и всего такого, но в итоге сдался, потому что это чертовски удобно, вариантов используемого синтаксиса не так уж много (не любитель camelCase в CSS, поэтому остановился на BEM с синтаксисом<a>Гарри Робертса</a>, по примеру<a>Гугла</a>и <a>Salesforce</a>), а преимущества на дистанции - очень солидные".</p>
56
<p><a>Комментарий</a>на "Хабре"</p>
56
<p><a>Комментарий</a>на "Хабре"</p>
57
<p><strong>4. Расплывчатость понятия "по БЭМ".</strong>Обратная сторона гибкости БЭМ - сложно быстро объяснить, какие именно правила из методологии вы используете.</p>
57
<p><strong>4. Расплывчатость понятия "по БЭМ".</strong>Обратная сторона гибкости БЭМ - сложно быстро объяснить, какие именно правила из методологии вы используете.</p>
58
Слайд<a>презентации</a>"БЭМ в дикой природе"<em>Скриншот:<a>wsd.events</a></em><p>Несмотря на недостатки и недовольство некоторых разработчиков, подход, заложенный в БЭМ, используют по всему миру.</p>
58
Слайд<a>презентации</a>"БЭМ в дикой природе"<em>Скриншот:<a>wsd.events</a></em><p>Несмотря на недостатки и недовольство некоторых разработчиков, подход, заложенный в БЭМ, используют по всему миру.</p>
59
<p>"Да ладно, БЭМ однозначно взлетел, причем не только в России, но и в мире - а это редко кому удается".</p>
59
<p>"Да ладно, БЭМ однозначно взлетел, причем не только в России, но и в мире - а это редко кому удается".</p>
60
<p><a>Комментарий</a>на "Хабре"</p>
60
<p><a>Комментарий</a>на "Хабре"</p>
61
<p>Гари Робертс<a>называет</a>себя фанатом БЭМ и использует свой, расширенный синтаксис именования классов. Разработчики из Google в своём гитхабе<a>объясняют</a>, как они понимают БЭМ.</p>
61
<p>Гари Робертс<a>называет</a>себя фанатом БЭМ и использует свой, расширенный синтаксис именования классов. Разработчики из Google в своём гитхабе<a>объясняют</a>, как они понимают БЭМ.</p>
62
<p>"Говоря о популярности БЭМ и о том, что мы сами используем его в mdl, надо всё-таки разделять подход к наименованию классов, который и правда хорош и распространен (с небольшими кастомизациями как у нас в Google), и инструменты типа bem-tools, которые, мягко говоря, медлительны. И никто в Google никогда не будет их использовать".</p>
62
<p>"Говоря о популярности БЭМ и о том, что мы сами используем его в mdl, надо всё-таки разделять подход к наименованию классов, который и правда хорош и распространен (с небольшими кастомизациями как у нас в Google), и инструменты типа bem-tools, которые, мягко говоря, медлительны. И никто в Google никогда не будет их использовать".</p>
63
<p><a>Комментарий</a>на "Хабре"</p>
63
<p><a>Комментарий</a>на "Хабре"</p>
64
<p>Знание БЭМ сегодня пригодится и верстальщикам и разработчикам. На HeadHunter больше ста пятидесяти вакансий с упоминанием БЭМ в требованиях.</p>
64
<p>Знание БЭМ сегодня пригодится и верстальщикам и разработчикам. На HeadHunter больше ста пятидесяти вакансий с упоминанием БЭМ в требованиях.</p>
65
Пример вакансии с HeadHunter<em>Скриншот:<a>hh.ru</a></em>Пример вакансии с HeadHunter<em>Скриншот:<a>hh.ru</a></em><p><a>БЭМ-библиотеки</a>с универсальными компонентами (блоками) выложены в открытый доступ. Для их подключения не нужны специальные инструменты или шаблонизаторы. Файлы библиотеки можно добавить в HTML-код страницы с помощью обычных link и script.</p>
65
Пример вакансии с HeadHunter<em>Скриншот:<a>hh.ru</a></em>Пример вакансии с HeadHunter<em>Скриншот:<a>hh.ru</a></em><p><a>БЭМ-библиотеки</a>с универсальными компонентами (блоками) выложены в открытый доступ. Для их подключения не нужны специальные инструменты или шаблонизаторы. Файлы библиотеки можно добавить в HTML-код страницы с помощью обычных link и script.</p>
66
<p>Сегодня никто не ставит себе задачи строжайше следовать БЭМ. Можно сказать, что методология БЭМ разделилась на две части: инструменты разработки и подход к именованию классов. Последний проверен временем и используется не только в России. Так что принципы, заложенные в БЭМ, определённо заслуживают изучения.</p>
66
<p>Сегодня никто не ставит себе задачи строжайше следовать БЭМ. Можно сказать, что методология БЭМ разделилась на две части: инструменты разработки и подход к именованию классов. Последний проверен временем и используется не только в России. Так что принципы, заложенные в БЭМ, определённо заслуживают изучения.</p>
67
<a>Научитесь: Профессия Фронтенд-разработчик + ИИ Узнать больше</a>
67
<a>Научитесь: Профессия Фронтенд-разработчик + ИИ Узнать больше</a>