Многие
В этом руководстве объясняется, как создать собственный препроцессор CSS, который компилирует синтаксис Sass и дополняет его дополнительными функциями. Он идеально подходит для тех, у кого есть особые требования к CSS и кто немного знаком с Node.js.
Быстрый старт
Пример проекта PostCSS можно клонировать с GitHub. Для этого требуется Node.js, поэтому запустите, npm installчтобы получить все зависимости.
src/scss/main.scssСкомпилируйте исходный код демонстрации, build/css/main.cssиспользуя:
npm run css: dev
Автоматическая компиляция всякий раз, когда файлы изменяются, используя:
npm run css: watch
Затем выйдите из просмотра, нажав Ctrl| Cmd+ Cв терминале.
Оба варианта также создают исходную карту по адресу build/css/main.css.map, которая ссылается на исходные файлы в инструментах разработчика.
Минимизированный CSS производственного уровня без исходной карты можно скомпилировать, используя:
npm run css: build
Обратитесь к README.mdфайлу для получения дополнительной информации.
Стоит ли заменять Sass на PostCSS?
В компиляторе Sass нет ничего плохого, но учтите следующие факторы.
Зависимости модуля
Последнюю версию Dart Sass можно установить глобально с помощью npmменеджера пакетов Node.js:
npm install -g sass
Скомпилируйте.scssкод Sass с помощью:
sass [input.scss] [output.css]
Исходные карты генерируются автоматически (—
Последняя версия Sass требует менее 5 МБ места для установки.
PostCSS должен требовать меньше ресурсов и базового
Однако, если вы уже используете PostCSS для Autoprefixer или других целей, Sass может не понадобиться.
Скорость обработки
Медленный компилятор Sass на основе Ruby давно ушел в прошлое, и в последней версии используется скомпилированная среда выполнения Dart. Это быстро.
PostCSS — это чистый JavaScript, и хотя тесты будут различаться, он может быть в три раза медленнее при компиляции одного и того же исходного кода.
Однако эта разница в скорости будет менее заметна, если вы уже используете PostCSS после Sass. Двухэтапный процесс может быть медленнее, чем использование только PostCSS, поскольку большая часть его работы связана с токенизацией свойств CSS.
Настройка
Язык Sass включает в себя большой набор функций, включая переменные, вложенность, партиалы, примеси и многое другое. Есть минусы:
Вы не можете легко добавлять новые функции.
Возможно, вы хотели бы преобразовать цвета HSLA в RGB. Можно написать пользовательскую функцию, но другие требования будут невыполнимы — например, встраивание SVG в качестве фонового изображения.
Вы не можете легко ограничить набор функций.
Возможно, вы бы предпочли, чтобы ваша команда не использовала вложенность или файлы @extend. Правила линтинга помогут, но они не помешают Sass компилировать допустимые.scssфайлы.
PostCSS значительно более настраиваемый.
Сам по себе PostCSS ничего не делает. Для работы функций обработки требуется один или несколько из множества доступных подключаемых модулей. Большинство из них выполняют одну задачу, поэтому, если вам не нужна вложенность, не добавляйте плагин для вложенности. При необходимости вы можете написать свои собственные плагины в стандартном модуле JavaScript, которые могут использовать возможности Node.js.
Установить PostCSS
PostCSS можно использовать с webpack, Parcel, Gulp.js и другими инструментами сборки, но в этом руководстве показано, как запустить его из командной строки.
При необходимости инициализируйте новый проект Node.js с помощью npm init. Настройте PostCSS, установив следующие модули для базового.scssсинтаксического анализа с плагинами для партиалов, переменных, примесей, вложенности и автоматического префикса:
npm install —
Как и в примере проекта, PostCSS и его плагины устанавливаются локально. Это практичный вариант, если ваши проекты могут иметь разные требования к компиляции.
Примечание. PostCSS можно запустить только из файла JavaScript, но
Конфигурация автопрефиксера
Autoprefixer использует список браузеров, чтобы определить, какие префиксы поставщиков требуются в соответствии с вашим списком поддерживаемых браузеров. Проще всего определить этот список как «browserslist»массив в формате package.json. В следующем примере добавляются префиксы поставщиков, где доля любого браузера на рынке составляет не менее 2%:
«browserslist»: [
«> 2%»
],
Ваша первая сборка
Обычно у вас будет один корневой.scssфайл Sass, который импортирует все необходимые частичные/компонентные файлы. Например:
// root Sass file
// src/scss/main.scss
@import '_variables’;
@import '_reset’;
@import 'components/_card’;
// etc.
Компиляцию можно запустить, запустив npx postcss, а затем входной файл, —outputфайл и любые необходимые параметры. Например:
npx postcss. /src/scss/main.scss \
—output. /build/css/main.css \
—env development \
—map \
—verbose \
—parser
—use
Эта команда:
анализирует. /src/scss/main.scss
выходы на. /build/css/main.css
устанавливает NODE_ENVпеременную среды вdevelopment
выводит внешний исходный файл карты
устанавливает подробный вывод и сообщения об ошибках
устанавливает
использует плагины
При желании вы можете добавить —watchавтокомпиляцию при.scssизменении файлов.
Создайте файл конфигурации PostCSS
Командная строка быстро становится громоздкой для длинных списков плагинов. Вы можете определить его как npmскрипт, но файл конфигурации PostCSS — это более простой вариант, предлагающий дополнительные возможности.
Файлы конфигурации PostCSS — это файлы модулей JavaScript с именами postcss.config.jsи обычно хранящиеся в корневом каталоге проекта (или в любом другом каталоге, из которого вы запускаете PostCSS). Модуль должен exportвыполнять одну функцию:
// postcss.config.js
module.exports = cfg => {
//... configuration...
};
Ему передается cfgобъект со свойствами, заданными postcssкомандой. Например:
{
cwd: '/home/name/
env: 'development’,
options: {
map: undefined,
parser: undefined,
syntax: undefined,
stringifier: undefined
},
file: {
dirname: '/home/name/
basename: 'main.scss’,
extname: '.scss’
}
}
Вы можете изучить эти свойства и отреагировать соответствующим образом — например, определить, работаете ли вы в developmentрежиме и обрабатываете ли.scssвходной файл:
// postcss.config.js
module.exports = cfg => {
const
dev = cfg.env === 'development’,
scss = cfg.file.extname === '.scss’;
//... configuration...
};
Функция должна возвращать объект с именами свойств, соответствующими параметрам
// postcss.config.js
module.exports = cfg => {
const
dev = cfg.env === 'development’,
scss = cfg.file.extname === '.scss’;
return {
map: dev? { inline: false }: false,
parser: scss? '
plugins: [
require ('
require ('
require ('autoprefixer’) ()
]
};
};
Теперь PostCSS можно запустить с помощью более короткой команды:
npx postcss. /src/scss/main.scss \
—output. /build/css/main.css \
—env development \
—verbose
Вот некоторые вещи, на которые следует обратить внимание:
—verboseявляется необязательным: он не установлен в postcss.config.js.
Синтаксический анализ Sass применяется только в том случае, если входными данными является.scssфайл. В противном случае по умолчанию используется стандартный CSS.
Исходная карта выводится, только если —envустановлено значение development.
—watchеще можно добавить для автокомпиляции.
Если вы предпочитаете postcss.config.jsнаходиться в другом каталоге, на него можно сослаться с помощью —configопции, например —config /mycfg/. В примере проекта указанная выше конфигурация находится в config/postcss.config.js. На него ссылается run npm run css: basic, который вызывает:
npx postcss src/scss/main.scss \
—output build/css/main.css \
—env development \
—verbose \
—config. /config/
Добавление дополнительных плагинов
В следующих разделах приведены примеры подключаемых модулей PostCSS, которые либо анализируют дополнительный.scssсинтаксис, либо обеспечивают обработку, выходящую за рамки компилятора Sass.
Используйте токены дизайна
Маркеры дизайна — это независимый от технологии способ хранения переменных, таких как общекорпоративные шрифты, цвета, интервалы и т. д. Вы можете хранить пары «
{
«
«
«lineheight»: 1.5,
«
«
«
«
}
Затем ссылайтесь на них в любом
Маркеры дизайна не поддерживаются Sass напрямую, но объект JavaScript со variablesсвойством, содержащим пары
// PostCSS configuration
module.exports = cfg => {
// import tokens as Sass variables
const variables = require ('. /tokens.json’) ; // NEW
const
dev = cfg.env === 'development’,
scss = cfg.file.extname === '.scss’;
return {
map: dev? { inline: false }: false,
parser: scss? '
plugins: [
require ('
require ('
require ('autoprefixer’) ()
]
};
};
Плагин преобразует все значения в глобальный Sass $variables, который можно использовать в любом партиале. Можно задать резервное значение, чтобы переменная была доступна, даже если она отсутствует в файлах tokens.json. Например:
// set default background color to #FFF
// if no «
$
После этого на переменные токена можно ссылаться в любом.scssфайле. Например:
body {
color: $
}
В примере проекта определен token.jsonфайл, который загружается и используется при запуске npm run css: dev.
Добавить поддержку карт Sass
Карты Sass — это объекты типа «
В следующем примере точки останова медиазапроса определяются как карта Sass с respondмиксином для извлечения именованного значения:
// media query breakpoints
$breakpoint: (
'small’: 36rem,
'medium’: 50rem,
'large’: 64rem
) ;
/*
responsive breakpoint mixin:
@include respond ('medium’) {... }
*/
@mixin respond ($bp) {
@media (
@content;
}
}
Затем в том же селекторе можно определить свойства по умолчанию и модификации медиазапроса. Например:
main {
width: 100%;
@include respond ('medium’) {
width: 40em;
}
}
Что компилируется в CSS:
main {
width: 100%;
}
@media (
main {
width: 40em
}
}
Плагин
npm install —
И обновите postcss.config.jsфайл конфигурации:
// PostCSS configuration
module.exports = cfg => {
// import tokens as Sass variables
const variables = require ('. /tokens.json’) ;
const
dev = cfg.env === 'development’,
scss = cfg.file.extname === '.scss’;
return {
map: dev? { inline: false }: false,
parser: scss? '
plugins: [
require ('
require ('
require ('
require ('autoprefixer’) ()
]
};
};
Добавить оптимизацию медиазапросов
Поскольку мы добавили
@media (
main {
width: 40em;
}
}
@media (
#menu {
width: 30em;
}
}
могут быть объединены, чтобы стать:
@media (
main {
width: 40em;
}
#menu {
width: 30em;
}
}
Это невозможно в Sass, но может быть достигнуто с помощью плагина
npm install —
Затем добавьте его в postcss.config.js:
// PostCSS configuration
module.exports = cfg => {
// import tokens as Sass variables
const variables = require ('. /tokens.json’) ;
const
dev = cfg.env === 'development’,
scss = cfg.file.extname === '.scss’;
return {
map: dev? { inline: false }: false,
parser: scss? '
plugins: [
require ('
require ('
require ('
require ('
require ('autoprefixer’) ()
]
};
};
Добавить обработку активов
Управление активами недоступно в Sass, но
#mybackground {
width: width ('back.png’) ;
height: height ('back.png’) ;
}
компилируется в:
#mybackground {
width: 600px;
height: 400px;
}
Установите плагин с помощью:
npm install —
Затем добавьте его в postcss.config.js. В этом случае плагин получает указание найти изображения в src/images/каталоге:
// PostCSS configuration
module.exports = cfg => {
// import tokens as Sass variables
const variables = require ('. /tokens.json’) ;
const
dev = cfg.env === 'development’,
scss = cfg.file.extname === '.scss’;
return {
map: dev? { inline: false }: false,
parser: scss? '
plugins: [
require ('
require ('
require ('
require ('
require ('
loadPaths: ['src/images/']
}),
require ('autoprefixer’) ()
]
};
};
Добавить минификацию
cssnano устанавливает стандарт минимизации CSS. Минификация может занять больше времени, чем другие плагины, поэтому ее можно применять только в продакшене.
Установите cssnano с помощью:
npm install —
Затем добавьте его в postcss.config.js. В этом случае минимизация происходит только тогда, когда NODE_ENVустановлено
// PostCSS configuration
module.exports = cfg => {
// import tokens as Sass variables
const variables = require ('. /tokens.json’) ;
const
dev = cfg.env === 'development’,
scss = cfg.file.extname === '.scss’;
return {
map: dev? { inline: false }: false,
parser: scss? '
plugins: [
require ('
require ('
require ('
require ('
require ('
loadPaths: ['src/images/']
}),
require ('autoprefixer’) (),
dev? null: require ('cssnano’) () // NEW
]
};
};
Установка запускает минимизацию (и удаляет исходную карту) —env: prodution
npx postcss. /src/scss/main.scss \
—output. /build/css/main.css \
—env prodution \
—verbose
В примере проекта рабочий CSS можно скомпилировать, запустив npm run css: build.
Перейти к PostCSS?
PostCSS — это мощный и настраиваемый инструмент, который может компилировать.scssфайлы и улучшать (или ограничивать) стандартный язык Sass. Если вы уже используете PostCSS для Autoprefixer, вы можете полностью удалить компилятор Sass, сохранив при этом любимый синтаксис.