EN RU
Форум

Методология

Технологии

Инструментарий

Библиотеки

Учебные материалы

Организация файловой структуры

Все БЭМ-проекты имеют схожую файловую структуру. Привычное для разработчиков расположение файлов облегчает навигацию по проекту и упрощает переключение между проектами.

В БЭМ блок первичен, а технологии  — вторичны. Поэтому код проекта хранится по-блочно: каждому блоку соответствует свой набор файлов, необходимых для его реализации. Такой подход ускоряет разработку и отладку кода, обеспечивает оптимальный runtime: позволяет включать в сборку только необходимые файлы, точечно вносить правки и повторно использовать код.

В методологии БЭМ приняты несколько схем организации файловой структуры проекта:

Выбор схемы зависит от предпочтений разработчика.

Принципы организации файловой структуры БЭМ-проекта

Проект состоит из уровней переопределения

В проекте всегда есть один уровень переопределения. Максимальное количество уровней не ограничено.

Пример

project/
    common.blocks/      # Уровень переопределения с блоками проекта
    library.blocks/     # Уровень переопределения c блоками библиотеки

Реализация блока состоит из отдельных файлов

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

Например, если внешний вид блока input задан с помощью CSS, то код будет сохранен в файле input.css.

Пример

project
    common.blocks/
        input.css       # Реализация блока input в технологии CSS
        input.js        # Реализация блока input в технологии JavaScript

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

Пример

project
    common.blocks/
        input.css             # Реализация блока input в технологии CSS
        input.js              # Реализация блока input в технологии JavaScript
        input_theme_sun.css   # Реализация модификатора input_theme_sun
        input__clear.css      # Реализация элемента input__clear в технологии CSS
        input__clear.js       # Реализация элемента input__clear в технологии JavaScript

Файлы объединяются по смыслу, а не по типу

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

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

Пример

project
    common.blocks/
        input/                                 # Директория блока input
            input.css                          # Реализация блока input в технологии CSS
            input.js                           # Реализация блока input в технологии JavaScript
        popup/                                 # Директория блока popup
            popup.css                          # Реализация блока popup в технологии CSS 
            popup.js                           # Реализация блока popup в технологии JavaScript

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

Пример

project
    common.blocks/                             # Уровень переопределения с блоками 
        input/                                 # Директория блока input
            _type/                             # Директория модификатора input_type
                input_type_search.css          # Реализация модификатора input_type в технологии CSS
                input_type_pass.css            # Реализация модификатора input_type в технологии CSS
            input.css                          # Реализация блока input в технологии CSS
            input.js                           # Реализация блока input в технологии JavaScript
        popup/                                 # Директория блока popup

Схемы

Nested

Классическая схема организации файловой структуры БЭМ-проектов:

Пример

project
    common.blocks/                             # Уровень переопределения с блоками 
        input/                                 # Директория блока input
            _type/                             # Директория модификатора input_type
                input_type_search.css          # Реализация модификатора input_type в технологии CSS
            __clear/                           # Директория элемента input__clear
                _visible/                      # Директория модификатора input__clear_visible
                    input__clear_visible.css   # Реализация модификатора input__clear_visible в технологии CSS
                input__clear.css               # Реализация элемента input__clear в технологии CSS
                input__clear.js                # Реализация элемента input__clear в технологии JavaScript
            input.css                          # Реализация блока input в технологии CSS
            input.js                           # Реализация блока input в технологии JavaScript

Схема nested используется в файловой структуре БЭМ-библиотек:

Flat

Упрощенная схема организации файловой структуры:

Пример

project
    common.blocks/
        input_type_search.css                  # Модификатор input_type_search в технологии CSS
        input_type_search.js                   # Модификатор input_type_search в технологии Javascript
        input__clear.js                        # Опциональный элемент блока input
        input.css
        input.js
        popup.css
        popup.js
        popup.png

Flex

Максимально гибкая схема, является объединением двух схем flat и nested. Для блоков с разветвленной файловой структурой применяются правила схемы nested. Для простых блоков используется схема flat.

Особенности:

Пример

project
    common.blocks/
        input/                                 # Директория блока input
            _type/                             # Директория модификатора input_type
                input_type_search.css          # Реализация модификатора input_type в технологии CSS
            __clear/                           # Директория элемента input__clear
                _visible/                      # Директория модификатора input__clear_visible
                    input__clear_visible.css   # Реализация модификатора input__clear_visible в технологии CSS
                input__clear.css               # Реализация элемента input__clear в технологии CSS
                input__clear.js                # Реализация элемента input__clear в технологии JavaScript
            input.css                          # Реализация блока input в технологии CSS
            input.js                           # Реализация блока input в технологии JavaScript
        popup/                                 # Директория блока popup
            popup.css
            popup.js
            popup.png