bem/bem-tools
-
При создании уровня командой `bem create level` файл `.bem/level.js` создаётся пустым, что означает, что уровень — «стандартный». Поведение стандартного уровня описано в классе `Level` в файле (lib/level.js)[https://github.com/bem/bem-tools/blob/master/lib/level.js].
При создании уровня командой `bem create level` файл `.bem/level.js` создаётся пустым, что означает, что уровень —
«стандартный». Поведение стандартного уровня описано в классе `Level` в файле
(lib/level.js)[https://github.com/bem/bem-tools/blob/master/lib/level.js]. -
Перекрыть поведение уроня просто. Файл `.bem/level.js` (как и практически любой файл конфигурации) является CommonJS модулем. `bem-tools` при обнаружении такого файла создаёт класс-наследник стандартного класса `Level`, используя экспорт этого модуля в качестве расширения класса (внутри используется модуль [inherit](https://github.com/dfilatov/node-inherit)).
Перекрыть поведение уроня просто. Файл `.bem/level.js` (как и практически любой файл конфигурации) является CommonJS
модулем. `bem-tools` при обнаружении такого файла создаёт класс-наследник стандартного класса `Level`, используя экспорт
этого модуля в качестве расширения класса (внутри используется модуль [inherit](https://github.com/dfilatov/node-inherit)). -
В примере ниже перекрывается метод `getTechs()`.
В примере ниже перекрывается метод `getTechs()`.
-
```js exports.getTechs = function() {
```js
exports.getTechs = function() { -
return { 'bemjson.js': '' 'css': 'path/to/my/css-tech-module.js' }
return {
'bemjson.js': ''
'css': 'path/to/my/css-tech-module.js'
} -
##### Наследование уровней
##### Наследование уровней
-
Чтобы не копировать код из одного конфига уровней в другой, вы можете выносить общие части в самостоятельные модули и наследоваться от них. Таким образом можно выстаивать целые иерархии уровней.
Чтобы не копировать код из одного конфига уровней в другой, вы можете выносить общие части в самостоятельные модули
и наследоваться от них. Таким образом можно выстаивать целые иерархии уровней. -
Для задания базового уровня нужно экспортировать из модуля свойство `baseLevelPath`, например
Для задания базового уровня нужно экспортировать из модуля свойство `baseLevelPath`, например
-
```js exports.baseLevelPath = require.resolve('path/to/base/level.js'); ```
```js
exports.baseLevelPath = require.resolve('path/to/base/level.js');
``` -
Уровни-наследники также можно создавать командой
Уровни-наследники также можно создавать командой
-
bem create level <your-level-name> --level path/to/base/level.js
bem create level
<your-level-name>
--level path/to/base/level.js -
##### Правила маппинга БЭМ-сущностей в файловую систему
##### Правила маппинга БЭМ-сущностей в файловую систему
-
По умолчанию на уровне переопределения используется следующая схема маппинга (на примере технологии `css`):
По умолчанию на уровне переопределения используется следующая схема маппинга (на примере технологии `css`):
-
``` level/ block/ __elem/ _mod/ block__elem_mod_val.css block__elem.css _mod/ block_mod_val.css block.css ```
```
level/
block/
__elem/
_mod/
block__elem_mod_val.css
block__elem.css
_mod/
block_mod_val.css
block.css
``` -
Если вас не устраивает эта схема, вы можете задать свою. Для этого нужно перекрыть соответствующие `match*()` и `get*()` методы в файле `.bem/level.js`.
Если вас не устраивает эта схема, вы можете задать свою. Для этого нужно перекрыть соответствующие `match*()` и `get*()`
методы в файле `.bem/level.js`. -
##### Технологии, определённые для уровня
##### Технологии, определённые для уровня
-
Для уровня переопределения можно задекларировать список используемых технологий. Для этого нужно экспортировать функцию `getTechs()`, которая должна вернуть объект, в ключах которого лежат имена технологий, а в значениях:
Для уровня переопределения можно задекларировать список используемых технологий. Для этого нужно экспортировать
функцию `getTechs()`, которая должна вернуть объект, в ключах которого лежат имена технологий, а в значениях: -
- абсолютный путь до технологии — будет использоваться модуль, находящийся по этому пути; - короткое имя технологии — будет использоваться реализация технологии с указанным именем из `bem-tools`; - пустая строка — будет использоваться реализация технологии по умолчанию.
- абсолютный путь до технологии — будет использоваться модуль, находящийся по этому пути;
- короткое имя технологии — будет использоваться реализация технологии с указанным именем из `bem-tools`;
- пустая строка — будет использоваться реализация технологии по умолчанию. -
По умолчанию на уровне переопределения явно не определена ни одна из технологий. Если попытаться внутри таких уровней использовать техологии по короткому имени, например `css`, `js` и другие, то будут использованы модули технологии из состава `bem-tools`, если они существуют. Полный список таких технологий смотрите в [lib/techs](https://github.com/bem/bem-tools/tree/master/lib/techs).
По умолчанию на уровне переопределения явно не определена ни одна из технологий. Если попытаться внутри таких уровней
использовать техологии по короткому имени, например `css`, `js` и другие, то будут использованы модули технологии
из состава `bem-tools`, если они существуют. Полный список таких технологий смотрите в [lib/techs](https://github.com/bem/bem-tools/tree/master/lib/techs). -
Если попытаться использовать технологии, которые явно не задекларированы, и которых при этом не существуют в `bem-tools` — будет использоваться реализация технологии по умолчанию (см. [lib/tech.js](https://github.com/bem/bem-tools/blob/master/lib/tech.js)).
Если попытаться использовать технологии, которые явно не задекларированы, и которых при этом не существуют
в `bem-tools` — будет использоваться реализация технологии по умолчанию
(см. [lib/tech.js](https://github.com/bem/bem-tools/blob/master/lib/tech.js)).