ENB — сборщик
проектов на БЭМ
Марат Дулин
BEMup в рамках YaC 2013, Москва
ENB

Высокая скорость сборки для больших проектов
Детальная настройка сборки
Гибкая система кэширования

3
История ENB

Ускорение сборки в Картах
Конфигурация для технологий
Ускорение bem-tools

4
Скорость

Разбиение крупных технологий на более мелкие
Переиспользование промежуточных данных
Кэширование неизменяемых данных

5
Асинхронность

Полная асинхронность
Использованы более быстрые библиотеки (vow вместо Q)
В субпроцессы выделены тяжелые технологии (bemhtml)

6
Настраиваемость

Настройки для технологий
Переиспользование технологий с разными настройками
Все этапы сборки выделены в технологии

7
Настраиваемость технологий

Исходные файлы
Результирующие файлы
Дополнительные параметры

8
Сборка страницы
nodeConfig.addTechs([
[require('enb/techs/levels'), {levels: getLevels(config)}],
[require('enb/techs/file-provider'), {target: '?.bemdecl.js'}],
require('enb/techs/files'),
require('enb/techs/deps'),
[require('enb/techs/js'), {target: 'hello.js'}],
[require('enb/techs/css'), {target: 'world.css'}]
]);
nodeConfig.addTargets('hello.js', 'world.css');

9
Разработка технологий

module.exports = require('../lib/build-flow').create()
.name('js')
.target('target', '?.js')
.useFileList('js')
.justJoinFilesWithComments()
.createTech();

10
Разработка технологий
var Vow = require('vow');
var vowFs = require('vow-fs');
module.exports = require('enb/lib/build-flow').create()
.name('js')
.target('target', '?.js').useFileList('js')
.builder(function(jsFiles) {
var node = this.node;
return Vow.all(jsFiles.map(function(file) {
return vowFs.read(file.fullname, 'utf8').then(function(data) {
var filename = node.relativePath(file.fullname);
return '/* begin: ' + filename + ' */n' + data + 'n/* end: ' + filename + ' */';
});
})).then(function(contents) {
return contents.join('n');
});
}).createTech();
11
Существующие технологии
bemdecl-from-bemjson

css-includes

html-from-bemjson

levels

bemdecl-from-deps-bytech

css-less

i18n-keysets-xml

node-js

css-stylus-with-nib

i18n-lang-js-chunks

priv-js-i18n-all

css-stylus

i18n-lang-js

priv-js-i18n

css

i18n-merge-keysets

priv-js

deps-merge

js-bembundle-componenti18n

pub-js-i18n

bemdecl-merge
bemdecl-provider
bemdecl-test
borschik
browser-js
css-borschik-chunks
css-chunks
css-ie-includes
css-ie
css-ie6
css-ie7
css-ie8
css-ie9

deps-old
deps-provider
deps-subtract
deps
file-copy
file-merge
file-provider
files
html-from-bemjson-i18n

js-bembundle-component
js-bembundle-page-i18n
js-bembundle-page
js-chunks
js-expand-includes
js-i18n
js-includes

symlink
vanilla-js
xsl-2lego
xsl-convert2xml
xsl-html5-i18n
xsl-html5
xsl
xslt

js-test
js
12
Модули для ENB
enb-bemhtml
enb-bemxjst
enb-modules
grunt-enb

13
Комьюнити
Подробная документация
Принято 25 пулл-реквестов
Пакеты enb-bemhtml, enb-bemxjst поддерживаются внешним
разработчиком
http://github.com/enb-make/enb

14
Спасибо за внимание
Марат Дулин
Технический лидер
группы интерфейсов геопоиска
@mdevils
mdevils
mdevils@yandex-team.ru

16

Марат Дулин — ENB — сборщик проектов на БЭМ