Ситуация: при сборке в enb в bundle хочется подключать модули из исходного кода для использования в самом make.js
и внутри .bemhtml
шаблонов. Например, для получения общих параметров конфигурации или утилит вроде форматирования дат и пр.
В одном из прошлых проектов решал путём возврата промиса из bemjson
, который разрешался после запроса нужных зависимостей (вручную, по списку). Кажется, было что-то приличное. Где-то когда-то видел что-то (почти, кажется?) готовое, но вот никак не могу найти. Хелп?
UP: Вижу что-то похожее в API / 8.x / Шаблоны (BEMHTML, BEMTREE) / Платформа / БЭМ - Подключение-сторонних-библиотек.
Пробую поключить ym-модуль project
(находится в уровнях переопределения):
В make.js
:
// bemhtml
[techs.bemhtml, {
sourceSuffixes: ['bemhtml', 'bemhtml.js'],
forceBaseTemplates: true,
engineOptions : {
elemJsInstances : true,
requires : {
project : {
globals: 'project',
ym: 'project',
},
},
},
}],
В common.blocks/test/test.bemhtml
:
def()(function(){
var project = this.require('project');
console.log('in test.bemhtml', project);
return applyNext();
}),
Как результат, в консоль получаю undefined
.
При этом вижу, что в бандл .benhtml.js
записывается:
if (typeof modules === "object") {
modules.define("project",["project"],function(provide, ymlib) {
provide(ymlib);
});
modules.define("project",function(provide, prev) {
provide(glob["project"] || prev);
});
modules.define("BEMHTML",["project"],function(provide,dep0) {
var engine = buildBemXjst({"project":dep0});
engine.libs = {"project":dep0};
provide(engine);
});
} else {
var _libs = {};
typeof glob["project"] !== "undefined" && (_libs["project"] = glob["project"]);
if (Object.keys(_libs).length) {
BEMHTML = buildBemXjst(_libs);
exp["BEMHTML"] = BEMHTML;
exp["BEMHTML"].libs = _libs;
} else {
BEMHTML= buildBemXjst(glob);
exp["BEMHTML"] = BEMHTML;exp["BEMHTML"].libs = glob;
}
}
-- Тут щас буду разбираться, куда оно в итоге девается.
Модуль project
находится в base.blocks/project/project.js
, в test.js
(в рантайм) подключается вполне нормально, вот так:
modules.define('test', ['i-bem-dom', 'project'], function(provide, bemDom, project) {
provide(bemDom.declBlock(this.name, {
onSetMod: {
js: {
inited: function() {
console.log('project module', project);
}
}
}
}));
});
Уровни переопределения задаются в .bemrc.js
:
levels: {
'libs.blocks': { scheme : 'nested' },
'base.blocks': { scheme : 'nested' },
'common.blocks': { scheme : 'nested' },
'desktop.blocks': { scheme : 'nested' },
// 'pages': {},
},
В make.js
импортируются:
srcLevels = Object.keys(require('../.bemrc.js').levels),
Версии:
$npm list enb enb-bemxjst
+-- enb@1.5.1
`-- enb-bemxjst@8.10.4
Как написаны зависимости? Нужный блок должен попасть в сборку шаблонов (см. https://ru.bem.info/platform/deps/#Подключение-зависимостей-по-технологии)
@tadatuta Вообще, у меня
project
традиционно указывается в "общих" зависимостях -- для блокаpage
(илиApp
-- по-разному в разных проектах) -- т.е., по идее, должен присутствовать везде. Он и присутсвует (сейчас на всякий случай посмотрел сборки; впрочем, для него существует только технологияjs
; это принципиально?). Сейчас на всякий случай добавил в зависимостиtest.deps.js
:Но результат тот же. ЧЯДНТ???
общая зависимость означает, что каждая технология нужного блока попадет в соответствующий бандл (например,
project.js
попадет вbundle-name.js
).но для того, чтобы js-код попал в бандл с шаблонами, нужно написать именно как по ссылке, что я привел выше:
Мне кажется, тут некоторое взаимонепонимание (или, как минимум, непонимание с моей стороны). На всякий случай ещё раз уточню: нет проблемы добавить модуль в бандл, есть проблема использования js-модулей во время сборки шаблонов. При выполнении на клиенте я сам могу обеспечить доступность нужного кода, при сборке под enb -- в принципе тоже (кривоватым слегка образом), но мне показалось, что эта фича (передача
requires
) -- как раз про то, как это делать правильно. Это не так?