Мы уже упоминали PostCSS много раз на SitePoint, но многие продолжают сбивать с толку. Подводя итог этому в одном предложении:
PostCSS выполняет утомительные задания, поэтому вам не нужно это делать.
Он несколько отличается от препроцессора, такого как Sass, Less и Stylus, который предоставляет альтернативный, более лаконичный язык программирования, который компилируется в CSS. Часть путаницы вызвана:
-
Его имя. PostCSS может выполнять действия с файлами до и / или после того, как препроцессор скомпилировал свой исходный код в настоящий CSS.
-
PostCSS может заменить ваш препроцессор. Есть плагины, которые реализуют такие конструкции, как переменные , вложения , миксины и расширения .
Однако, несмотря на то, что вы можете создать свой собственный препроцессор , нет особых причин делать это, если вы не хотите ограничивать функциональность и увеличивать скорость компиляции. Лично я использую Sass с последующим добавлением приправ PostCSS для улучшения моего CSS.
Как вы используете PostCSS?
PostCSS можно использовать в автономных файлах JavaScript, Gulp, Grunt, Broccoli, Brunch и в широком спектре задач, о которых я никогда не слышал!
Сам по себе PostCSS делает только синтаксический анализ файла CSS на объекты JavaScript и токены. Настоящее волшебство происходит с плагинами, которые проверяют, манипулируют, добавляют или изменяют свойства и значения до того, как будет написан окончательный файл CSS.
Чтобы использовать PostCSS в Gulp, вам нужно настроить проект и установить оба модуля:
npm init npm install --save-dev gulp gulp-postcss
Затем вы можете добавить необходимые плагины, например, autoprefixer и cssnano :
npm install --save-dev autoprefixer cssnano
gulpfile.js
может быть создан. Он определяет задачу, которая загружает исходный код CSS и передает его через PostCSS. Плагины и все необходимые параметры передаются в PostCSS в виде массива. Наконец, CSS выводится в файл назначения:
// Gulp.js configuration var gulp = require('gulp'), postcss = require('gulp-postcss'); // apply PostCSS plugins gulp.task('css', function() { return gulp.src('src/main.css') .pipe(postcss([ require('autoprefixer')({}), require('cssnano') ])) .pipe(gulp.dest('dest/main.css')); });
Задача может быть запущена из консоли с помощью:
gulp css
Все, что нам сейчас нужно, это удобный список плагинов PostCSS…
1. Автопрефиксер
Если вы больше ничего не используете, установите Autoprefixer :
npm install --save-dev autoprefixer
Префиксы, специфичные для браузера, такие как -webkit-
, -moz-
и -ms-
, постепенно -ms-
, так как стандарты становятся лучше поддерживаемыми, и поставщики выбирают альтернативы, такие как -moz-
-ms-
основе флагов. К сожалению, вы не можете избежать префиксов поставщиков, но трудно понять, когда они всегда требуются (например, для выбора пользователя ), иногда требуются (например, для трехмерных преобразований ) или никогда не требуются (например, border-radius ).
Вам больше не нужно беспокоиться о префиксе снова с Autoprefixer. Вам просто нужно определить CSS без префикса, а затем указать, какие браузеры вы хотите поддерживать. Autoprefixer проверит caniuse.com перед добавлением необходимых префиксов — следующий код указывает две последние версии любого основного браузера или любую долю рынка, превышающую 2%:
.pipe(postcss([ require('autoprefixer')({ browsers: ['last 2 versions', '> 2%'] }) ]))
Это превосходный вариант для библиотечных функций препроцессора, которые обычно требуют специального кодирования и применяют префиксы вендоров вне зависимости от этого. Ваш префиксный код будет удален в будущем. PostCSS будет работать по мере развития стандартов браузера.
Autoprefixer настолько полезен и широко распространен, что, возможно, вы уже используете его, даже не подозревая, что это плагин PostCSS.
2. Активы PostCSS
PostCSS Assets предоставляет ряд полезных функций обработки изображений:
npm install --save-dev postcss-assets
Варианты включают в себя:
- Разрешение URL: учитывая имя файла, PostCSS Assets заменяет
resolve(image)
корневым путем или полностью определенным URL. - Обработка измерений: PostCSS Assets заменяет ссылки на
width(image)
,height(image)
илиsize(image)
эквивалентом в пикселях. - Встроенное изображение: PostCSS Assets заменяет
inline(image)
строкой в кодировке Base64. - Очистка кеша: PostCSS Assets может добавить произвольную строку запроса к ссылке на изображение, чтобы убедиться, что загружен самый последний файл.
3. cssnext
cssnext позволяет вам использовать новейший синтаксис CSS сегодня.
npm install --save-dev postcss-cssnext
Плагин имеет длинный список функций, включая поддержку:
- переменные
var
-
#rrggbbaa
colors - Цветовые функции
- фильтры
- откаты
Когда он выполняется, cssnext переводит код в синтаксис, обычно поддерживаемый в современных браузерах.
4. Рюкзак
Rucksack предлагает целый ряд функций, которые, как утверждает разработчик, делают разработку CSS еще более увлекательной!
npm install --save-dev rucksack-css
Варианты включают в себя:
- Адаптивная типография, которая регулирует размеры шрифта и высоту строк с помощью одного
font-size: responsive
объявление. - Количество псевдоселекторов, таких как
li:at-least(4)
которое предназначается для любого списка с четырьмя или более элементами. - Псевдонимы свойств, такие как определение
bg
качествеbackground
который может использоваться в вашем CSS. - Набор предопределенных функций замедления .
5. Stylelint
Stylelint сообщает об ошибках CSS на основе 140 правил, разработанных для выявления распространенных ошибок, реализации соглашений о стилях и применения передовых методов. Существует множество вариантов настройки Stylelint по вашему вкусу — статья Павла Елисеева « Улучшение качества вашего CSS с помощью PostCSS» проведет вас через процесс настройки.
6. CSS MQPacker
MQPacker оптимизирует ваши медиа-запросы в единые правила, когда это возможно:
npm install --save-dev css-mqpacker
Препроцессоры, такие как Sass, позволяют легко использовать медиа-запросы в декларации, например
.widget1 { width: 100%; @media (min-width: 30em) { width: 50%; } @media (min-width: 60em) { width: 25%; } } .widget2 { width: 100px; @media (min-width: 30em) { width: 200px; } }
Это компилируется в:
.widget1 { width: 100%; } @media (min-width: 30em) { .widget1 { width: 50%; } } @media (min-width: 60em) { .widget1 { width: 25%; } } .widget2 { width: 100px; } @media (min-width: 30em) { .widget2 { width: 200px; } }
Чтобы уменьшить размеры файлов и (возможно) улучшить время анализа, MQPacker упаковывает несколько объявлений в одно правило @media
, т.е.
.widget1 { width: 100%; } .widget2 { width: 100px; } @media (min-width: 30em) { .widget1 { width: 50%; } .widget2 { width: 200px; } } @media (min-width: 60em) { .widget1 { width: 25%; } }
Подсказка : убедитесь, что первое объявление медиа-запроса в вашем коде определяет все возможные параметры в том порядке, в котором вы их хотите, даже если нет реальной разницы. Это гарантирует, что MQPacker определит правила в правильном порядке.
MQPacker также предоставляет опции для сортировки медиазапросов и вывода исходных карт.
7. cssnano
cssnano сжимает ваш CSS-файл, чтобы обеспечить минимальную загрузку в вашей производственной среде. Установите его через:
npm install --save-dev cssnano
Плагин работает, удаляя комментарии, пробелы, дублирующие правила, устаревшие префиксы поставщиков и делая другие оптимизации, чтобы сэкономить как минимум 50%. Есть альтернативные варианты, но cssnano — один из лучших. Используй это!
Хочу больше?
Доступный для поиска индекс плагинов PostCSS доступен по адресу postcss.parts, а документация по использованию PostCSS содержит список рекомендуемых параметров. Вы найдете плагины практически для любой задачи CSS, которую только можете себе представить, хотя имейте в виду, что есть некоторые перекрестные переходы и дублирование — например, cssnext также включает в себя Autoprefixer.
Если этого недостаточно, вы можете разработать свои собственные плагины PostCSS на JavaScript. Документация PostCSS объясняет, как написать плагин, и предоставляет ссылку на API .
PostCSS облегчает разработку CSS независимо от того, используете ли вы препроцессор. Время разработки CSS экономит больше, чем перевешивает первоначальные усилия по установке и настройке.