В статье Добавляем стили в БЭМ проект мы научили БЭМ проект понимать CSS. Но мы живём уже в 21 веке и использовать голый CSS уже как-то стремновато. Есть же SASS и Stylus. Поэтому давайте-ка задействуем всю мощь этих технологий и попробуем подключить их к нашему БЭМ проекту.
Stylus
Ставим пакет enb-технологий для для сборки CSS и Stylus файлов enb-stylus
$ npm install --save-dev enb-stylus
Как оказалось enb-stylus поддерживает так-же сборку и обычных CSS файлов, что позволяет избавиться от использования enb-css. Ну и конечно-же Stylus сам по себе намного приятнее в работе.
Добавляем в .bem/make.js
var techs = {
...
stylus: require('enb-stylus/techs/stylus') // вот тут
},
...
module.exports = function(config) {
config.nodes('*.bundles/*', function(nodeConfig) {
nodeConfig.addTechs([
...
[techs.stylus], // и тут
...
]);
...
// добавляем цель сборки для стилей
nodeConfig.addTarget('?.css');
});
};
Сборка проекта с этим модулем прошла без проблем, CSS файлы собрались. К сожалению не смог пока проверить работу со Stylus, но обязательно это сделаю когда займусь ближе блоками.
SCSS
Ставим пакет enb-технологий для для сборки SCSS-файлов enb-sass
$ npm install --save-dev enb-sass
Менее популярен, чем enb-stylus, но лично мне как-то ближе к сердцу, но только лишь потому, что опыта работы с SCSS у меня больше.
Добавляем в .bem/make.js
var techs = {
...
sass: require('enb-sass') // вот тут
},
...
module.exports = function(config) {
config.nodes('*.bundles/*', function(nodeConfig) {
nodeConfig.addTechs([
...
[techs.sass], // и тут
...
]);
...
// добавляем цель сборки для стилей
nodeConfig.addTarget('?.css');
});
};
Однако при попытке запуска сборки проекта получаем:
$ ./node_modules/.bin/enb make
(node) v8::ObjectTemplate::Set() with non-primitive values is deprecated
(node) and will stop working in the next major release.
==== JS stack trace =========================================
...
куча ошибок
...
6:06:20.746 - build started
16:06:20.765 - [rebuild] [desktop.bundles/index/index.bemjson.js] file-provider
16:06:20.797 - [rebuild] [desktop.bundles/index/index.levels] levels
16:06:20.798 - [rebuild] [desktop.bundles/index/index.bemdecl.js] bemjson-to-bemdecl
16:06:20.820 - [rebuild] [desktop.bundles/index/index.deps.js] deps
16:06:20.823 - [rebuild] [desktop.bundles/index/index.files] files
16:06:20.823 - [rebuild] [desktop.bundles/index/index.dirs] files
16:06:20.827 - [failed] [desktop.bundles/index/index.css] enb-sass
16:06:20.827 - build failed
TypeError: vow.promise is not a function
Ошибка такая есть и видимо связано в версией nodejs. По крайней мере нашёл описание проблемы тут https://github.com/enb/enb-sass/issues/13.
В общем походу enb-sass идёт лесом. Разбираться с этим геморроем желания особого нет, да и выглядит проект заброшенным.
Итоги и выводы
- В плане поддержки CSS для БЭМ есть пакеты только для поддержки голого CSS и Stylus (по крайней мере я больше ничего не нашёл)
- Пакет enb-sass кривой и заброшенный — использовать не рекомендую
PS
Совсем забыл почему-то про Less. А для него как оказалось есть пакет enb-less. Придётся как-нибудь на досуге попробовать, хотя сам я Less никогда не использовал.
Комментарии