
Security News
Meet Socket at Black Hat Europe and BSides London 2025
Socket is heading to London! Stop by our booth or schedule a meeting to see what we've been working on.
postcss-loader
Advanced tools
npm i -D postcss-loader
Configpostcss.config.js
module.exports = {
parser: 'sugarss',
plugins: {
'postcss-import': {},
'cssnext': {},
'autoprefixer': {},
'cssnano': {}
}
}
You can read more about common PostCSS Config here.
Config CascadeYou can use different postcss.config.js files in different directories.
Config lookup starts from path.dirname(file) and walks the file tree upwards until a config file is found.
|– 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
After setting up your postcss.config.js, add postcss-loader to your webpack.config.js. You can use it standalone or in conjunction with css-loader (recommended). Use it after css-loader and style-loader, but before other preprocessor loaders like e.g sass|less|stylus-loader, if you use any.
webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: [ 'style-loader', 'postcss-loader' ]
}
]
}
}
⚠️ When
postcss-loaderis used standalone (withoutcss-loader) don't use@importin your CSS, since this can lead to quite bloated bundles
webpack.config.js (recommended)
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: [
'style-loader',
{ loader: 'css-loader', options: { importLoaders: 1 } },
'postcss-loader'
]
}
]
}
}
| Name | Default | Description |
|---|---|---|
exec | undefined | Enable PostCSS Parser support in CSS-in-JS |
parser | undefined | Set PostCSS Parser |
syntax | undefined | Set PostCSS Syntax |
stringifier | undefined | Set PostCSS Stringifier |
config | undefined | Set postcss.config.js config path && ctx |
plugins | [] | Set PostCSS Plugins |
sourceMap | false | Enable Source Maps |
ExecIf you use JS styles without the postcss-js parser, add the exec option.
{
test: /\.style.js$/,
use: [
'style-loader',
{ loader: 'css-loader', options: { importLoaders: 1 } },
{ loader: 'postcss-loader', options: { parser: 'sugarss', exec: true } }
]
}
ConfigPathYou can manually specify the path to search for your config (postcss.config.js) with the config.path option. This is needed if you store your config in a separate e.g ./config || ./.config folder.
⚠️ Otherwise it is unnecessary to set this option and is not recommended
webpack.config.js
{
loader: 'postcss-loader',
options: {
config: {
path: 'path/to/postcss.config.js'
}
}
}
Context (ctx)| Name | Type | Default | Description |
|---|---|---|---|
env | {String} | 'development' | process.env.NODE_ENV |
file | {Object} | loader.resourcePath | extname, dirname, basename |
options | {Object} | {} | Options |
postcss-loader exposes context ctx to the config file, making your postcss.config.js dynamic, so can use it to do some real magic ✨
postcss.config.js
module.exports = ({ file, options, env }) => ({
parser: file.extname === '.sss' ? 'sugarss' : false,
plugins: {
'postcss-import': { root: file.dirname },
'postcss-cssnext': options.cssnext ? options.cssnext : false,
'autoprefixer': env == 'production' ? options.autoprefixer : false,
'cssnano': env === 'production' ? options.cssnano : false
}
})
webpack.config.js
{
loader: 'postcss-loader'
options: {
config: {
ctx: {
cssnext: {...options},
cssnano: {...options},
autoprefixer: {...options}
}
}
}
}
Pluginswebpack.config.js
{
loader: 'postcss-loader',
options: {
plugins: (loader) => [
require('postcss-import')({ root: loader.resourcePath }),
require('cssnext')(),
require('autoprefixer')(),
require('cssnano')()
]
}
}
Syntaxes| Name | Type | Default | Description |
|---|---|---|---|
syntax | {String|Function} | undefined | Custom PostCSS Syntax |
parser | {String|Function} | undefined | Custom PostCSS Parser |
stringifier | {String|Function} | undefined | Custom PostCSS Stringifier |
Parserwebpack.config.js
{
test: /\.sss$/,
use: [
...,
{ loader: 'postcss-loader', options: { parser: 'sugarss' } }
]
}
Syntaxwebpack.config.js
{
test: /\.css$/,
use: [
...,
{ loader: 'postcss-loader', options: { syntax: 'sugarss' } }
]
}
Stringifierwebpack.config.js
{
test: /\.css$/,
use: [
...,
{ loader: 'postcss-loader', options: { stringifier: 'midas' } }
]
}
SourceMapEnables source map support, postcss-loader will use the previous source map given by other loaders and update it accordingly, if no previous loader is applied before postcss-loader, the loader will generate a source map for you.
:warning: If a previous loader like e.g
sass-loaderis applied and it'ssourceMapoption is set, but thesourceMapoption inpostcss-loaderis omitted, previous source maps will be discarded bypostcss-loaderenterily.
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'You can set the sourceMap: 'inline' option to inline the source map
within the CSS directly as an annotation comment.
webpack.config.js
{
loader: 'postcss-loader',
options: {
sourceMap: 'inline'
}
}
.class { color: red; }
/*# sourceMappingURL=data:application/json;base64, ... */
Stylelintwebpack.config.js
{
test: /\.css$/,
use: [
'style-loader',
'css-loader',
{
loader: 'postcss-loader',
options: {
plugins: [
require('postcss-import')(),
require('stylelint')(),
...,
]
}
}
]
}
CSS ModulesThis loader cannot be used with CSS Modules out of the box due
to the way css-loader processes file imports. To make them work properly,
either add the css-loader’s importLoaders option.
webpack.config.js
{
test: /\.css$/,
use: [
'style-loader',
{ loader: 'css-loader' options: { modules: true, importLoaders: 1 } },
'postcss-loader'
]
}
or use postcss-modules instead of css-loader.
CSS-in-JSIf you want to process styles written in JavaScript, use the postcss-js parser.
{
test: /\.style.js$/,
use: [
'style-loader',
{ loader: 'css-loader', options: { importLoaders: 2 } },
{ loader: 'postcss-loader', options: { parser: 'postcss-js' } },
'babel-loader'
]
}
As result you will be able to write styles in the following way
import colors from './styles/colors'
export default {
'.menu': {
color: colors.main,
height: 25,
'&_link': {
color: 'white'
}
}
}
:warning: If you are using Babel you need to do the following in order for the setup to work
- Add babel-plugin-add-module-exports to your configuration
- You need to have only one default export per style module
webpack.config.js
const ExtractTextPlugin = require('extract-text-webpack-plugin')
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: ExtractTextPlugin.extract({
fallback: 'style-loader',
use: [
{ loader: 'css-loader', options: { importLoaders: 1 } },
'postcss-loader'
]
})
}
]
},
plugins: [
new ExtractTextPlugin('[name].css')
]
}
Michael Ciniawsky |
Alexander Krasnoyarov |
2.0.4 (2017-05-10)
postcss.config.js not resolved correctly (options.config) (faaeee4)<a name="2.0.3"></a>
The sass-loader compiles Sass/SCSS files to CSS. It requires Node.js-style .sass/.scss files. Unlike postcss-loader, it's specifically designed for Sass pre-processing.
The less-loader processes .less files and compiles them to CSS. It's similar to postcss-loader in that it transforms styles, but it's tailored for the Less pre-processor.
This package is a webpack loader that compiles Stylus files to CSS. It's a pre-processor loader like sass-loader and less-loader, but for Stylus syntax.
FAQs
PostCSS loader for webpack
The npm package postcss-loader receives a total of 13,006,234 weekly downloads. As such, postcss-loader popularity was classified as popular.
We found that postcss-loader demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 4 open source maintainers collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Socket is heading to London! Stop by our booth or schedule a meeting to see what we've been working on.

Security News
OWASP’s 2025 Top 10 introduces Software Supply Chain Failures as a new category, reflecting rising concern over dependency and build system risks.

Research
/Security News
Socket researchers discovered nine malicious NuGet packages that use time-delayed payloads to crash applications and corrupt industrial control systems.