Статьи

Использование PostCSS вместе с Sass, Stylus или LESS

Если вы заинтересованы в использовании PostCSS, но вам все еще нравится ваш любимый препроцессор, не волнуйтесь. Вам не нужно выбирать между ними — вы можете использовать их рядом друг с другом.

Есть несколько плагинов PostCSS, которые очень хорошо дополняют препроцессоры, поскольку они добавляют функциональность в ваш рабочий процесс, которая в противном случае была бы невозможна или, по крайней мере, более трудна, используя только препроцессор.

Мы коснемся некоторых из этих бесплатных плагинов, а затем пройдемся по руководствам по установке, чтобы показать вам, как использовать PostCSS рядом с Sass, Stylus или LESS.

Прежде чем мы перейдем к тому, как вы можете использовать препроцессоры вместе с PostCSS, мы немного поговорим о том, почему вы этого хотите. Краткий ответ: получить доступ к плагинам PostCSS, функциональность которых дополняет препроцессоры. Чтобы показать вам, почему они того стоят, мы рассмотрим несколько плагинов, которые действительно хорошо работают с препроцессорами.

Примечание : может быть возможно достичь аналогичных конечных результатов, используя миксины и функции в обычном коде препроцессора, но в каждом из приведенных ниже примеров процесс обрабатывается автоматически. Вы пишете свой CSS в обычном режиме, а плагины позаботятся обо всем за вас, без вызова функций, без добавления миксов или с передачей аргументов.

Было написано много микропинов препроцессора, предназначенных для вставки префиксов поставщиков. Например, вы могли использовать @include box-sizing(border-box); из библиотеки Compass для вывода правил box-sizing блоков с префиксом поставщика.

