EN RU
Форум

Методология

Технологии

Инструментарий

Библиотеки

Учебные материалы

API технологий

Пакет предоставляет следующие технологии:

levels

Собирает информацию о БЭМ-сущностях на уровнях переопределения. Результат выполнения этой технологии необходим следующим технологиям:

Информация представляет собой экземпляр класса Levels.

Опции

target

Тип: String. По умолчанию: ?.levels.

Имя таргета, в который будет записан результат сканирования уровней переопределения.

levels

Тип: String[] | Object[].

Список путей до уровней переопределения.

Каждый путь может быть абсолютным или задаваться относительно корня проекта.

Вместо строки может использоваться объект вида { path: 'path/to/level', check: false }. Поле path является обязательным, а поле check по умолчанию равно true.

Допустимые значения поля check:


Пример

var bemTechs = require('enb-bem-techs');

module.exports = function (config) {
    config.node('bundle', function (node) {
        node.addTech([bemTechs.levels, {
            levels: [
                // В проекте не нужно менять код внешних библиотек,
                // достаточно один раз просканировать их уровни и использовать кэш.
                { path: 'libs/bem-core/common.blocks', check: false },
                { path: 'libs/bem-core/desktop.blocks', check: false },

                // Уровни проекта нужно сканировать перед каждой сборкой.
                { path: 'desktop.blocks', check: true },
            ]
        }]);
        node.addTarget('?.levels');
    });
}

levelsToBemdecl

Формирует BEMDECL-файл, состоящий из всех БЭМ-сущностей, найденных в указанных уровнях.

Опции

source

Тип: String. По умолчанию: ?.levels.

Имя таргета, из которого будет доступен результат сканирования уровней переопределения (Levels). Информацию об уровнях переопределения предоставляет технология levels.

target

Тип: String. По умолчанию: ?.bemdecl.js.

Имя файла, в который будет записан BEMDECL-файл со всеми БЭМ-сущностями, найденными в уровнях переопределения.

bemdeclFormat

Тип: String. По умолчанию: bemdecl.

Формат результирующей декларации. Возможные значения:


Пример

var bemTechs = require('enb-bem-techs');

module.exports = function (config) {
    config.node('bundle', function (node) {
        node.addTechs([
            // Сканируем уровни проекта.
            // Результат записываем в `?.levels`,
            // т.к. опция `target` по умолчанию — `?.levels`.
            [bemTechs.levels, { levels: ['blocks'] }],

            // Строим BEMDECL-файл по результатам сканирования уровней.
            // Интроспекцию берем из `?.levels`,
            // т.к. опция `source` по умолчанию — `?.levels`.
            [bemTechs.levelsToBemdecl]
        ]);
        node.addTarget('?.bemdecl.js');
    });
};

bemjsonToBemdecl

Формирует BEMDECL-файл из BEMJSON-файла.

Опции

source

Тип: String. По умолчанию: ?.bemjson.js.

Имя BEMJSON-файла, по которому будет построена декларация.

target

Тип: String. По умолчанию: ?.bemdecl.js.

Имя создоваемого BEMDECL-файла.

bemdeclFormat

Тип: String. По умолчанию: bemdecl.

Формат результирующей декларации. Возможные значения:


Пример

var bemTechs = require('enb-bem-techs'),
    FileProviderTech = require('enb/techs/file-provider');

module.exports = function (config) {
    config.node('bundle', function (node) {
        node.addTechs([
            // Предоставляет BEMJSON-файл, написанный вручную, для ENB.
            // В опции `target` имя BEMJSON-файла.
            [FileProviderTech, { target: '?.bemjson.js' }],

            // Строим BEMDECL-файл по полученному BEMJSON-файлу.
            // BEMJSON-файл берем из `?.bemjson.js`,
            // т.к. опция `source` по умолчанию — `?.bemjson.js`.
            [bemTechs.bemjsonToBemdecl]
        ]);
        node.addTarget('?.bemdecl.js');
    });
};

deps

Дополняет декларацию БЭМ-сущностей на основе информации из технологий зависимостей (deps.js или deps.yaml).

Опции

target

Тип: String. По умолчанию: ?.deps.js.

Имя собираемого файла с дополненной и упорядоченной декларацией БЭМ-сущностей.

bemdeclFile

Тип: String. По умолчанию: ?.bemdecl.js.

Имя файла с исходной декларацией БЭМ-сущностей.

levelsTarget

Тип: String. По умолчанию: ?.levels.

Имя таргета, из которого будет доступен результат сканирования уровней переопределения (Levels). Информацию об уровнях переопределения предоставляет технология levels.


Пример

Раскрытие зависимостей по BEMDECL-файлу.

