В версии 0.2.0 появилась возможность использовать команды bem-tools через API.
Модуль bem экспортирует объект основной команды, у которого есть свойство api.
Использовать его можно так:
var Q = require('q'),
BEM = require('bem').api,
techs = ['css', 'js'],
blocks = ['b-block1', 'b-block2'];
Q.when(BEM.create.block({ forceTech: techs }, { names: blocks }), function() {
console.log('Create blocks: %s', blocks.join(', '));
});
Как видно из примера, можно обращаться ко всем командам bem-tools, в том числе вложенным.
Команды принимают два аргумента:
opts опции командыargs аргументы командыВозвращают объект типа Q.promise.
Команды для создания БЭМ-сущностей.
Создание уровня переопределения.
outputDir директория для записи результата, по умолчанию текущаяlevel «прототип» уровня переопределенияforce принудительно создать уровень, даже если он существуетnames имена создаваемых уровней переопределенияvar PATH = require('path'),
Q = require('q'),
BEM = require('bem').api,
outputDir = PATH.join(__dirname, 'levels'),
levels = ['blocks-common', 'blocks-desktop'];
Q.when(BEM.create.level({ outputDir: outputDir }, { names: levels }), function() {
console.log('Create levels %s at %s', levels.join(', '), outputDir);
});
Создание БЭМ сущностей: блоков, элементов, модификаторов или их значений.
level директория уровня переопределения, по умолчанию текущаяblock имя блока (обязательный параметр)elem имя элементаmod имя модификатораval значение модификатораaddTech добавить перечисленные технологии к технологиям для уровня по умолчаниюforceTech использовать только указанные технологииnoTech исключить указанные технологии из использованияforce принудительно создавать файлы модификатораvar Q = require('q'),
BEM = require('bem').api,
forceTechs = ['css'],
block = 'b-header',
elem = 'logo',
mods = ['lang'],
vals = ['ru', 'en'];
Q.when(BEM.create({ forceTechs: forceTechs, block: block, mod: mods, val: vals }), function() {
console.log('Create mod %s of block %s with vals %s', mods.join(', '), block, vals.join(', '));
});
Q.when(BEM.create({ forceTechs: forceTechs, block: block, elem: elem, mod: mods, val: vals }), function() {
console.log('Create mod %s of elem %s of block %s with vals %s', mods.join(', '), elem, block, vals.join(', '));
});
Создание блока.
level директория уровня переопределения, по умолчанию текущаяaddTech добавить перечисленные технологии к технологиям для уровня по умолчаниюforceTech использовать только указанные технологииnoTech исключить указанные технологии из использованияforce принудительно создавать файлы блокаnames имена создаваемых блоковvar Q = require('q'),
BEM = require('bem').api,
addTechs = ['bemhtml'],
blocks = ['b-header'];
Q.when(BEM.create.block({ addTech: addTechs }, { names: blocks }), function() {
console.log('Create blocks: %s', blocks.join(', '));
});
Создание элемента.
level директория уровня переопределения, по умолчанию текущаяblockName имя блока (обязательный параметр)addTech добавить перечисленные технологии к технологиям для уровня по умолчаниюforceTech использовать только указанные технологииnoTech исключить указанные технологии из использованияforce принудительно создавать файлы элементаnames имена создаваемых элементовvar Q = require('q'),
BEM = require('bem').api,
addTechs = ['bemhtml', 'title.txt'],
block = 'b-header',
elems = ['logo'];
Q.when(BEM.create.elem({ addTech: addTechs, blockName: block }, { names: elems }), function() {
console.log('Create elems %s of block %s', elems.join(', '), block);
});
Создание модификатора блока или модификатора элемента.
level директория уровня переопределения, по умолчанию текущаяblockName имя блока (обязательный параметр)elemName имя элементаmodVal значения модификатораaddTech добавить перечисленные технологии к технологиям для уровня по умолчаниюforceTech использовать только указанные технологииnoTech исключить указанные технологии из использованияforce принудительно создавать файлы модификатораnames имена создаваемых модификаторовvar Q = require('q'),
BEM = require('bem').api,
forceTechs = ['css'],
block = 'b-header',
elem = 'logo',
mods = ['lang'],
vals = ['ru', 'en'];
Q.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, modVal: vals }, { names: mods }), function() {
console.log('Create mod %s of block %s with vals %s', elems.join(', '), block, vals.join(', '));
});
Q.when(BEM.create.mod({ forceTechs: forceTechs, blockName: block, elemName: elem, modVal: vals }, { names: elems }), function() {
console.log('Create mod %s of elem %s of block %s with vals %s', elems.join(', '), elem, block, vals.join(', '));
});
Сборка файлов.
outputDir директория для записи результата, по умолчанию текущаяoutputName имя (префикс имени файла) для записи результатаoutputLevel объект уровня переопределения, на котором нужно создать файлы БЭМ сущностиblock название блокаelem название элементаmod название модификатораval значение модификатораdeclaration имя файла декларации использования (обязательный параметр)level уровень переопределенияtech собирать файлы указанных технологийВы можете использовать один из следующих вариантов для задания префикса для сохранения результата сборки:
outputName для задания полного пути-префиксаoutputDir плюс outputName для задания пути для директории и префикса файлов (они будут склеены автоматически)outputLevel плюс свойста, описывающие БЭМ сущность: block, elem, mod и val (путь-префикс будет построен
автоматически на базе правил маппинга сущностей в файлы, заданных для уровня)var Q = require('q'),
B = require('bem'),
BEM = B.api,
decl = 'page.deps.js',
outputDir = 'build',
outputName = 'page',
levels = ['blocks-common', 'blocks-desktop'],
techs = ['css', 'js'];
// используем outputDir и outputName
Q.when(
BEM.build({
outputDir: outputDir,
outputName: outputName,
declaration: decl,
level: levels,
tech: techs
}),
function() {
console.log('Finished build of techs %s for levels %s. Result in %s/%s.* files.',
techs.join(', '), levels.join(', '), outputDir, outputName);
}
);
// используем outputLevel
var level = B.createLevel('path/to/level'),
block = 'page';
Q.when(
BEM.build({
outputLevel: level,
block: block
}),
function() {
console.log('Finished build of techs %s for levels %s. Result in %s.* files.',
techs.join(', '), levels.join(', '), level.getRelByObj({ block: block }));
}
);
Команды для работы с декларациями использования.
Объединение деклараций.
output файл для записи результата, по умолчанию STDOUTdeclaration имя файла декларации использования (обязательный параметр)Вычитание деклараций.
output файл для записи результата, по умолчанию STDOUTdeclaration имя файла декларации использования (обязательный параметр)