bem/bem-tools
-
589d823bdf8a900da296c0d355902129ff3f6bf3
589d823bdf8a900da296c0d355902129ff3f6bf3
- правила маппинга БЭМ-сущностей в файловую систему
- технологии, определённые для уровня
- мета-информация для системы сборки -
c72defcab3c960524574ddbcbfe400339d235022
c72defcab3c960524574ddbcbfe400339d235022
При создании уровня командой `bem create level` файл `.bem/level.js` создаётся пустым, что означает, что уровень —
«стандартный». Поведение стандартного уровня описано в классе `Level` в файле
(lib/level.js)[https://github.com/bem/bem-tools/blob/master/lib/level.js]. -
ddba0defb44beb19e73c91acd87800bc43ea8dde
ddba0defb44beb19e73c91acd87800bc43ea8dde
Перекрыть поведение уроня просто. Файл `.bem/level.js` (как и практически любой файл конфигурации) является CommonJS
модулем. `bem-tools` при обнаружении такого файла создаёт класс-наследник стандартного класса `Level`, используя экспорт
этого модуля в качестве расширения класса (внутри используется модуль [inherit](https://github.com/dfilatov/node-inherit)). -
1169535954577e1af5d762d82d8a5d9066761e43
1169535954577e1af5d762d82d8a5d9066761e43
В примере ниже перекрывается метод `getTechs()`. -
2ca80939cb99210de90e61282896097a3ba47876
2ca80939cb99210de90e61282896097a3ba47876
```js
exports.getTechs = function() { -
5ee5c50a2bb9bf21073fdd58a75f90237a0dfd0a
5ee5c50a2bb9bf21073fdd58a75f90237a0dfd0a
return {
'bemjson.js': ''
'css': 'path/to/my/css-tech-module.js'
} -
34b377a0ecb9a1336d7c5265900f8e4119a374d5
34b377a0ecb9a1336d7c5265900f8e4119a374d5
##### Наследование уровней -
85c3b2c56293d9eac3b426d406e12ca7442357bb
85c3b2c56293d9eac3b426d406e12ca7442357bb
Чтобы не копировать код из одного конфига уровней в другой, вы можете выносить общие части в самостоятельные модули
и наследоваться от них. Таким образом можно выстаивать целые иерархии уровней. -
4825160099cae9d6fc56d466f587fc464cd3e581
4825160099cae9d6fc56d466f587fc464cd3e581
Для задания базового уровня нужно экспортировать из модуля свойство `baseLevelPath`, например -
6414786a18f7934709067c27a222bb6a2809556f
6414786a18f7934709067c27a222bb6a2809556f
```js
exports.baseLevelPath = require.resolve('path/to/base/level.js');
``` -
3ad292ad5424d8424ad5762c3551c54f50c4dceb
3ad292ad5424d8424ad5762c3551c54f50c4dceb
Уровни-наследники также можно создавать командой -
47009c906666bd91cf691df7590ea6e90699beb7
47009c906666bd91cf691df7590ea6e90699beb7
bem create level<your-level-name>
--level path/to/base/level.js -
84d0fe6d5a086ea1cea85db058e2dd29d2cdcbbc
84d0fe6d5a086ea1cea85db058e2dd29d2cdcbbc
##### Правила маппинга БЭМ-сущностей в файловую систему -
c26fa4f9777805fa1ca2afa07cab95fa227706b4
c26fa4f9777805fa1ca2afa07cab95fa227706b4
По умолчанию на уровне переопределения используется следующая схема маппинга (на примере технологии `css`): -
8768363732bc932f754093d72e03453bf8bd04d8
8768363732bc932f754093d72e03453bf8bd04d8
```
level/
block/
__elem/
_mod/
block__elem_mod_val.css
block__elem.css
_mod/
block_mod_val.css
block.css
``` -
728fa2df1f09190cab3188cd1b0adb67dfeeed83
728fa2df1f09190cab3188cd1b0adb67dfeeed83
Если вас не устраивает эта схема, вы можете задать свою. Для этого нужно перекрыть соответствующие `match*()` и `get*()`
методы в файле `.bem/level.js`. -
86df126e767a0605f4aa1b79f75e40950affbdf5
86df126e767a0605f4aa1b79f75e40950affbdf5
##### Технологии, определённые для уровня -
6a8baa30c502098b0f02dd5020c78c2d6207ad72
6a8baa30c502098b0f02dd5020c78c2d6207ad72
Для уровня переопределения можно задекларировать список используемых технологий. Для этого нужно экспортировать
функцию `getTechs()`, которая должна вернуть объект, в ключах которого лежат имена технологий, а в значениях: -
b17a17ceb7b9e0878e74f60f187fe2fb9093fd60
b17a17ceb7b9e0878e74f60f187fe2fb9093fd60
- абсолютный путь до технологии — будет использоваться модуль, находящийся по этому пути;
- короткое имя технологии — будет использоваться реализация технологии с указанным именем из `bem-tools`;
- пустая строка — будет использоваться реализация технологии по умолчанию. -
0a48b4d00482565556f0c6908cf436785cea3b8a
0a48b4d00482565556f0c6908cf436785cea3b8a
По умолчанию на уровне переопределения явно не определена ни одна из технологий. Если попытаться внутри таких уровней
использовать техологии по короткому имени, например `css`, `js` и другие, то будут использованы модули технологии
из состава `bem-tools`, если они существуют. Полный список таких технологий смотрите в [lib/techs](https://github.com/bem/bem-tools/tree/master/lib/techs).