var bemTechs = require('enb-bem-techs');

module.exports = function (config) {
    config.node('bundle', function (node) {
        node.addTech([bemTechs.deps, {
            bemdeclFile: '?.bemdecl.js',
            target: '?.deps.js'
        }]);
        node.addTarget('?.deps.js');
    });
};

Раскрытие зависимостей по DEPS-файлу.

var bemTechs = require('enb-bem-techs');

module.exports = function (config) {
    config.node('bundle', function (node) {
        node.addTech([bemTechs.deps, {
            bemdeclFile: 'source-decl.deps.js',
            target: '?.deps.js'
        }]);
        node.addTarget('?.deps.js');
    });
};

depsOld

Дополняет декларацию БЭМ-сущностей на основании информации из технологий зависимостей (deps.js).

Использует алгоритм, заимствованный из bem-tools.

Опции

target

Тип: String. По умолчанию: ?.deps.js.

Имя собираемого файла с дополненной и упорядоченной декларацией БЭМ-сущностей.

bemdeclFile

Тип: String. По умолчанию: ?.bemdecl.js.

Имя файла с исходной декларацией БЭМ-сущностей.

levelsTarget

Тип: String. По умолчанию: ?.levels.

Имя таргета, из которого будет доступен результат сканирования уровней переопределения (Levels). Информацию об уровнях переопределения предоставляет технология levels.

strict

Тип: Boolean. По умолчанию: false.

Включает строгий режим раскрытия зависимостей: если будет найдена хотя бы одна циклическая зависимость mustDeps (A ← B ← A), то сборка прекратится с ошибкой.


Пример

Раскрытие зависимостей по BEMDECL-файлу.

var bemTechs = require('enb-bem-techs');

module.exports = function (config) {
    config.node('bundle', function (node) {
        node.addTech([bemTechs.depsOld, {
            bemdeclFile: '?.bemdecl.js',
            target: '?.deps.js'
        }]);
        node.addTarget('?.deps.js');
    });
};

Раскрытие зависимостей по DEPS-файлу.

var bemTechs = require('enb-bem-techs');

module.exports = function (config) {
    config.node('bundle', function (node) {
        node.addTech([bemTechs.depsOld, {
            bemdeclFile: 'source-decl.deps.js',
            target: '?.deps.js'
        }]);
        node.addTarget('?.deps.js');
    });
};

depsByTechToBemdecl

Формирует BEMDECL-файл на основе зависимостей по технологиям (depsByTech). Такие зависимости описываются в deps.js-технологиях.

Опции

target

Тип: String. По умолчанию: ?.bemdecl.js.

Имя создоваемого BEMDECL-файла.

sourceTech

Тип: String. Обязательная опция.

Имя технологии, для которой собираются зависимости.

destTech

Тип: String.

Имя технологии, от которой зависит sourceTech.

filesTarget

Тип: String. По умолчанию: ?.files.

Имя таргета, из которого будет доступен список исходных deps.js файлов для сборки. Список файлов предоставляет технология files.

sourceSuffixes

Тип: String[]. По умолчанию: ['deps.js'].

Суффиксы файлов, по которым отбираются исходные файлы зависимостей для дальнейшей сборки.

bemdeclFormat

Тип: String. По умолчанию: bemdecl.

Формат результирующей декларации. Возможные значения:


Пример

Частый случай, когда БЭМ-сущность в технологии клиенского JavaScript использует свою же технологию шаблонов.

button.deps.js

{
    block: 'button'
    tech: 'js'          // sourceTech
    shouldDeps: {
        tech: 'bemhtml' // destTech
    }
}

В большинстве случаев схема построения BEMDECL-файла по depsByTech выглядит так:

(BEMJSON ->) BEMDECL (1) -> deps (2) -> files (3) -> BEMDECL (4)
var bemTechs = require('enb-bem-techs'),
    FileProviderTech = require('enb/techs/file-provider');

module.exports = function (config) {
    config.node('bundle', function () {
        node.addTechs([
            [bemTechs.levels, { levels: ['blocks'] }],
            [FileProviderTech, { target: '?.bemdecl.js' }], // (1) `?.bemdecl.js`
            [bemTechs.deps],                          // (2) `?.deps.js`
            [bemTechs.files],                         // (3) `?.files.js`
            // Далее '?.bemhtml.bemdecl.js' можно использовать для сборки шаблонов,
            // которые используются в клиенском JavaScript.
            // Список `deps.js` файлов берем из `?.files`, т.к. опция filesTarget
            // по умолчанию — `?.files`.
            [bemTechs.depsByTechToBemdecl, {          // (4) `?.bemhtml.bemdecl.js`
                target: '?.bemhtml.bemdecl.js',
                sourceTech: 'js',
                destTech: 'bemhtml'
            }]
        ]);
        node.addTarget('?.bemdecl.js');
    });
};

