# PostCSS for Webpack [![Build Status][ci-img]][ci] [PostCSS] loader for [webpack] to postprocesses your CSS with [PostCSS plugins]. Sponsored by Evil Martians [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