Пока @veged не закрыл песочницу, скажите, как лучше подключать плагины?
Вариант нумер 1 с ручным переопределением, доопределением некоего объекта BEM.
Плагин выглядит так:
module.exports = function (BEM) {
// пишем команду
BEM.command.cmd()
.opt()....end()
.act(function () { ... });
// работаем с внуренностями
BEM.levelManager.get('somelevel').doSomething();
BEM.techManager.get('uberstrings').makeMeHappy();
// добавляем какой-то метод и объект
BEM.mySpecialMethod = function ... ;
BEM.superContainer = { ... };
};
Вариант нумер 2 с предоставлением интерфейса с ym. В этом случае можно даже зафризить объект, чтобы не было желания работать через "глобальный" объект BEM. Т.е. некий jail.
module.exports = function (BEM) {
// отдаем объект coa, который подкоманда abc
BEM.defineCmd('abc')
// тут лучше оставить как есть, решение хорошее
.opt()...end().act(...);
// внутренности закрываем
BEM.requireLevel(['somelevel'], function (somelevel) {
somelevel.doSomething();
});
BEM.requireTech(['uberstrings'], function (uberstrings) {
uberstrings.makeMeHappy();
});
// добавляем какой-то метод
BEM.define('bem', function (provide, bem) {
bem.mySpecialMethod = ...;
bem.superContainer = { ... };
provide(bem);
});
};
Вариант нумер 3. Как 2, но через "промисы":
module.exports = function (BEM) {
BEM.defineCmd...
// fail навешиваем в BEM.requireLevel, если он не найдется.
BEM.requireLevel('somelevel').thenCall('doSomething');
BEM.requireTech('uberstrings').then(function (uberstrings) {
uberstrings.makeMeBoring();
});
BEM // или просто define
.defineProperty('mySpecialMethod', function ...)
.defineProperty('...');
});
"Зачем нам этот огород?" — спросите вы. Все просто.
Менеджер уровней и уровни, которые есть в bt1.0, предлагается спрятать в пакете bem-levels, допилить, и подключать как-то так:
module.exports = function (BEM) {
require(level), require(levels), ...
var levelManager = new ...
BEM.define('levels', function () {
});
BEM.on('ready', function () {
levelManager.cd( BEM.require('config').cwd() );
});
}
Аналогичным образом, еще до bem-levels, подключится bem-config, и скажет, что он определяет config. За ними bem-deps, bem-make, build, decl, etc.
Все эти команды должны иметь 1 понятный интерфейс, чтобы работать с бэм-предметной областью, а не js-объектами, методами, магией.
p.s. Мне кажется, тут всем нравится api у coa. Можно выкинуть пачку методов для каждого define*, примерно как в 3.
Фактически, через плагины нужно будет работать с уровнями, технологиями, командами. Последние две можно описать тасками (или, как минимум, наследоваться от него). Таким образом, получится команда — coa, технология и уровень — какое-то api. Похожим образом сделано в enb: defineНечто(...).настройка1(...).настройка2(...).etc().
p.p.s. Призываю к голосованию потенциальных авторов команд, технологий, и других плюшек. Каждый голос важен!
Пока @veged не закрыл песочницу, скажите, как лучше подключать плагины?
Вариант нумер 1 с ручным переопределением, доопределением некоего объекта BEM. Плагин выглядит так:
Вариант нумер 2 с предоставлением интерфейса с ym. В этом случае можно даже зафризить объект, чтобы не было желания работать через "глобальный" объект BEM. Т.е. некий jail.
Вариант нумер 3. Как 2, но через "промисы":
"Зачем нам этот огород?" — спросите вы. Все просто. Менеджер уровней и уровни, которые есть в bt1.0, предлагается спрятать в пакете bem-levels, допилить, и подключать как-то так:
Аналогичным образом, еще до
bem-levels
, подключитсяbem-config
, и скажет, что он определяетconfig
. За нимиbem-deps
,bem-make
,build
,decl
, etc. Все эти команды должны иметь 1 понятный интерфейс, чтобы работать с бэм-предметной областью, а не js-объектами, методами, магией.p.s. Мне кажется, тут всем нравится
api
уcoa
. Можно выкинуть пачку методов для каждогоdefine*
, примерно как в 3. Фактически, через плагины нужно будет работать с уровнями, технологиями, командами. Последние две можно описать тасками (или, как минимум, наследоваться от него). Таким образом, получится команда —coa
, технология и уровень — какое-то api. Похожим образом сделано вenb
:defineНечто(...).настройка1(...).настройка2(...).etc()
.p.p.s. Призываю к голосованию потенциальных авторов команд, технологий, и других плюшек. Каждый голос важен!