files

Собирает список исходных файлов и директорий для сборки на основе декларации БЭМ-сущностей, а также результате сканирования уровней (Levels).

Результат будет записан в два таргета:

Каждый список представлен экземпляром класса FileList.

Большинство технологий из других пакетов принимают на вход результат этой технологии.

Опции

filesTarget

Тип: String. По умолчанию: ?.files.

Имя таргета, в который будет записан список файлов.

dirsTarget

Тип: String. По умолчанию: ?.dirs.

Имя таргета, в который будет записан список директорий.

depsFile

Тип: String. По умолчанию: ?.deps.js.

Имя файла с декларацией БЭМ-сущностей.

levelsTarget

Тип: String. По умолчанию: ?.levels.

Имя таргета, из которого будет доступен результат сканирования уровней переопределения (Levels). Информацию об уровнях переопределения предоставляет технология levels.


Пример

Формирование списка файлов и директорий по BEMDECL-файлу.

var bemTechs = require('enb-bem-techs'),
    FileProviderTech = require('enb/techs/file-provider');

module.exports = function (config) {
    config.node('bundle', function (node) {
        node.addTechs([
            [bemTechs.levels, { levels: ['blocks'] }],
            [FileProviderTech, { target: '?.bemdecl.js' }]
            [bemTechs.files, { depsFile: '?.bemdecl.js' }]
        ]);
        node.addTargets(['?.files', '?.dirs']);
    });
};

Формирование списка файлов и директорий по DEPS-файлу.

var bemTechs = require('enb-bem-techs'),
    FileProviderTech = require('enb/techs/file-provider');

module.exports = function (config) {
    config.node('bundle', function (node) {
        node.addTechs([
            [bemTechs.levels, { levels: ['blocks'] }],
            [FileProviderTech, { target: '?.bemdecl.js' }]
            [bemTechs.deps],
            [bemTechs.files]
        ]);
        node.addTargets(['?.files', '?.dirs']);
    });
};

provideBemdecl

Копирует BEMDECL-файл в текущую ноду (node) по указанному имени из указанной ноды (node) .

Может понадобиться для объединения BEMDECL-файлов из разных нод (node) .

Опции

node

Тип: String. Обязательная опция.

Путь к ноде (node) с исходным BEMDECL-файлом.

source

Тип: String. По умолчанию: ?.bemdecl.js (демаскируется в рамках исходной ноды).

Имя исходного BEMDECL-файла, который будет скопирован.

target

Тип: String. По умолчанию: ?.bemdecl.js (демаскируется в рамках текущей ноды).

Имя создоваемого BEMDECL-файла.


Пример

/**
 * Ноды в файловой системе до сборки:
 *
 * bundles/
 * ├── bundle-1/
 *     └── bundle-1.bemdecl.js
 * ├── bundle-2/
 *     └── bundle-1.bemdecl.js
 * └── bundle-3/
 *
 * Что должно получиться после сборки:
 *
 * bundles/
 * ├── bundle-1/
 *     └── bundle-1.bemdecl.js
 * ├── bundle-2/
 *     └── bundle-2.bemdecl.js
 * └── bundle-3/
 *     ├── bundle-1.bemdecl.js
 *     └── bundle-2.bemdecl.js
 */

var bemTechs = require('enb-bem-techs');

module.exports = function (config) {
    config.node('bundle-3', function (node) {
        node.addTechs([
            // Копируем BEMDECL-файл из ноды `bundle-1` в `bundle-3`
            [bemTechs.provideBemdecl, {
                node: 'bundles/bundle-1',
                source: 'bundle-1.bemdecl.js',
                target: 'bundle-1.bemdecl.js'
            }],

            // Копируем BEMDECL-файл из ноды `bundle-2` в `bundle-3`
            [bemTechs.provideBemdecl, {
                node: 'bundles/bundle-2',
                source: 'bundle-2.bemdecl.js',
                target: 'bundle-2.bemdecl.js'
            }]
        ]);
        node.addTargets(['bundle-1.bemdecl.js', 'bundle-2.bemdecl.js']);
    })
};

provideDeps

Копирует DEPS-файл в текущую ноду (node) по указанному имени из указанной ноды (node) .

Может понадобиться для объединения DEPS-файлов из разных нод (node) .

Опции

node

Тип: String. Обязательная опция.

Путь к ноде (node) с исходным DEPS-файлом.

source

