Руководство по переходу на версию 1.0.0
Базовые технологии вынесены из пакета enb@0.13.x в пакет enb-bem-techs@1.0.0.
Во время перехода на новые версии следует:
Очистить результаты прошлых сборок — команда
enb make clean.Собирать с новыми технологиями без учета кэша — команда
enb make -n.
Это нужно для того, чтобы технологии отработали правильно, не опираясь на результаты предыдущих сборок.
Обязательные требования
Технологии
Вместо технологий из пакета enb следует использовать технологии из пакета enb-bem-techs.
Внимание: Из-за того, что некоторые технологии стали возвращать и принимать результаты в BEMDECL-формате, необходимо перейти на новые технологии разом, а не постепенно.
enb/techs/levels→enb-bem-techs/techs/levelsenb/techs/bemdecl-from-bemjson→enb-bem-techs/techs/bemjson-to-bemdeclenb/techs/deps→enb-bem-techs/techs/depsenb/techs/deps-old→enb-bem-techs/techs/deps-oldenb/techs/bemdecl-from-deps-by-tech→enb-bem-techs/techs/deps-by-tech-to-bemdeclenb/techs/files→enb-bem-techs/techs/filesenb/techs/bemdecl-provide→enb-bem-techs/techs/provide-bemdeclenb/techs/deps-provide→enb-bem-techs/techs/provide-depsenb/techs/bemdecl-merge→enb-bem-techs/techs/merge-bemdeclenb/techs/deps-merge→enb-bem-techs/techs/merge-depsenb/techs/deps-subtract→enb-bem-techs/techs/subtract-deps
Манипуляции с BEMDECL- и DEPS-файлами
Чтобы объединить несколько BEMDECL-файлов, каждый из них должен быть представлен в BEMDECL-формате. Для формирования BEMDECL-файлов на основе других файлов следует использовать технологии, которые возвращают результат в BEMDECL-формате: bemjson-to-bemdecl, deps-by-tech-to-bemdecl, merge-bemdecl и provide-bemdecl.
Чтобы объединить несколько DEPS-файлов или вычесть один DEPS-файл из другого, каждый из них должен быть представлен в DEPS-формате. Для формирования DEPS-файлов на основе других файлов следует использовать технологии, которые возвращают результат в DEPS-формате: merge-deps и provide-deps.
Получение BEMDECL-файла из BEMJSON- и BEMDECL-файлов
Дополняем BEMDECL-файл, построенный по BEMJSON-файлу, другим BEMDECL-файлом.
Было:
module.exports = function (config) {
config.node('page', function (nodeConfig) {
nodeConfig.addTechs([
[require('enb/techs/file-provider'), { target: '?.bemjson.js' }],
// Результат может быть как в DEPS-формате, так и в BEMDECL-формате
[require('enb/techs/file-provider'), { target: 'required.bemdecl.js' }],
// Результат в DEPS-формате, но по пути `?.bemdecl.js`
[require('enb-bem-techs/techs/bemjson-to-bemdecl')],
// Результат в DEPS-формате, но по пути `?.bemdecl.js`
[require('enb-bem-techs/techs/bemdecl-merge'), {
bemdeclSources: ['?.bemdecl.js', 'required.bemdecl.js'],
bemdeclTarget: 'all.bemdecl.js'
}],
/* ... */
]);
}
};
Стало:
var techs = require('enb-bem-techs'),
provide = require('enb/techs/file-provider');
module.exports = function (config) {
config.node('page', function (nodeConfig) {
nodeConfig.addTechs([
[provide, { target: '?.bemjson.js' }],
// Результат должен быть в BEMDECL-формате
[provide, { target: 'required.bemdecl.js' }],
// Результат в BEMDECL-формате по пути `?.bemdecl.js`
[techs.bemdeclToBemjson],
// Результат в BEMDECL-формате по пути `?.bemdecl.js`
[techs.mergeBemdecl, {
sources: ['?.bemdecl.js', 'required.bemdecl.js'],
target: 'all.bemdecl.js'
}],
/* ... */
]);
}
};
Объединение BEMDECL-файлов из разных нод
Дополняем BEMDECL-файл текущей ноды (index) BEMDECL-файлом из другой ноды (common).
Было:
module.exports = function (config) {
config.node('bundles/index', function (nodeConfig) {
nodeConfig.addTechs([
// Результат может быть как в DEPS-формате, так и в BEMDECL-формате
[require('enb/techs/file-provider'), { target: '?.bemdecl.js' }],
// Результат в DEPS-формате, но по пути `common.bemdecl.js`
[require('enb-bem-techs/techs/bemdecl-provider'), {
sourceNodePath: 'bundles/common',
sourceTarget: 'common.bemdecl.js',
depsTarget: 'common.bemdecl.js'
}],
// Результат в DEPS-формате, но по пути `all.bemdecl.js`
[require('enb-bem-techs/techs/deps-bemdecl'), {
depsSources: ['common.bemdecl.js', '?.bemdecl.js'],
depsTarget: 'all.bemdecl.js'
}],
/* ... */
]);
}
};
Стало:
var techs = require('enb-bem-techs'),
provide = require('enb/techs/file-provider');
module.exports = function (config) {
config.node('bundles/index', function (nodeConfig) {
nodeConfig.addTechs([
// Результат должен быть в BEMDECL-формате
[provide, { target: '?.bemdecl.js' }],
// Результат в BEMDECL-формате по пути `common.bemdecl.js`
[techs.provideBemdecl, {
node: 'bundles/common',
source: 'common.bemdecl.js',
target: 'common.bemdecl.js'
}],
// Результат в BEMDECL-формате по пути `all.bemdecl.js`
[techs.mergeBemdecl, {
sources: ['common.bemdecl.js', '?.bemdecl.js'],
target: 'all.bemdecl.js'
}],
/* ... */
]);
}
};
Рекомендации
Подключение модулей технологий
Вместо подключения каждого модуля технологии по принципу require('enb/techs/tech-name') следует получать
все базовые БЭМ-технологии с помощью require('enb-bem-techs').
Было:
module.exports = function (config) {
config.node('node', function (nodeConfig) {
nodeConfig.addTechs([
[require('enb/techs/levels'), { levels: getLevels(config) }],
[require('enb/techs/file-provider'), { target: '?.bemjson.js' }],
[require('enb/techs/bemjson-to-bemdecl')],
[require('enb/techs/deps')],
[require('enb/techs/files')],
/* ... */
]);
}
};
Стало:
var techs = require('enb-bem-techs'),
provide = require('enb/techs/file-provider');
module.exports = function (config) {
config.node('node', function (nodeConfig) {
nodeConfig.addTechs([
[techs.levels, { levels: getLevels(config) }],
[provide, { target: '?.bemjson.js' }],
[techs.bemjsonToBemdecl],
[techs.deps],
[techs.files],
/* ... */
]);
}
};
Сканирование уровней
Вместо абсолютных путей до уровней переопределения можно использовать пути относительно корня проекта.
Было:
module.exports = function (config) {
config.node('node', function (nodeConfig) {
nodeConfig.addTech([require('enb/techs/levels'), {
levels: getLevels(config)
}]);
nodeConfig.addTarget('?.levels');
});
};
function getLevels(config) {
return [
{ path: 'libs/bem-core/common.blocks', check: false },
{ path: 'libs/bem-core/desktop.blocks', check: false },
'common.blocks',
'desktop.blocks'
].map(function(level) {
return config.resolvePath(level);
});
}
Стало:
var techs = require('enb-bem-techs');
module.exports = function (config) {
config.node('node', function (nodeConfig) {
nodeConfig.addTech([techs.levels, {
levels: [
{ path: 'libs/bem-core/common.blocks', check: false },
{ path: 'libs/bem-core/desktop.blocks', check: false },
'common.blocks',
'desktop.blocks'
]
}]);
nodeConfig.addTarget('?.levels');
});
}
Декларация бандлов
Формировать список БЭМ-сущностей для бандла следует в BEMDECL-, а не в DEPS-формате.
Было:
bundle.bemdecl.js
exports.deps = [
{ block: 'input' },
{ block: 'input', mod: 'size', val: 's' },
{ block: 'input', mod: 'size', val: 'm' }
];
Стало:
bundle.bemdecl.js
exports.blocks = [
{
name: 'input',
mods: [{ name: 'size', vals: [{ name: 's' }, { name: 'm' }]]
}
];