Руководство по переходу на версию 2.0.0
Во время перехода на новые версии следует:
- Очистить результаты прошлых сборок — команда - enb make clean.
- Собирать с новыми технологиями без учета кэша — команда - enb make -n.
Это нужно для того, чтобы технологии отработали правильно, не опираясь на результаты предыдущих сборок.
В версии 2.0.0 изменения, ломающие обратную совместимость, связаны с:
Порядок файлов
Поменялись правила упорядочивания списка файлов по нескольким суффиксам (расширениям). Теперь файлы группируются по именам БЭМ-сущностей, а не по суффиксам (расширениям). Изменения связаны с упорядочиванием:
Новый порядок следования файлов более правильный для случаев, когда возникает необходимость переопределить реализацию конкретной БЭМ-сущности, т.к. не будет возникать коллизий с переопределениями для других БЭМ-сущностей.
БЭМ-сущность vs. суффикс
Файлы должны быть отсортированы сперва по имени сущности, и только потом по суффиксу.
Было:
file.ext
file-2.ext
file.ext-2
file-2.ext-2
Стало:
file.ext
file.ext-2
file-2.ext
file-2.ext-2
Уровень переопределения vs. суффикс
Файлы должны быть отсортированы сперва по уровню, и только потом по суффиксу.
Было:
level/block/block.ext
level-2/block/block.ext
level/block/block.ext-2
level-2/block/block.ext-2
Стало:
level/block/block.ext
level/block/block.ext-2
level-2/block/block.ext
level-2/block/block.ext-2
Группировка по суффиксам
Новый подход может сломать сборку для тех случаев, когда ожидалось, что все файлы одной технологии попадут в сборку раньше, чем все файлы другой технологии. Например, чтобы файлы с суффиксом css оказались раньше, чем с ie.css.
Если нужно изменить порядок подключаемых файлов — необходимо добавить дополнительную логику в ту технологию, от которой ожидается подобное поведение. Иначе говоря, технология сборки сама должна решать какие файлы и в каком порядке необходимо собирать.
В случае со сборкой CSS-файлов для IE можно отдельно собрать обычный CSS, отдельно CSS для IE, а потом склеить файлы.
var bemTechs = require('enb-bem-techs'),
    CSSTech = require('enb/techs/css'),
    FileMergeTech = require('enb/techs/css');
module.exports = function (config) {
    config.node('bundle', function (node) {
        node.addTechs([
            // Получаем FileList
            node.addTechs([
                [FileProvideTech, { target: '?.bemdecl.js' }],
                [bemTechs.levels, levels: ['blocks']],
                [bemTechs.deps],
                [bemTechs.files]
            ]);
            // Собираем CSS-файлы без IE
            [CSSTech, { target: '?.pure.css', sourceSuffixes: ['css'] }],
            // Собираем CSS-файлы с IE
            [CSSTech, { target: '?.ie.css', sourceSuffixes: ['ie.css'] }],
            // Склеиваем собранные файлы
            [FileMergeTech, {
                sources: ['?.pure.css', '?.ie.css'],
                target: '?.css'
            }]
        ]);
        node.addTarget('?.css');
    });
};
Тогда код из файлов с суффиксом css будет гарантированно выше, чем код из файлов с суффиксом ie.css.
@import "common.blocks/button/button.css";
@import "common.blocks/button/button_hovered.css";
@import "desktop.blocks/button/button.ie.css";
@import "desktop.blocks/button/button_hovered.ie.css";
Технология deps-old
 Рекомендация: если вы не используете include: false в deps.js-файлах, и на вашем проекте нет циклических must-зависимостей, попробуйте перейти на технологию deps, т.к. она работает значительно быстрее.
В технологии deps-old была исправлена ошибка, при которой в определенных условиях не выполнялись требования некоторых must-зависимостей. В этих случаях порядок попадания файлов в сборку не гарантирует корретной работы тех БЭМ-сущностей, для которых не выполнятся требования must-зависимостей.
Важно: алгоритм раскрытия зависимостей был полностью переписан.
Несмотря на то, что мы пытались полностью сохранить «привычный» порядок при раскрытии зависимостей, единственной гарантией правильной сборки является наличие правильно написанных deps.js-файлов.
Если сборка работает без ошибок, это еще не значит, что все
deps.js-файлы написаны правильно.
Помимо синтаксических ошибок и опечаток в deps.js-файлах можно забыть указать зависимости, необходимые для одной из БЭМ-сущностей, и это не обязательно приведет к ошибке.
Пример
В декларации бандла описаны необходимые блоки.
exports.blocks = [
    { name: 'page' },
    { name: 'input' },
    { name: 'button' }
];
У блока page есть BEMHTML-реализация, поэтому необходимо добавить зависимость от базовых шаблонов.
{
    mustDeps: 'i-bem'
}
Предположим, что у блоков input и button нет зависимостей, хотя BEMHTML-реализации тоже есть.
В большинстве случаев после сборки блок i-bem попадет перед остальными блоками, это обеспечит правильную работу шаблонов для всех остальных блоков (input и button).
exports.deps = [
    { block: 'i-bem' },
    { block: 'page' },
    { block: 'input' },
    { block: 'button' }
];
Но, если мы изменим порядок исходной декларации, то базовые шаблоны могут оказаться после шаблонов блока button, и тогда шаблонизация отработает с ошибкой.
exports.blocks = [
    { name: 'button' },
    { name: 'page' },
    { name: 'input' }
];
exports.deps = [
    { block: 'button' },
    { block: 'i-bem' },
    { block: 'page' },
    { block: 'input' }
];
Таким образом, после обновления на enb-bem-techs@2.0.0 порядок БЭМ-сущностей в раскрытой декларации бандла может отличаться. Если не все необходимые зависимости были указаны в deps.js-файлах, результат сборки может оказаться неправильным.