Руководство по переходу на версию 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/levels
enb/techs/bemdecl-from-bemjson
→enb-bem-techs/techs/bemjson-to-bemdecl
enb/techs/deps
→enb-bem-techs/techs/deps
enb/techs/deps-old
→enb-bem-techs/techs/deps-old
enb/techs/bemdecl-from-deps-by-tech
→enb-bem-techs/techs/deps-by-tech-to-bemdecl
enb/techs/files
→enb-bem-techs/techs/files
enb/techs/bemdecl-provide
→enb-bem-techs/techs/provide-bemdecl
enb/techs/deps-provide
→enb-bem-techs/techs/provide-deps
enb/techs/bemdecl-merge
→enb-bem-techs/techs/merge-bemdecl
enb/techs/deps-merge
→enb-bem-techs/techs/merge-deps
enb/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' }]]
}
];