postcss-loader
Установка
npm i -D postcss-loader
Использование
Configuration
postcss.config.js
module.exports = {
parser: 'sugarss',
plugins: {
'postcss-import': {},
'postcss-preset-env': {},
'cssnano': {}
}
} Вы можете узнать больше о распространённых конфигурациях PostCSS здесь.
Config Cascade
Вы можете использовать разные postcss.config.js файлы в разных директориях. Поиск конфигурации начинается с path.dirname(file) и идёт вверх по дереву файлов, пока не будет найден файл конфигурации.
|– components | |– component | | |– index.js | | |– index.png | | |– style.css (1) | | |– postcss.config.js (1) | |– component | | |– index.js | | |– image.png | | |– style.css (2) | |– postcss.config.js (1 && 2 (recommended)) |– webpack.config.js | |– package.json
После настройки вашей postcss.config.js, добавьте postcss-loader в ваш webpack.config.js. Вы можете использовать его автономно или в сочетании с css-loader (рекомендуется). Используйте его после css-loader и style-loader, но перед другими препроцессорными загрузчиками, например, sass|less|stylus-loader, если вы их используете.
webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: [ 'style-loader', 'postcss-loader' ]
}
]
}
} ⚠️ Когда
postcss-loaderиспользуется автономно (безcss-loader), не используйте@importв вашем CSS, так как это может привести к увеличению объёма бандлов.
webpack.config.js (рекомендуется)
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: [
'style-loader',
{ loader: 'css-loader', options: { importLoaders: 1 } },
'postcss-loader'
]
}
]
}
} Параметры
| Имя | Тип | По умолчанию | Описание |
|---|---|---|---|
|
| {Boolean} | undefined | Включить поддержку синтаксического анализатора PostCSS в CSS-in-JS
|
|
| {String\|Object} | undefined | Установить синтаксический анализатор PostCSS |
|
| {String\|Object} | undefined | Установить синтаксис PostCSS |
|
| {String\|Object} | undefined | Установить генератор строк PostCSS |
|
| {Object} | undefined | Указать путь к конфигурации postcss.config.js и ctx
|
|
| {Array\|Function} | [] | Установить плагины PostCSS |
|
| {String\|Boolean} | false | Включить карты исходных данных |
Exec
Если вы используете JS-стили без синтаксического анализатора postcss-js, добавьте параметр exec.
webpack.config.js
{
test: /\.style.js$/,
use: [
'style-loader',
{ loader: 'css-loader', options: { importLoaders: 1 } },
{ loader: 'postcss-loader', options: { parser: 'sugarss', exec: true } }
]
}
Config
| Имя | Тип | По умолчанию | Описание |
|---|---|---|---|
|
| {String} | undefined | Директория конфигурации PostCSS |
|
| {Object} | undefined | Контекст конфигурации PostCSS |
Path
Вы можете вручную указать путь для поиска конфигурации (postcss.config.js) с помощью параметра config.path. Это необходимо, если вы храните вашу конфигурацию в отдельной, например, ./config || ./.config папке.
⚠️ В противном случае устанавливать этот параметр не нужно и не рекомендуется
⚠️ Обратите внимание, что вы не можете использовать имя файла, отличное от поддерживаемых форматов конфигурации (например,
.postcssrc.js,postcss.config.js), этот параметр позволяет только вручную указать директорию, с которой должен начинаться поиск конфигурации.
webpack.config.js
{
loader: 'postcss-loader',
options: {
config: {
path: 'path/to/.config/' ✅
path: 'path/to/.config/css.config.js' ❌
}
}
}
Context (ctx)
| Имя | Тип | По умолчанию | Описание |
|---|---|---|---|
|
| {String} | 'development' | process.env.NODE_ENV |
|
| {Object} | loader.resourcePath |
extname , dirname , basename
|
|
| {Object} | {} | Параметры |
postcss-loader предоставляет контекст ctx файлу конфигурации, делая вашу postcss.config.js динамической, поэтому вы можете использовать его для выполнения настоящей магии ✨
postcss.config.js
module.exports = ({ file, options, env }) => ({
parser: file.extname === '.sss' ? 'sugarss' : false,
plugins: {
'postcss-import': { root: file.dirname },
'postcss-preset-env': options['postcss-preset-env'] ? options['postcss-preset-env'] : false,
'cssnano': env === 'production' ? options.cssnano : false
}
}) webpack.config.js
{
loader: 'postcss-loader',
options: {
config: {
ctx: {
'postcss-preset-env': {...options},
cssnano: {...options},
}
}
}
}
Plugins
webpack.config.js
{
loader: 'postcss-loader',
options: {
ident: 'postcss',
plugins: (loader) => [
require('postcss-import')({ root: loader.resourcePath }),
require('postcss-preset-env')(),
require('cssnano')()
]
}
} ⚠️ webpack требует идентификатор (
ident) вoptionsпри использовании{Function}/require(Сложные параметры). Имяidentможет быть произвольным, главное, чтобы оно было уникальным. Рекомендуется назвать его (ident: 'postcss')
Syntaxes
| Имя | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
|
| {String\|Function} | undefined | Пользовательский парсер PostCSS |
|
| {String\|Function} | undefined | Пользовательский синтаксис PostCSS |
|
| {String\|Function} | undefined | Пользовательский строковый генератор PostCSS |
Parser
webpack.config.js
{
test: /\.sss$/,
use: [
...,
{ loader: 'postcss-loader', options: { parser: 'sugarss' } }
]
}
Syntax
webpack.config.js
{
test: /\.css$/,
use: [
...,
{ loader: 'postcss-loader', options: { syntax: 'sugarss' } }
]
}
Stringifier
webpack.config.js
{
test: /\.css$/,
use: [
...,
{ loader: 'postcss-loader', options: { stringifier: 'midas' } }
]
}
SourceMap
Включает поддержку карт исходного кода, postcss-loader будет использовать предыдущую карту исходного кода, предоставленную другими загрузчиками, и обновлять ее соответствующим образом. Если перед postcss-loader не применялся никакой другой загрузчик, загрузчик сгенерирует карту исходного кода для вас.
webpack.config.js
{
test: /\.css/,
use: [
{ loader: 'style-loader', options: { sourceMap: true } },
{ loader: 'css-loader', options: { sourceMap: true } },
{ loader: 'postcss-loader', options: { sourceMap: true } },
{ loader: 'sass-loader', options: { sourceMap: true } }
]
}
'inline'
Вы можете установить опцию sourceMap: 'inline' для вставки карты исходного кода в CSS непосредственно в виде аннотационного комментария.
webpack.config.js
{
loader: 'postcss-loader',
options: {
sourceMap: 'inline'
}
} .class { color: red; }
/*# sourceMappingURL=data:application/json;base64, ... */ Примеры
Stylelint
webpack.config.js
{
test: /\.css$/,
use: [
'style-loader',
'css-loader',
{
loader: 'postcss-loader',
options: {
ident: 'postcss',
plugins: [
require('postcss-import')(),
require('stylelint')(),
...,
]
}
}
]
}
Autoprefixing
webpack.config.js
{
test: /\.css$/,
use: [
'style-loader',
'css-loader',
{
loader: 'postcss-loader',
options: {
ident: 'postcss',
plugins: [
require('autoprefixer')({...options}),
...,
]
}
}
]
} :warning:
postcss-preset-envвключает в себяautoprefixer, поэтому добавление его отдельно не является необходимым, если вы уже используете пресет.
CSS Modules
Этот загрузчик не может быть использован с CSS Модулями «из коробки» из-за того, как css-loader обрабатывает импорты файлов. Чтобы они работали должным образом, добавьте опцию importLoaders загрузчика css-loader.
webpack.config.js
{
test: /\.css$/,
use: [
'style-loader',
{ loader: 'css-loader', options: { modules: true, importLoaders: 1 } },
'postcss-loader'
]
} или используйте postcss-modules вместо css-loader.
CSS-in-JS
Если вы хотите обработать стили, написанные на JavaScript, используйте парсер postcss-js.
webpack.config.js
{
test: /\.style.js$/,
use: [
'style-loader',
{ loader: 'css-loader', options: { importLoaders: 2 } },
{ loader: 'postcss-loader', options: { parser: 'postcss-js' } },
'babel-loader'
]
} В результате вы сможете писать стили следующим образом
import colors from './styles/colors'
export default {
'.menu': {
color: colors.main,
height: 25,
'&_link': {
color: 'white'
}
}
} :warning: Если вы используете Babel, вам необходимо выполнить следующие действия для корректной настройки:
- Добавьте babel-plugin-add-module-exports в вашу конфигурацию
- В каждом модуле стилей должен быть только один экспорт default
Извлечение CSS
webpack.config.js
const devMode = process.env.NODE_ENV !== 'production'
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: [
devMode ? 'style-loader' : MiniCssExtractPlugin.loader,
'css-loader',
'postcss-loader'
]
}
]
},
plugins: [
new MiniCssExtractPlugin({
filename: devMode ? '[name].css' : '[name].[hash].css'
})
]
}
© JS Foundation and other contributors
Licensed under the Creative Commons Attribution License 4.0.
https://v4.webpack.js.org/loaders/postcss-loader