bem/bem-tools
-
#### Конфигурирование сборки
#### Конфигурирование сборки
-
В системе сборки предусмотрено некоторое поведение по умолчанию. С помощью файлов конфигурации можно как немного изменить его, так и кардинально переделать. Необходимым минимумом для работы bem make являются конфиги `.bem/level.js` на уровнях переопределения с функцией `getTechs()`, возвращающей массив технологий, задействованных на уровне. И функцией `getConfig()`:
В системе сборки предусмотрено некоторое поведение по умолчанию. С помощью файлов конфигурации можно как немного изменить
его, так и кардинально переделать. Необходимым минимумом для работы bem make являются конфиги `.bem/level.js` на уровнях
переопределения с функцией `getTechs()`, возвращающей массив технологий, задействованных на уровне. И функцией `getConfig()`: -
```js var extend = require('bem/lib/util').extend;
```js
var extend = require('bem/lib/util').extend; -
exports.getTechs = function() { return { 'bemjson.js': '', 'js': 'js-i', 'bemhtml.js': '../../bem-bl/blocks-common/i-bem/bem/techs/bemhtml.js', 'priv.js': '../../.bem/techs/priv.js', 'html': '../../bem-bl/blocks-common/i-bem/bem/techs/html' }; };
exports.getTechs = function() {
return {
'bemjson.js': '',
'js': 'js-i',
'bemhtml.js': '../../bem-bl/blocks-common/i-bem/bem/techs/bemhtml.js',
'priv.js': '../../.bem/techs/priv.js',
'html': '../../bem-bl/blocks-common/i-bem/bem/techs/html'
};
}; -
exports.getConfig = function() {
exports.getConfig = function() {
-
return extend({}, this.__base() || {}, {
return extend({}, this.__base() || {}, {
-
bundleBuildLevels: this.resolvePaths([ '../../bem-bl/blocks-common', '../../bem-bl/blocks-desktop', '../../blocks' ])
bundleBuildLevels: this.resolvePaths([
'../../bem-bl/blocks-common',
'../../bem-bl/blocks-desktop',
'../../blocks'
]) -
});
});
-
}; ```
};
``` -
`getTechs()` возвращает массив подключаемых технологий: ключ (например `'bemjson.js'`, `'js'`, `'bemhtml.js'`) указывает имя, под котором технологию можно будет использовать, значение (`''`, `'js-i'`, `'../../bem-bl/blocks-common/i-bem/bem/techs/bemhtml.js'`) - где взять сам файл технологии. В качестве этого значения может быть указан абсолютный или относительный путь к файлу, пустая строка или просто имя файла. В последнем случае подразумевается, что технология стандартная (входит в состав bem-tools) и ее поиск будет произведен в директории `[bem]/lib/techs`.
`getTechs()` возвращает массив подключаемых технологий: ключ (например `'bemjson.js'`, `'js'`, `'bemhtml.js'`) указывает
имя, под котором технологию можно будет использовать, значение (`''`, `'js-i'`, `'../../bem-bl/blocks-common/i-bem/bem/techs/bemhtml.js'`) -
где взять сам файл технологии. В качестве этого значения может быть указан абсолютный или относительный путь к файлу,
пустая строка или просто имя файла. В последнем случае подразумевается, что технология стандартная (входит в состав
bem-tools) и ее поиск будет произведен в директории `[bem]/lib/techs`. -
Функция `getConfig()` возвращает объект со свойстовом `bundleBuildLevels`, содержащим массив подключаемых уровней блоков.
Функция `getConfig()` возвращает объект со свойстовом `bundleBuildLevels`, содержащим массив подключаемых уровней блоков.
-
Второй (опциональный) компонент конфигурации - это файл `.bem/make.js` в корне проекта. Основой сборки является граф узлов, каждый из которых отвечает за выполнение своей части всего процесса. В `make.js` можно изменять поведение узлов и построение дерева. Существует несколько типов стандартных узлов: * `Node` - базовый узел, от которого наследуются все остальные * `LibraryNode` - отвечает за подключение внешних библиотек * `LevelNode` - анализирует содержимое уровня переопределения и достраивает дерево для сборки этого уровня * `BundlesLevelNode` - доопределяет `LevelNode` для сборки уровней бандлов * `BundleNode` - достраивает дерево для сборки бандла * `MergedBundleNode` - отвечает за сборку merged бандла (называемого так же common) * `BorschikNode` - прогоняет файлы через утилиту `borschik`, которая разворачивает инклюды * `Arch` - строит исходное дерево, состоящее главным образом из узлов `LibraryNode`, `BundlesLevelNode`, `LevelNode`
Второй (опциональный) компонент конфигурации - это файл `.bem/make.js` в корне проекта. Основой сборки является граф
узлов, каждый из которых отвечает за выполнение своей части всего процесса. В `make.js` можно изменять поведение узлов
и построение дерева. Существует несколько типов стандартных узлов:
* `Node` - базовый узел, от которого наследуются все остальные
* `LibraryNode` - отвечает за подключение внешних библиотек
* `LevelNode` - анализирует содержимое уровня переопределения и достраивает дерево для сборки этого уровня
* `BundlesLevelNode` - доопределяет `LevelNode` для сборки уровней бандлов
* `BundleNode` - достраивает дерево для сборки бандла
* `MergedBundleNode` - отвечает за сборку merged бандла (называемого так же common)
* `BorschikNode` - прогоняет файлы через утилиту `borschik`, которая разворачивает инклюды
* `Arch` - строит исходное дерево, состоящее главным образом из узлов `LibraryNode`, `BundlesLevelNode`, `LevelNode` -
Чтобы сконфигурировать сборку своего проекта, необходимо переопределить поведение тех или иных узлов. Это делается в конфигурационном файле `.bem/make.js` в корне проекта с помощью хелпера `MAKE.decl()`. Первым аргументом ему передается название узла, который будет переопределен. Вторым - объект с переопределяющими методами.
Чтобы сконфигурировать сборку своего проекта, необходимо переопределить поведение тех или иных узлов. Это делается в
конфигурационном файле `.bem/make.js` в корне проекта с помощью хелпера `MAKE.decl()`. Первым аргументом ему передается
название узла, который будет переопределен. Вторым - объект с переопределяющими методами. -
```js MAKE.decl('BundleNode', {
```js
MAKE.decl('BundleNode', { -
}); ```
});
``` -
У узлов есть несколько основных методов, отвечающих за процесс сборки: * `isValid()` - проверяет, есть ли необходимость в запуске сборки данного узла. Если артефакты сборки узла уже были получены ранее и узлы, от которых зависит данный, не пересобирались в текущей сборке - то будет считаться, что узел не нужно пересобирать. Иными словами, если после первой сборки вы поменяли один файл, то при последующей сборке будут пересобраны только зависящие от этого файла узлы. Для остальных isValid вернет true и они не будут пересобираться. * `make()` - осуществляет непосредственно сборку узла. * `run()` - точка входа в узел. В реализации по умолчанию выполняет метод `isValid()` и в случае если он возвращает `false`, запускает `make()`. * `clean()` - удаляет артефакты сборки данного узла.
У узлов есть несколько основных методов, отвечающих за процесс сборки:
* `isValid()` - проверяет, есть ли необходимость в запуске сборки данного узла. Если артефакты сборки узла уже были получены ранее и узлы, от которых зависит данный, не пересобирались в текущей сборке - то будет считаться, что узел не нужно пересобирать. Иными словами, если после первой сборки вы поменяли один файл, то при последующей сборке будут пересобраны только зависящие от этого файла узлы. Для остальных isValid вернет true и они не будут пересобираться.
* `make()` - осуществляет непосредственно сборку узла.
* `run()` - точка входа в узел. В реализации по умолчанию выполняет метод `isValid()` и в случае если он возвращает `false`, запускает `make()`.
* `clean()` - удаляет артефакты сборки данного узла. -
##### Примеры конфигурационных файлов для типовых задач
##### Примеры конфигурационных файлов для типовых задач
-
###### Сборка статического html, css, js, bemhtml шаблонов из bemjson для уровня страниц pages. Подключаются уровень переопределения блоков blocks, а так же blocks-common и blocks-desktop из bem-bl
###### Сборка статического html, css, js, bemhtml шаблонов из bemjson для уровня страниц pages. Подключаются уровень переопределения блоков blocks, а так же blocks-common и blocks-desktop из bem-bl
-
`pages/.bem/level.js` ```js var extend = require('bem/lib/util').extend;
`pages/.bem/level.js`
```js
var extend = require('bem/lib/util').extend; -
exports.getTechs = function() {
exports.getTechs = function() {