# PostCSS for Webpack [![Build Status][ci-img]][ci]
[PostCSS] loader for [webpack] to postprocesses your CSS with [PostCSS plugins].
[PostCSS plugins]: https://github.com/postcss/postcss#plugins
[PostCSS]: https://github.com/postcss/postcss
[webpack]: http://webpack.github.io/
[ci-img]: https://travis-ci.org/postcss/postcss-loader.svg
[ci]: https://travis-ci.org/postcss/postcss-loader
## Install
```sh
npm install postcss-loader --save-dev
```
## Usage
Create `postcss.config.js`:
```js
module.exports = {
plugins: [
require('postcss-smart-import')({ /* ...options */ }),
require('precss')({ /* ...options */ }),
require('autoprefixer')({ /* ...options */ })
]
}
```
You could put different configs in different directories. For example,
global config in `project/postcss.config.js` and override its plugins
in `project/src/legacy/postcss.config.js`.
You can read more about common PostCSS config in
[postcss-load-config](https://github.com/michael-ciniawsky/postcss-load-config).
Add PostCSS Loader to `webpack.config.js`. Put it after `css-loader`
and `style-loader`. But before `sass-loader`, if you use it.
### Webpack 2
```js
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: [
'style-loader',
'css-loader?importLoaders=1',
'postcss-loader'
]
}
]
}
}
```
### Webpack 1
```js
module.exports = {
module: {
loaders: [
{
test: /\.css$/,
loaders: [
'style-loader',
'css-loader?importLoaders=1',
'postcss-loader'
]
}
]
}
}
```
## Options
### Plugins
We recommend to use `postcss.config.js`, but also you can specify plugins
directly in webpack config.
#### Webpack 2
```js
module.exports = {
module: {
rules: [
{
test: /\.css/,
use: [
…
{
loader: 'postcss-loader',
options: {
plugins: function () {
return [
require('precss'),
require('autoprefixer')
];
}
}
}
]
}
]
}
}
```
#### Webpack 1
```js
module.exports = {
module: {
loaders: [
{
test: /\.css$/,
loaders: [
…
'postcss-loader'
]
}
]
},
postcss: () => {
return [
require('precss'),
require('autoprefixer')
];
}
}
```
### Syntaxes
PostCSS can transforms styles in any syntax, not only in CSS.
There are 3 parameters to control syntax:
* `syntax` accepts module name with `parse` and `stringify` function.
* `parser` accepts module name with input parser function.
* `stringifier` accepts module name with output stringifier function.
```js
module.exports = {
module: {
loaders: [
{
test: /\.sss/,
loaders: [
'style-loader',
'css-loader?importLoaders=1',
'postcss-loader?parser=sugarss'
]
}
]
}
}
```
### SourceMaps
Loader will use source map settings from previous loader.
You can set this `sourceMap` parameter to `inline` value to put source maps
into CSS annotation comment:
```js
module.exports = {
module: {
loaders: [
{
test: '\/.css',
loaders: [
'style-loader',
'css-loader?importLoaders=1',
'postcss-loader?sourceMap=inline'
]
}
]
}
}
```
## Examples
### CSS Modules
This 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
```js
…
{
test: /\.css$/,
loaders: [
'style-loader',
'css-loader?modules&importLoaders=1',
'postcss-loader'
]
}
…
```
or use [postcss-modules] plugin instead of `css-loader`.
[`importLoaders`]: https://github.com/webpack/css-loader#importing-and-chained-loaders
[postcss-modules]: https://github.com/outpunk/postcss-modules
[cannot be used]: https://github.com/webpack/css-loader/issues/137
[CSS Modules]: https://github.com/webpack/css-loader#css-modules
### JS Styles
If you want to process styles written in JavaScript
you can use the [postcss-js] parser.
```js
…
{
test: /\.style.js$/,
loaders: [
'style-loader',
'css-loader?modules&importLoaders=1',
'postcss-loader?parser=postcss-js',
'babel'
]
}
…
```
As result you will be able to write styles as:
```js
import colors from './config/colors'
export default {
'.menu': {
color: colors.main,
height: 25,
'&_link': {
color: 'white'
}
}
}
```
> If you are using Babel >= v6 you need to do the following in order for the setup to work
> 1. Add [babel-plugin-add-module-exports] to your configuration
> 2. You need to have only one **default** export per style module
If you use JS styles without `postcss-js` parser, you can add `exec` parameter:
```js
…
{
test: /\.style.xyz$/,
loaders: [
'style-loader',
'css-loader?modules&importLoaders=1',
'postcss-loader?parser=custom-parser&exec'
]
}
…
```
[postcss-js]: https://github.com/postcss/postcss-js
[babel-plugin-add-module-exports]: https://github.com/59naga/babel-plugin-add-module-exports
### Dynamic Config
PostCSS loader sends a loaded instance to PostCSS common config.
You can use it to do some real magic:
```js
module.exports = function (ctx) {
if (check(ctx.webpack.resourcePath)) {
return { plugins: plugins1 };
} else {
return { plugins: plugins2 };
}
}
```
### Webpack Events
Webpack provides webpack plugin developers a convenient way
to hook into the build pipeline. The postcss-loader makes use
of this event system to allow building integrated postcss-webpack tools.
See the [example] implementation.
Event `postcss-loader-before-processing` is fired before processing and allows
to add or remove postcss plugins.
[example]: https://github.com/postcss/postcss-loader/blob/master/test/webpack-plugins/rewrite.js