Смотрите документацию в исходном файле lib/tech.js.
Существует несколько способов написания модулей технологии.
Во всех описанных ниже способах из методов можно обратиться к объекту технологии через this,
а через this.__base(...) можно вызвать метод одного из базовых классов. К классу технологии
можно обратиться через this.__class. Всё это является следствием использования модуля
inherit для органиазации наследования.
Способ заключается в том, что вы создаёте обычный CommonJS модуль, из
которого экспортируете несколько функций, которые перекроют методы базового
класса Tech из модуля lib/tech.js.
exports.getCreateResult = function(...) {
// ваш код
};
Вы так же можете сгруппироать все методы в объекте techMixin. Это рекомендованный способ.
exports.techMixin = {
getCreateResult: function(...) {
// ваш код
}
};
В простом способе к экспортируемым функциям добавляется переменная baseTechPath, в которой
содержится абсолютный путь до расширяемого модуля технологии.
var BEM = require('bem');
exports.baseTechPath = BEM.require.resolve('./techs/css');
Так же вы можете организовать контекстное наследование, используя переменную baseTechName.
В этом случае базовый класс будет выбран в зависимости от уровня переопределения, на котором
будет использован модуль технологии.
exports.baseTechName = 'css';
В этом примере новая технология будет расширять технологию css, заданную на уровне переопределения
в файле .bem/level.js.
Если вам нужен полный контроль, вы можете создать модуль, экспортирующий готовый класс технологии Tech.
var INHERIT = require('inherit'),
BaseTech = require('bem/lib/tech').Tech;
exports.Tech = INHERIT(BaseTech, {
create: function(prefix, vars, force) {
// do some creation work
},
build: function(prefixes, outputDir, outputName) {
// organize own build process
}
});
Если в качестве базовой технологии вы хотите использовать одну из существующих технологий,
написанных в простом стиле, воспользуйтесь функцией getTechClass() для получения класса
этой технологии. Мы рекомендуем всегда использовать getTechClass(), чтобы не зависеть
от реализации базовой технологии.
var INHERIT = require('inherit'),
BEM = require('bem'),
BaseTech = BEM.getTechClass(require.resolve('path/to/tech/module'));
exports.Tech = INHERIT(BaseTech, {
// ваш код
});