.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(), которая должна вернуть объект, в ключах которого лежат имена технологий, а в значениях:
bem-tools;По умолчанию на уровне переопределения явно не определена ни одна из технологий. Если попытаться внутри таких уровней
использовать техологии по короткому имени, например css, js и другие, то будут использованы модули технологии
из состава bem-tools, если они существуют. Полный список таких технологий смотрите в lib/techs.
Если попытаться использовать технологии, которые явно не задекларированы, и которых при этом не существуют
в bem-tools — будет использоваться реализация технологии по умолчанию
(см. lib/tech.js).
Технологии, задекларированные на уровне используются:
bem createbem buildgetLevelByIntrospection() класса Level)bem make и bem buildМы рекомендуем явно декларировать все используемые технологии.
Во время сборки проекта командами bem make и bem server для выполнения команды bem build нужно знание о том,
из каких уровней переопределения нужно собирать тот или иной бандл. Это знания необходимо отобразить в свойсте
bundleBuildLevels объекта, возвращаемого функцией getConfig().
exports.getConfig = function() {
return extend({}, this.__base() || {}, {
bundleBuildLevels: this.resolvePaths([
// your levels here
])
});
};