Тип: String. По умолчанию: ?.deps.js (демаскируется в рамках исходной ноды).

Имя исходного DEPS-файла, который будет скопирован из указанной ноды (node).

target

Тип: String. По умолчанию: ?.deps.js (демаскируется в рамках текущей ноды).

Имя создоваемого DEPS-файла.


Пример

/**
 * Ноды в файловой системе до сборки:
 *
 * bundles/
 * ├── bundle-1/
 *     └── bundle-1.deps.js
 * ├── bundle-2/
 *     └── bundle-1.deps.js
 * └── bundle-3/
 *
 * Что должно получиться после сборки:
 *
 * bundles/
 * ├── bundle-1/
 *     └── bundle-1.deps.js
 * ├── bundle-2/
 *     └── bundle-2.deps.js
 * └── bundle-3/
 *     ├── bundle-1.deps.js
 *     └── bundle-2.deps.js
 */

var bemTechs = require('enb-bem-techs');

module.exports = function (config) {
    config.node('bundle-3', function (node) {
        node.addTechs([
            // Копируем DEPS-файл из ноды `bundle-1` в `bundle-3`
            [bemTechs.provideDeps, {
                node: 'bundles/bundle-1',
                target: 'bundle-1.deps.js'
            }],

            // Копируем DEPS-файл из ноды `bundle-2` в `bundle-3`
            [bemTechs.provideDeps, {
                node: 'bundles/bundle-2',
                target: 'bundle-2.deps.js'
            }]
        ]);
        node.addTargets(['bundle-1.deps.js', 'bundle-2.deps.js'])
    });
};

mergeBemdecl

Объединяет BEMDECL-файлы в один файл.

Может понадобиться для формирования merged-бандла.

Опции

sources

Тип: String[]. Обязательная опция.

Список имен исходных BEMDECL-файлов, которые будут объединены.

target

Тип: String. По умолчанию: ?.bemdecl.js.

Имя собираемого BEMDECL-файла.


Пример

/**
 * Ноды в файловой системе до сборки:
 *
 * merged-bundle/
 * ├── bundle-1.bemdecl.js
 * └── bundle-2.bemdecl.js
 *
 * Что должно получиться после сборки:
 *
 * merged-bundle/
 * ├── bundle-1.bemdecl.js
 * ├── bundle-2.bemdecl.js
 * └── merged-bundle.bemdecl.js
 */

var bemTechs = require('enb-bem-techs');

module.exports = function (config) {
    config.node('merged-bundle', function (node) {
        node.addTech([bemTechs.mergeBemdecl, {
            sources: ['bundle-1.bemdecl.js', 'bundle-2.bemdecl.js'],
            target: 'merged-bundle.bemdecl.js'
        }]);
        node.addTarget('merged-bundle.bemdecl.js');
    });
};

mergeDeps

Объединяет DEPS-файлы и BEMDECL-файлы в результирующий DEPS-файл.

Может понадобиться для формирования merged-бандла.

Опции

sources

Тип: String[]. Обязательная опция.

Список имен исходных DEPS-файлов, которые будут объединены.

target

Тип: String. По умолчанию: ?.bemdecl.js.

Имя собираемого DEPS-файла.


Пример

/**
 * Ноды в файловой системе до сборки:
 *
 * merged-bundle/
 * ├── bundle-1.deps.js
 * └── bundle-2.deps.js
 *
 * Что должно получиться после сборки:
 *
 * merged-bundle/
 * ├── bundle-1.deps.js
 * ├── bundle-2.deps.js
 * └── merged-bundle.deps.js
 */

var bemTechs = require('enb-bem-techs');

module.exports = function (config) {
    config.node('merged-bundle', function (node) {
        node.addTech([bemTechs.mergeDeps, {
            sources: ['bundle-1.deps.js', 'bundle-2.deps.js'],
            target: 'merged-bundle.deps.js'
        }]);
        node.addTarget('merged-bundle.deps.js');
    });
};

subtractDeps

Формирует DEPS-файл, вычитая один DEPS-файл из другого.

Опции

target

Тип: String. По умолчанию: ?.deps.js.

Имя собираемого DEPS-файла.

from

Тип: String. Обязательная опция.

Имя DEPS-файла, из которого вычитают.

what

Тип: String. Обязательная опция.

Имя DEPS-файла, который вычитают.


Пример

var bemTechs = require('enb-bem-techs');

module.exports = function (config) {
    config.node('bundle', function () {
        node.addTech([bemTechs.subtractDeps, {
            from: 'bundle-1.deps.js',
            what: 'bundle-2.deps.js',
            target: 'bundle.deps.js'
        } ]);
        node.addTarget('bundle.deps.js');
    });
};