Проблема в том, чтобы полагаться на миксины для префиксов поставщиков:

  1. Прежде всего, вы должны знать, что для префиксов свойств необходимо использовать префиксы.
  2. Вы должны знать название соответствующего миксина и как его использовать.
  3. Вы должны следить за тем, когда префиксы вендоров больше не требуются для каждого свойства (я знаю, что для длинных …

Autoprefixer устраняет эти проблемы, обрабатывая процесс префикса поставщика автоматически. Autoprefixer сканирует ваш CSS, сравнивает его с данными CanIUse.com, а затем добавляет необходимые префиксы.

Узнайте больше об Autoprefixer по адресу: https://github.com/postcss/autoprefixer

Генерация таблиц стилей по умолчанию и RTL (справа налево) из одного источника — это тоже то, что было сделано с препроцессорами, однако обычно требуется использование нескольких миксинов и / или интерполяция переменных в вашем коде в нескольких местах. Например, вместо того, чтобы писать margin-left: 1rem; вам может понадобиться написать margin-#{dir}: 1rem; или @include margin-left( 1rem ); ,

Однако с плагином rtlcss от Mohammad Younes вам не нужно использовать миксины или переменную интерполяцию, вы просто пишете свою таблицу стилей, как обычно, и плагин найдет все экземпляры, «правый» или «левый», и поменяет их местами. Таким образом, margin-left: 1rem; автоматически становится margin-right: 1rem; без необходимости писать какой-либо специальный код, чтобы это произошло.

Узнайте больше о rtlcss по адресу: https://github.com/MohammadYounes/rtlcss

С плагином postcss-colorblind от Brian Holt вы можете автоматически создавать различные версии таблицы стилей, которые дают вам из первых рук представление о том, как ваш дизайн будет выглядеть для человека с дальтонизмом. Он может имитировать восемь различных типов дальтонизма, помогая вам действительно понять, насколько доступны ваши цветовые схемы.

Это пример функциональности, которую вы действительно должны найти в PostCSS, поскольку препроцессорам было бы очень трудно это сделать.

Узнайте больше о postcss-colorblind по адресу: https://github.com/btholt/postcss-colorblind

Плагин postcss-svgo от Ben Briggs поможет вам оптимизировать встроенный SVG-код без помощи рук. Например это:

1
background: url(‘data:image/svg+xml;utf-8,<?xml version=»1.0″ encoding=»utf-8″?><!DOCTYPE svg PUBLIC «-//W3C//DTD SVG 1.1//EN» «https://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd»><svg version=»1.1″ id=»Layer_1″ xmlns=»http://www.w3.org/2000/svg» xmlns:xlink=»http://www.w3.org/1999/xlink» xml:space=»preserve»><circle cx=»50″ cy=»50″ r=»40″ fill=»yellow» /></svg>’);

Можно свести к этому меньше половины кода:

1
background: url(‘data:image/svg+xml;utf-8,<svg xmlns=»http://www.w3.org/2000/svg»><circle cx=»50″ cy=»50″ r=»40″ fill=»#ff0″/></svg>’);

Узнайте больше о postcss-svgo по адресу: https://github.com/ben-eb/postcss-svgo

В то время как препроцессоры могут удалять пробелы и комментарии, пакет cssnano от Ben Briggs может выполнять все виды оптимизации, помимо этих двух этапов. Мы подробно рассмотрим cssnano в учебнике по минимизации и оптимизации .

Узнайте больше о cssnano по адресу: https://github.com/ben-eb/cssnano

Плагин postcss-font-magician от Jonathan Neal позволяет добавлять собственные шрифты так же просто, как и обычные шрифты. Вам не нужно использовать какие-либо миксины, просто добавьте правило font-family как обычно:

1
2
3
body {
   font-family: «Alice»;
}

… и плагин будет обрабатывать полную генерацию @font-face для вас:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
@font-face {
   font-family: «Alice»;
   font-style: normal;
   font-weight: 400;
   src: local(«Alice»), local(«Alice-Regular»),
        url(«http://fonts.gstatic.com/s/alice/v7/sZyKh5NKrCk1xkCk_F1S8A.eot?#») format(«eot»),
        url(«http://fonts.gstatic.com/s/alice/v7/l5RFQT5MQiajQkFxjDLySg.woff2») format(«woff2»),
        url(«http://fonts.gstatic.com/s/alice/v7/_H4kMcdhHr0B8RDaQcqpTA.woff») format(«woff»),
        url(«http://fonts.gstatic.com/s/alice/v7/acf9XsUhgp1k2j79ATk2cw.ttf») format(«truetype»)
}
 
body {
  font-family: «Alice»;
}

Узнайте больше о postcss-font-magician по адресу: https://github.com/jonathantneal/postcss-font-magician

Ниже приведены шесть руководств по настройке: руководство по Gulp и Grunt для каждого основного препроцессора. Нет необходимости читать все шесть, вы можете просто перейти к руководству по вашему предпочтительному препроцессору и инструменту сборки. Если вы не уверены, использовать ли Gulp или Grunt, Gulp определенно является более простым выбором для этого урока.

Для того чтобы вы ни следовали, вам нужно начать с пустого проекта Gulp или Grunt. О том, как настроить проекты Gulp или Grunt для PostCSS, вы можете прочитать в предыдущих уроках

соответственно.

Если вы не хотите вручную настраивать свой проект с нуля, вы можете загрузить исходные файлы, прикрепленные к этому учебному пособию , и извлечь предоставленный стартовый проект Gulp или Grunt в пустую папку проекта. Затем с помощью терминала или командной строки, указывающей на папку, выполните команду npm install .

После того, как вы настроите пустой проект для одного из разделов ниже, вам также необходимо установить два плагина PostCSS: Autoprefixer и cssnano. Вы можете сделать это, выполнив команду:

1
npm install autoprefixer cssnano —save-dev

Мы будем использовать эти два плагина для проверки того, что PostCSS и ваш препроцессор работают вместе, как и ожидалось.

Первое правило использования препроцессора с PostCSS состоит в том, что вы всегда должны сначала запускать указанный препроцессор. Это потому, что вы не хотите иметь какой-либо специфический для препроцессора синтаксис в своем коде, который может задушить плагин PostCSS, и вы также не хотите, чтобы PostCSS вносил изменения в ваш код, которые могут помешать запуску препроцессора, как ожидается.

Для каждого из препроцессоров, которые мы настроили, мы запустим autoprefixer и cssnano после того, как препроцессор завершит компиляцию. В каждом случае нам нужно будет добавить тестовый код для работы этих двух плагинов.

Чтобы сохранить повторение одного и того же кода в каждом разделе ниже, когда вы увидите инструкцию, предлагающую добавить тестовый код PostCSS, добавьте его в исходный файл препроцессора, над которым вы работаете:

01
02
03
04
05
06
07
08
09
10
11
12
.css_nano, .css_nano + p, [class*=»css_nano»], .css_nano {
    /* cssnano will remove this comment */
    display: flex;
    font-weight: normal;
    margin-top: 1rem;
    margin-bottom: 2rem;
    margin-left: 1.5rem;
    margin-right: 2.5rem;
    font-weight: normal;
    padding: 1.75rem;
    width: calc(50rem — (2 * 1.75rem));
}

В случае успеха ваш скомпилированный код в каждом случае будет выглядеть так:

1
.css_nano,.css_nano+p,[class*=css_nano]{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:1rem 2.5rem 2rem 1.5rem;font-weight:400;padding:1.75rem;width:46.5rem}

Примечание : использование flexbox было автоматически префиксировано, и cssnano выполнил несколько оптимизаций кода. Мы используем тот же код для тестирования cssnano, как и в предыдущем учебном пособии по минификации и оптимизации , поэтому, пожалуйста, обратитесь к разделу «cssnano» для получения подробной информации о выполняемой оптимизации.

Поскольку вы уже работаете с Node.js для запуска Gulp или Grunt и PostCSS, самый простой способ использовать Sass вместе с ними — это сделать это через LibSass. Это также значительно быстрее, чем Ruby Sass. Мы будем развертывать LibSass через модули gulp -sass или grunt-contrib-sass .

Установите модуль npm install gulp-sass --save-dev в свой проект с помощью npm install gulp-sass --save-dev .

Теперь вы можете обновить ваш Gulpfile следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
var gulp = require(‘gulp’);
var postcss = require(‘gulp-postcss’);
var sass = require(‘gulp-sass’);
 
var autoprefixer = require(‘autoprefixer’);
var cssnano = require(‘cssnano’);
 
gulp.task(‘css’, function () {
    var processors = [
        autoprefixer,
        cssnano
    ];
    return gulp.src(‘./src/*.scss’)
        .pipe(sass().on(‘error’, sass.logError))
        .pipe(postcss(processors))
        .pipe(gulp.dest(‘./dest’));
});

Давайте разберемся с тем, что мы изменили по умолчанию для Gulpfile:

  • Добавлены переменные для загрузки autoprefixer cssnano , autoprefixer и cssnano
  • Добавлены переменные autoprefixer и cssnano в массив processors
  • Отредактировано расширение файла в исходном файле, который мы компилируем в «.scss» вместо «.css»
  • Добавлена ​​новая строка pipe() , .pipe(sass()... для обработки Sass, обязательно разместите ее перед строкой, обрабатывающей PostCSS

Теперь мы можем запустить несколько тестов, чтобы убедиться, что и Sass, и PostCSS компилируются, как и ожидалось.

Переименуйте существующий файл «src / style.css» в «src / style.scss» и добавьте в него следующий тестовый код:

1
2
3
4
5
6
7
$font-stack: Helvetica, sans-serif;
$primary-color: #333;
 
body {
  font: 100% $font-stack;
  color: $primary-color;
}

Запустите gulp css и вы должны увидеть новый файл «style.css», который появится в вашей папке «dest» с содержимым:

1
2
3
body {
 font: 100% Helvetica, sans-serif;
 color: #333;

Теперь добавьте тестовый код PostCSS, предоставленный ранее в этом руководстве, в свой файл «style.scss».

Запустите команду gulp css и вы должны увидеть правильный код в вашем файле «dest / style.css»:

1
body{font:100% Helvetica,sans-serif;color:#333}.css_nano,.css_nano+p,[class*=css_nano]{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:1rem 2.5rem 2rem 1.5rem;font-weight:400;padding:1.75rem;width:46.5rem}

В свой новый проект Grunt установите модуль grunt-contrib-sass с помощью npm install grunt-contrib-sass .

Затем добавьте для grunt.loadNpmTasks() функцию grunt.loadNpmTasks() в соответствии с существующей для PostCSS:

1
2
grunt.loadNpmTasks(‘grunt-postcss’);
 grunt.loadNpmTasks(‘grunt-contrib-sass’);

Теперь вам нужно настроить новое задание для обработки Sass. После этой строки:

1
grunt.initConfig({

… но перед существующей задачей postcss добавьте этот код:

1
2
3
4
5
6
7
sass: {
     dist: {
       files: {
         ‘src/style.css’: ‘src/style.scss’
       }
     }
   },

Теперь мы зарегистрируем задачу, которая запустит Sass, а затем PostCSS. После только что вставленной функции grunt.loadNpmTasks() добавьте:

1
grunt.registerTask(‘css’, [‘sass’, ‘postcss’]);

Чтобы проверить настройки, переименуйте существующий файл «src / style.css» в «style.scss». Добавьте этот код Sass к нему:

1
2
3
4
5
6
7
$font-stack: Helvetica, sans-serif;
$primary-color: #333;
 
body {
  font: 100% $font-stack;
  color: $primary-color;
}

Запустите команду grunt css и вы увидите новый файл, созданный в папке «dest» с именем «style.css» и содержащий этот код:

1
2
3
body {
 font: 100% Helvetica, sans-serif;
 color: #333;

Теперь мы запустим наши плагины Autoprefixer и cssnano. Обновите массив processors вашего Gruntfile следующим образом:

1
2
3
4
processors: [
         require(‘autoprefixer’)(),
         require(‘cssnano’)()
       ]

Добавьте тестовый код PostCSS в ваш файл «style.scss», снова запустите команду grunt css и вы обнаружите, что ваш перекомпилированный файл «dest / style.css» теперь содержит правильный автоматически префиксный и оптимизированный код.

Stylus и PostCSS особенно хорошо работают вместе благодаря созданию пакета PostStylus Шоном Кингом, который сочетает в себе обработку как Stylus, так и PostCSS. Если вы разработчик Stylus, вы можете просто добавить PostStylus в процесс компиляции и сразу получить доступ к использованию плагинов PostCSS в качестве части вашего рабочего процесса.

PostStylus: https://github.com/seaneking/poststylus

Если вы используете готовый Gulpfile из начального проекта, вы заметите, что он использует плагин gulp-postcss. На самом деле это только там, поскольку это необходимо для процессов установки Sass и LESS, но для Stylus нам это не понадобится, потому что вместо этого мы используем PostStylus в качестве нашего компилятора.

Вы можете удалить его из вашего проекта с помощью npm uninstall gulp-postcss --save-dev и удалить эту строку из вашего Gulpfile:

1
var postcss = require(‘gulp-postcss’);

Теперь мы можем установить два плагина, которые нам нужны для компиляции Stylus и PostCSS, выполнив команду:

1
npm install gulp-stylus poststylus —save-dev

Обновите свой Gulpfile, чтобы он стал:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
var gulp = require(‘gulp’);
var stylus = require(‘gulp-stylus’);
var poststylus = require(‘poststylus’);
 
var autoprefixer = require(‘autoprefixer’);
var cssnano = require(‘cssnano’);
 
gulp.task(‘css’, function () {
    var processors = [
        autoprefixer,
        cssnano
    ];
    return gulp.src(‘./src/*.styl’)
        .pipe(stylus({
            use: [
                poststylus(processors)
            ]
        }))
        .pipe(gulp.dest(‘./dest’));
});

Вот что мы сделали выше:

  • Добавлены переменные для загрузки poststylus gulp-stylus , poststylus , autoprefixer и cssnano
  • Добавлены переменные autoprefixer и cssnano в массив processors
  • Отредактировано расширение файла в исходном файле, который мы компилируем в «.styl» вместо «.css»
  • Удалена .pipe() которая читает .pipe(postcss(processors))
  • Заменил его на .pipe(stylus({... , чтобы установить модули gulp-stylus и poststylus для обработки нашей компиляции

Теперь мы готовы проверить компиляцию. В папке «src» переименуйте «style.css» в «style.styl» и добавьте этот тестовый код стилуса:

1
2
3
4
5
6
$font-stack = Helvetica, sans-serif
$primary-color = #333
 
body
  font: 100% $font-stack
  color: $primary-color

Запустите команду gulp css и вы увидите файл «style.css», который появится в вашей папке «dest» с этим содержимым:

1
2
3
4
body {
  font: 100% Helvetica, sans-serif;
  color: #333;
}

Добавьте тестовый код PostCSS, предоставленный ранее, в файл «style.styl», чтобы в вставленном коде были только отступы табуляции, а не пробелы.

Перекомпилируйте и убедитесь, что у вас есть соответствующий вывод в файле «dest / style.css».

1
body{font:100% Helvetica,sans-serif;color:#333}.css_nano,.css_nano+p,[class*=css_nano]{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:1rem 2.5rem 2rem 1.5rem;font-weight:400;padding:1.75rem;width:46.5rem}

Как и в случае проекта Gulp для Stylus, компилятор PostCSS по умолчанию, входящий в состав начального проекта, не требуется, поскольку он предназначен исключительно для процессов установки Sass и LESS. Вы можете удалить его из своего проекта с помощью npm uninstall grunt-postcss --save-dev .

Теперь мы можем установить grunt-contrib-stylus и poststylus с помощью команды:

1
npm install grunt-contrib-stylus poststylus —save-dev

Мы больше не будем использовать grunt-postcss, поэтому найдите эту строку:

1
grunt.loadNpmTasks(‘grunt-postcss’);

И заменить его на:

1
grunt.loadNpmTasks(‘grunt-contrib-stylus’);

Учитывая, что мы не используем grunt-postcss, это означает, что нам больше не понадобится задача postcss мы определили внутри grunt.initConfig({...}); , Удалите этот конфиг задачи и замените его новым заданием stylus :

1
2
3
4
5
6
7
8
9
stylus: {
     compile: {
       options: {
       },
       files: {
         ‘dest/style.css’: ‘src/style.styl’
       }
     }
   }

Теперь мы готовы проверить компиляцию. В папке «src» переименуйте «style.css» в «style.styl» и добавьте этот тестовый код стилуса:

1
2
3
4
5
6
$font-stack = Helvetica, sans-serif
$primary-color = #333
 
body
  font: 100% $font-stack
  color: $primary-color

Запустите команду grunt stylus и вы увидите файл «style.css», который появится в папке «dest» с этим содержимым:

1
body{font:100% Helvetica,sans-serif;color:#333}

Чтобы добавить наши плагины PostCSS в процесс компиляции, нам сначала нужно добавить этот код в самый верх нашего Gruntfile, над module.exports... :

1
2
3
var poststylus = function() {
  return require(‘poststylus’)([‘autoprefixer’, ‘cssnano’])
};

Именно здесь вы будете загружать любые плагины PostCSS, которые вы хотите использовать, а не массив массивов processors к которому вы привыкли из других наших руководств.

Затем найдите объект options в задании стилуса и обновите его следующим образом:

1
2
3
options: {
         use: [poststylus]
       },

Это говорит grunt-contrib-stylus использовать poststylus во время компиляции и его плагины вместе с ним.

Добавьте «тестовый код PostCSS» в ваш файл «src / style.styl», запустите grunt stylus , и вы увидите следующее содержимое, записанное в ваш файл «dest / style.css»:

1
body{font:100% Helvetica,sans-serif;color:#333}.css_nano,.css_nano+p,[class*=css_nano]{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:1rem 2.5rem 2rem 1.5rem;font-weight:400;padding:1.75rem;width:46.5rem}

Установите модуль npm install gulp-less --save-dev less в ваш проект с помощью npm install gulp-less --save-dev .

Теперь вы можете обновить ваш Gulpfile следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
var gulp = require(‘gulp’);
var postcss = require(‘gulp-postcss’);
var less = require(‘gulp-less’);
 
var autoprefixer = require(‘autoprefixer’);
var cssnano = require(‘cssnano’);
 
gulp.task(‘css’, function () {
    var processors = [
        autoprefixer,
        cssnano
    ];
    return gulp.src(‘./src/*.less’)
        .pipe(less())
        .pipe(postcss(processors))
        .pipe(gulp.dest(‘./dest’));
});

Давайте разберемся с тем, что мы изменили по умолчанию для Gulpfile:

  • Добавлены переменные для загрузки autoprefixer gulp-less , autoprefixer и cssnano
  • Добавлены переменные autoprefixer и cssnano в массив processors
  • Отредактировал расширение файла в исходном файле, который мы компилируем в «.less» вместо «.css»
  • Добавлен .pipe(less()) для обработки LESS, обязательно поместите его перед строкой, которая обрабатывает PostCSS

Теперь мы можем запустить несколько тестов, чтобы убедиться, что LESS и PostCSS компилируются, как и ожидалось.

Переименуйте существующий файл «src / style.css» в «src / style.less» и добавьте в него следующий тестовый код:

1
2
3
4
5
6
7
@font-stack: Helvetica, sans-serif;
@primary-color: #333;
 
body {
  font: 100% @font-stack;
  color: @primary-color;
}

Запустите gulp css и вы должны увидеть новый файл «style.css», который появится в вашей папке «dest» с содержимым:

1
body{font:100% Helvetica,sans-serif;color:#333}

Теперь к вашему файлу «style.less» добавьте тестовый код PostCSS, предоставленный ранее в этом руководстве.

Запустите команду gulp css и вы должны увидеть правильный код, который теперь появляется в вашем файле «dest / style.css».

1
body{font:100% Helvetica,sans-serif;color:#333}.css_nano,.css_nano+p,[class*=css_nano]{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:1rem 2.5rem 2rem 1.5rem;font-weight:400;padding:1.75rem;width:46.5rem}

В свой новый проект Grunt установите модуль grunt-contrib-less с помощью npm install grunt-contrib-less , затем добавьте для grunt.loadNpmTasks() функцию grunt.loadNpmTasks() в соответствии с существующей для PostCSS:

1
2
grunt.loadNpmTasks(‘grunt-postcss’);
 grunt.loadNpmTasks(‘grunt-contrib-less’);

Теперь вам нужно настроить новое задание для обработки LESS. После этой строки:

1
grunt.initConfig({

… но перед существующей задачей postcss добавьте этот код:

1
2
3
4
5
6
7
less: {
     production: {
       files: {
         ‘src/style.css’: ‘src/style.less’
       }
     }
   },

Теперь мы зарегистрируем задачу, чтобы запустить LESS, а затем PostCSS. После только что вставленной функции grunt.loadNpmTasks() добавьте:

1
grunt.registerTask(‘css’, [‘less’, ‘postcss’]);

Чтобы проверить настройки, переименуйте файл «src / style.css» в «style.less». Добавьте этот код LESS к нему:

1
2
3
4
5
6
7
@font-stack: Helvetica, sans-serif;
@primary-color: #333;
 
body {
  font: 100% @font-stack;
  color: @primary-color;
}

Запустите команду grunt css и вы увидите новый файл, созданный в вашей папке «dest» с именем «style.css» и содержащий этот код:

1
2
3
4
body {
  font: 100% Helvetica, sans-serif;
  color: #333333;
}

Теперь мы добавим наши плагины PostCSS в поток компиляции. Обновите массив processors вашего Gruntfile следующим образом:

1
2
3
4
processors: [
         require(‘autoprefixer’)(),
         require(‘cssnano’)()
       ]

Добавьте тестовый код PostCSS в ваш файл «style.less», снова запустите команду grunt css и вы обнаружите, что ваш перекомпилированный файл «dest / style.css» теперь содержит правильный автоматически префиксный и оптимизированный код:

1
body{font:100% Helvetica,sans-serif;color:#333}.css_nano,.css_nano+p,[class*=css_nano]{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:1rem 2.5rem 2rem 1.5rem;font-weight:400;padding:1.75rem;width:46.5rem}

Далее мы собираемся проверить кое-что, что вы могли бы почти рассмотреть в качестве другого типа предварительной обработки — использование PostCSS для автоматически сгенерированных CSS-классов, соответствующих BEM / SUIT. Этот процесс значительно облегчает отслеживание разработки BEM / SUIT, не говоря уже о его эффективности.

Увидимся в следующем уроке!