English | Русский

Уровень переопределения (.bem/level.js)

На уровне переопределения должен быть файл конфигурации .bem/level.js, который содержит в себе мета-информацию об устройстве уровня, а именно:

При создании уровня командой bem create level файл .bem/level.js создаётся пустым, что означает, что уровень — «стандартный». Поведение стандартного уровня описано в классе Level в файле lib/level.js.

Перекрыть поведение уроня просто. Файл .bem/level.js (как и практически любой файл конфигурации) является CommonJS модулем. bem-tools при обнаружении такого файла создаёт класс-наследник стандартного класса Level, используя экспорт этого модуля в качестве расширения класса (внутри используется модуль inherit).

В примере ниже перекрывается метод getTechs().

exports.getTechs = function() {

    return {
        'bemjson.js': ''
        'css': 'path/to/my/css-tech-module.js'
    }

};

Наследование уровней

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

Для задания базового уровня нужно экспортировать из модуля свойство baseLevelPath, например

exports.baseLevelPath = require.resolve('path/to/base/level.js');

Уровни-наследники также можно создавать командой

bem create level <your-level-name> --level path/to/base/level.js

Правила маппинга БЭМ-сущностей в файловую систему

По умолчанию на уровне переопределения используется следующая схема маппинга (на примере технологии css):

level/
    block/
        __elem/
            _mod/
                block__elem_mod_val.css
            block__elem.css
        _mod/
            block_mod_val.css
        block.css

Если вас не устраивает эта схема, вы можете задать свою. Для этого нужно перекрыть соответствующие match*() и get*() методы в файле .bem/level.js.

Технологии, определённые для уровня

Для уровня переопределения можно задекларировать список используемых технологий. Для этого нужно экспортировать функцию getTechs(), которая должна вернуть объект, в ключах которого лежат имена технологий, а в значениях:

По умолчанию на уровне переопределения явно не определена ни одна из технологий. Если попытаться внутри таких уровней использовать техологии по короткому имени, например css, js и другие, то будут использованы модули технологии из состава bem-tools, если они существуют. Полный список таких технологий смотрите в lib/techs.

Если попытаться использовать технологии, которые явно не задекларированы, и которых при этом не существуют в bem-tools — будет использоваться реализация технологии по умолчанию (см. lib/tech.js).

Технологии, задекларированные на уровне используются:

Мы рекомендуем явно декларировать все используемые технологии.

Мета-информация для системы сборки

Во время сборки проекта командами bem make и bem server для выполнения команды bem build нужно знание о том, из каких уровней переопределения нужно собирать тот или иной бандл. Это знания необходимо отобразить в свойсте bundleBuildLevels объекта, возвращаемого функцией getConfig().

exports.getConfig = function() {

    return extend({}, this.__base() || {}, {

        bundleBuildLevels: this.resolvePaths([
            // your levels here
        ])

    });

};