1102 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			1102 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| <div align="center">
 | ||
|   <img 
 | ||
|     width="180" 
 | ||
|     height="180" 
 | ||
|     hspace="10"
 | ||
|     alt="PostCSS Logo"
 | ||
|     src="https://api.postcss.org/logo.svg">
 | ||
|   <a href="https://github.com/webpack/webpack">
 | ||
|     <img 
 | ||
|       width="200" 
 | ||
|       height="200" 
 | ||
|       hspace="10"
 | ||
|       src="https://cdn.rawgit.com/webpack/media/e7485eb2/logo/icon.svg">
 | ||
|   </a>
 | ||
|   <div align="center">
 | ||
|     <a href="https://evilmartians.com/?utm_source=postcss">
 | ||
|       <img 
 | ||
|         src="https://evilmartians.com/badges/sponsored-by-evil-martians.svg"
 | ||
|         alt="Sponsored by Evil Martians" 
 | ||
|         width="236" 
 | ||
|         height="54" 
 | ||
|         vspace="10">
 | ||
|     </a>
 | ||
|   </div>
 | ||
| </div>
 | ||
| 
 | ||
| [![npm][npm]][npm-url]
 | ||
| [![node][node]][node-url]
 | ||
| [![deps][deps]][deps-url]
 | ||
| [![tests][tests]][tests-url]
 | ||
| [![coverage][cover]][cover-url]
 | ||
| [![size][size]][size-url]
 | ||
| 
 | ||
| Webpack chat: [![chat][chat]][chat-url]
 | ||
| 
 | ||
| PostCSS chat: [![chat-postcss][chat-postcss]][chat-postcss-url]
 | ||
| 
 | ||
| # postcss-loader
 | ||
| 
 | ||
| Loader to process CSS with [`PostCSS`](https://github.com/postcss/postcss).
 | ||
| 
 | ||
| ## Getting Started
 | ||
| 
 | ||
| You need webpack v5 to use the latest version. For Webpack v4, you have to install postcss-loader v4.
 | ||
| 
 | ||
| To begin, you'll need to install `postcss-loader` and `postcss`:
 | ||
| 
 | ||
| ```console
 | ||
| npm install --save-dev postcss-loader postcss
 | ||
| ```
 | ||
| 
 | ||
| Then add the plugin to your `webpack` config. For example:
 | ||
| 
 | ||
| > In the following configuration the plugin [`postcss-preset-env`](https://github.com/csstools/postcss-preset-env) is used, which is not installed by default.
 | ||
| 
 | ||
| **file.js**
 | ||
| 
 | ||
| ```js
 | ||
| import css from "file.css";
 | ||
| ```
 | ||
| 
 | ||
| **webpack.config.js**
 | ||
| 
 | ||
| ```js
 | ||
| module.exports = {
 | ||
|   module: {
 | ||
|     rules: [
 | ||
|       {
 | ||
|         test: /\.css$/i,
 | ||
|         use: [
 | ||
|           "style-loader",
 | ||
|           "css-loader",
 | ||
|           {
 | ||
|             loader: "postcss-loader",
 | ||
|             options: {
 | ||
|               postcssOptions: {
 | ||
|                 plugins: [
 | ||
|                   [
 | ||
|                     "postcss-preset-env",
 | ||
|                     {
 | ||
|                       // Options
 | ||
|                     },
 | ||
|                   ],
 | ||
|                 ],
 | ||
|               },
 | ||
|             },
 | ||
|           },
 | ||
|         ],
 | ||
|       },
 | ||
|     ],
 | ||
|   },
 | ||
| };
 | ||
| ```
 | ||
| 
 | ||
| Alternative use with [config files](#config):
 | ||
| 
 | ||
| **postcss.config.js**
 | ||
| 
 | ||
| ```js
 | ||
| module.exports = {
 | ||
|   plugins: [
 | ||
|     [
 | ||
|       "postcss-preset-env",
 | ||
|       {
 | ||
|         // Options
 | ||
|       },
 | ||
|     ],
 | ||
|   ],
 | ||
| };
 | ||
| ```
 | ||
| 
 | ||
| The loader **automatically** searches for configuration files.
 | ||
| 
 | ||
| **webpack.config.js**
 | ||
| 
 | ||
| ```js
 | ||
| module.exports = {
 | ||
|   module: {
 | ||
|     rules: [
 | ||
|       {
 | ||
|         test: /\.css$/i,
 | ||
|         use: ["style-loader", "css-loader", "postcss-loader"],
 | ||
|       },
 | ||
|     ],
 | ||
|   },
 | ||
| };
 | ||
| ```
 | ||
| 
 | ||
| And run `webpack` via your preferred method.
 | ||
| 
 | ||
| ## Options
 | ||
| 
 | ||
| |                Name                 |         Type         |                Default                | Description                                  |
 | ||
| | :---------------------------------: | :------------------: | :-----------------------------------: | :------------------------------------------- |
 | ||
| |        [`execute`](#execute)        |     `{Boolean}`      |              `undefined`              | Enable PostCSS Parser support in `CSS-in-JS` |
 | ||
| | [`postcssOptions`](#postcssOptions) | `{Object\|Function}` | `defaults values for Postcss.process` | Set `PostCSS` options and plugins            |
 | ||
| |      [`sourceMap`](#sourcemap)      |     `{Boolean}`      |          `compiler.devtool`           | Enables/Disables generation of source maps   |
 | ||
| | [`implementation`](#implementation) | `{Function\|String}` |               `postcss`               | Setup PostCSS implementation to use          |
 | ||
| 
 | ||
| ### `execute`
 | ||
| 
 | ||
| Type: `Boolean`
 | ||
| Default: `undefined`
 | ||
| 
 | ||
| If you use JS styles the [`postcss-js`](https://github.com/postcss/postcss-js) parser, add the `execute` option.
 | ||
| 
 | ||
| **webpack.config.js**
 | ||
| 
 | ||
| ```js
 | ||
| module.exports = {
 | ||
|   module: {
 | ||
|     rules: [
 | ||
|       {
 | ||
|         test: /\.style.js$/,
 | ||
|         use: [
 | ||
|           "style-loader",
 | ||
|           {
 | ||
|             loader: "css-loader",
 | ||
|           },
 | ||
|           {
 | ||
|             loader: "postcss-loader",
 | ||
|             options: {
 | ||
|               postcssOptions: {
 | ||
|                 parser: "postcss-js",
 | ||
|               },
 | ||
|               execute: true,
 | ||
|             },
 | ||
|           },
 | ||
|         ],
 | ||
|       },
 | ||
|     ],
 | ||
|   },
 | ||
| };
 | ||
| ```
 | ||
| 
 | ||
| ### `postcssOptions`
 | ||
| 
 | ||
| Type: `Object|Function`
 | ||
| Default: `undefined`
 | ||
| 
 | ||
| Allows to set [`PostCSS options`](https://postcss.org/api/#processoptions) and plugins.
 | ||
| 
 | ||
| All `PostCSS` options are supported.
 | ||
| There is the special `config` option for config files. How it works and how it can be configured is described below.
 | ||
| 
 | ||
| We recommend do not specify `from`, `to` and `map` options, because this can lead to wrong path in source maps.
 | ||
| If you need source maps please use the [`sourcemap`](#sourcemap) option.
 | ||
| 
 | ||
| #### `Object`
 | ||
| 
 | ||
| Setup `plugins`:
 | ||
| 
 | ||
| **webpack.config.js** (**recommended**)
 | ||
| 
 | ||
| ```js
 | ||
| const myOtherPostcssPlugin = require("postcss-my-plugin");
 | ||
| 
 | ||
| module.exports = {
 | ||
|   module: {
 | ||
|     rules: [
 | ||
|       {
 | ||
|         test: /\.sss$/i,
 | ||
|         loader: "postcss-loader",
 | ||
|         options: {
 | ||
|           postcssOptions: {
 | ||
|             plugins: [
 | ||
|               "postcss-import",
 | ||
|               ["postcss-short", { prefix: "x" }],
 | ||
|               require.resolve("my-postcss-plugin"),
 | ||
|               myOtherPostcssPlugin({ myOption: true }),
 | ||
|               // Deprecated and will be removed in the next major release
 | ||
|               { "postcss-nested": { preserveEmpty: true } },
 | ||
|             ],
 | ||
|           },
 | ||
|         },
 | ||
|       },
 | ||
|     ],
 | ||
|   },
 | ||
| };
 | ||
| ```
 | ||
| 
 | ||
| **webpack.config.js** (**deprecated**, will be removed in the next major release)
 | ||
| 
 | ||
| ```js
 | ||
| module.exports = {
 | ||
|   module: {
 | ||
|     rules: [
 | ||
|       {
 | ||
|         test: /\.sss$/i,
 | ||
|         loader: "postcss-loader",
 | ||
|         options: {
 | ||
|           postcssOptions: {
 | ||
|             plugins: {
 | ||
|               "postcss-import": {},
 | ||
|               "postcss-short": { prefix: "x" },
 | ||
|             },
 | ||
|           },
 | ||
|         },
 | ||
|       },
 | ||
|     ],
 | ||
|   },
 | ||
| };
 | ||
| ```
 | ||
| 
 | ||
| Setup `syntax`:
 | ||
| 
 | ||
| **webpack.config.js**
 | ||
| 
 | ||
| ```js
 | ||
| module.exports = {
 | ||
|   module: {
 | ||
|     rules: [
 | ||
|       {
 | ||
|         test: /\.sss$/i,
 | ||
|         loader: "postcss-loader",
 | ||
|         options: {
 | ||
|           postcssOptions: {
 | ||
|             // Can be `String`
 | ||
|             syntax: "sugarss",
 | ||
|             // Can be `Object`
 | ||
|             syntax: require("sugarss"),
 | ||
|           },
 | ||
|         },
 | ||
|       },
 | ||
|     ],
 | ||
|   },
 | ||
| };
 | ||
| ```
 | ||
| 
 | ||
| Setup `parser`:
 | ||
| 
 | ||
| **webpack.config.js**
 | ||
| 
 | ||
| ```js
 | ||
| module.exports = {
 | ||
|   module: {
 | ||
|     rules: [
 | ||
|       {
 | ||
|         test: /\.sss$/i,
 | ||
|         loader: "postcss-loader",
 | ||
|         options: {
 | ||
|           postcssOptions: {
 | ||
|             // Can be `String`
 | ||
|             parser: "sugarss",
 | ||
|             // Can be `Object`
 | ||
|             parser: require("sugarss"),
 | ||
|             // Can be `Function`
 | ||
|             parser: require("sugarss").parse,
 | ||
|           },
 | ||
|         },
 | ||
|       },
 | ||
|     ],
 | ||
|   },
 | ||
| };
 | ||
| ```
 | ||
| 
 | ||
| Setup `stringifier`:
 | ||
| 
 | ||
| **webpack.config.js**
 | ||
| 
 | ||
| ```js
 | ||
| const Midas = require("midas");
 | ||
| const midas = new Midas();
 | ||
| 
 | ||
| module.exports = {
 | ||
|   module: {
 | ||
|     rules: [
 | ||
|       {
 | ||
|         test: /\.sss$/i,
 | ||
|         loader: "postcss-loader",
 | ||
|         options: {
 | ||
|           postcssOptions: {
 | ||
|             // Can be `String`
 | ||
|             stringifier: "sugarss",
 | ||
|             // Can be `Object`
 | ||
|             stringifier: require("sugarss"),
 | ||
|             // Can be `Function`
 | ||
|             stringifier: midas.stringifier,
 | ||
|           },
 | ||
|         },
 | ||
|       },
 | ||
|     ],
 | ||
|   },
 | ||
| };
 | ||
| ```
 | ||
| 
 | ||
| #### `Function`
 | ||
| 
 | ||
| **webpack.config.js**
 | ||
| 
 | ||
| ```js
 | ||
| module.exports = {
 | ||
|   module: {
 | ||
|     rules: [
 | ||
|       {
 | ||
|         test: /\.(css|sss)$/i,
 | ||
|         loader: "postcss-loader",
 | ||
|         options: {
 | ||
|           postcssOptions: (loaderContext) => {
 | ||
|             if (/\.sss$/.test(loaderContext.resourcePath)) {
 | ||
|               return {
 | ||
|                 parser: "sugarss",
 | ||
|                 plugins: [
 | ||
|                   ["postcss-short", { prefix: "x" }],
 | ||
|                   "postcss-preset-env",
 | ||
|                 ],
 | ||
|               };
 | ||
|             }
 | ||
| 
 | ||
|             return {
 | ||
|               plugins: [
 | ||
|                 ["postcss-short", { prefix: "x" }],
 | ||
|                 "postcss-preset-env",
 | ||
|               ],
 | ||
|             };
 | ||
|           },
 | ||
|         },
 | ||
|       },
 | ||
|     ],
 | ||
|   },
 | ||
| };
 | ||
| ```
 | ||
| 
 | ||
| #### `config`
 | ||
| 
 | ||
| Type: `Boolean|String`
 | ||
| Default: `undefined`
 | ||
| 
 | ||
| Allows to set options using config files.
 | ||
| Options specified in the config file are combined with options passed to the loader, the loader options overwrite options from config.
 | ||
| 
 | ||
| ##### Config Files
 | ||
| 
 | ||
| The loader will search up the directory tree for configuration in the following places:
 | ||
| 
 | ||
| - a `postcss` property in `package.json`
 | ||
| - a `.postcssrc` file in JSON or YAML format
 | ||
| - a `.postcssrc.json`, `.postcssrc.yaml`, `.postcssrc.yml`, `.postcssrc.js`, or `.postcssrc.cjs` file
 | ||
| - a `postcss.config.js` or `postcss.config.cjs` CommonJS module exporting an object (**recommended**)
 | ||
| 
 | ||
| ##### Examples of Config Files
 | ||
| 
 | ||
| Using `Object` notation:
 | ||
| 
 | ||
| **postcss.config.js** (**recommend**)
 | ||
| 
 | ||
| ```js
 | ||
| module.exports = {
 | ||
|   // You can specify any options from https://postcss.org/api/#processoptions here
 | ||
|   // parser: 'sugarss',
 | ||
|   plugins: [
 | ||
|     // Plugins for PostCSS
 | ||
|     ["postcss-short", { prefix: "x" }],
 | ||
|     "postcss-preset-env",
 | ||
|   ],
 | ||
| };
 | ||
| ```
 | ||
| 
 | ||
| Using `Function` notation:
 | ||
| 
 | ||
| **postcss.config.js** (**recommend**)
 | ||
| 
 | ||
| ```js
 | ||
| module.exports = (api) => {
 | ||
|   // `api.file` - path to the file
 | ||
|   // `api.mode` - `mode` value of webpack, please read https://webpack.js.org/configuration/mode/
 | ||
|   // `api.webpackLoaderContext` - loader context for complex use cases
 | ||
|   // `api.env` - alias `api.mode` for compatibility with `postcss-cli`
 | ||
|   // `api.options` - the `postcssOptions` options
 | ||
| 
 | ||
|   if (/\.sss$/.test(api.file)) {
 | ||
|     return {
 | ||
|       // You can specify any options from https://postcss.org/api/#processoptions here
 | ||
|       parser: "sugarss",
 | ||
|       plugins: [
 | ||
|         // Plugins for PostCSS
 | ||
|         ["postcss-short", { prefix: "x" }],
 | ||
|         "postcss-preset-env",
 | ||
|       ],
 | ||
|     };
 | ||
|   }
 | ||
| 
 | ||
|   return {
 | ||
|     // You can specify any options from https://postcss.org/api/#processoptions here
 | ||
|     plugins: [
 | ||
|       // Plugins for PostCSS
 | ||
|       ["postcss-short", { prefix: "x" }],
 | ||
|       "postcss-preset-env",
 | ||
|     ],
 | ||
|   };
 | ||
| };
 | ||
| ```
 | ||
| 
 | ||
| **postcss.config.js** (**deprecated**, will be removed in the next major release)
 | ||
| 
 | ||
| ```js
 | ||
| module.exports = {
 | ||
|   // You can specify any options from https://postcss.org/api/#processoptions here
 | ||
|   // parser: 'sugarss',
 | ||
|   plugins: {
 | ||
|     // Plugins for PostCSS
 | ||
|     "postcss-short": { prefix: "x" },
 | ||
|     "postcss-preset-env": {},
 | ||
|   },
 | ||
| };
 | ||
| ```
 | ||
| 
 | ||
| ##### Config Cascade
 | ||
| 
 | ||
| You 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 **before** `css-loader` and `style-loader`, but **after** other preprocessor loaders like e.g `sass|less|stylus-loader`, if you use any (since [webpack loaders evaluate right to left/bottom to top](https://webpack.js.org/concepts/loaders/#configuration)).
 | ||
| 
 | ||
| **webpack.config.js** (**recommended**)
 | ||
| 
 | ||
| ```js
 | ||
| module.exports = {
 | ||
|   module: {
 | ||
|     rules: [
 | ||
|       {
 | ||
|         test: /\.css$/,
 | ||
|         use: [
 | ||
|           "style-loader",
 | ||
|           {
 | ||
|             loader: "css-loader",
 | ||
|             options: {
 | ||
|               importLoaders: 1,
 | ||
|             },
 | ||
|           },
 | ||
|           "postcss-loader",
 | ||
|         ],
 | ||
|       },
 | ||
|     ],
 | ||
|   },
 | ||
| };
 | ||
| ```
 | ||
| 
 | ||
| #### Boolean
 | ||
| 
 | ||
| Enables/Disables autoloading config.
 | ||
| 
 | ||
| **webpack.config.js**
 | ||
| 
 | ||
| ```js
 | ||
| module.exports = {
 | ||
|   module: {
 | ||
|     rules: [
 | ||
|       {
 | ||
|         test: /\.css$/i,
 | ||
|         loader: "postcss-loader",
 | ||
|         options: {
 | ||
|           postcssOptions: {
 | ||
|             config: false,
 | ||
|           },
 | ||
|         },
 | ||
|       },
 | ||
|     ],
 | ||
|   },
 | ||
| };
 | ||
| ```
 | ||
| 
 | ||
| #### String
 | ||
| 
 | ||
| Allows to specify the path to the config file.
 | ||
| 
 | ||
| **webpack.config.js**
 | ||
| 
 | ||
| ```js
 | ||
| const path = require("path");
 | ||
| 
 | ||
| module.exports = {
 | ||
|   module: {
 | ||
|     rules: [
 | ||
|       {
 | ||
|         test: /\.css$/i,
 | ||
|         loader: "postcss-loader",
 | ||
|         options: {
 | ||
|           postcssOptions: {
 | ||
|             config: path.resolve(__dirname, "custom.config.js"),
 | ||
|           },
 | ||
|         },
 | ||
|       },
 | ||
|     ],
 | ||
|   },
 | ||
| };
 | ||
| ```
 | ||
| 
 | ||
| ### `sourceMap`
 | ||
| 
 | ||
| Type: `Boolean`
 | ||
| Default: depends on the `compiler.devtool` value
 | ||
| 
 | ||
| By default generation of source maps depends on the [`devtool`](https://webpack.js.org/configuration/devtool/) option.
 | ||
| All values enable source map generation except `eval` and `false` value.
 | ||
| 
 | ||
| **webpack.config.js**
 | ||
| 
 | ||
| ```js
 | ||
| module.exports = {
 | ||
|   module: {
 | ||
|     rules: [
 | ||
|       {
 | ||
|         test: /\.css$/i,
 | ||
|         use: [
 | ||
|           { loader: "style-loader" },
 | ||
|           { loader: "css-loader", options: { sourceMap: true } },
 | ||
|           { loader: "postcss-loader", options: { sourceMap: true } },
 | ||
|           { loader: "sass-loader", options: { sourceMap: true } },
 | ||
|         ],
 | ||
|       },
 | ||
|     ],
 | ||
|   },
 | ||
| };
 | ||
| ```
 | ||
| 
 | ||
| Alternative setup:
 | ||
| 
 | ||
| **webpack.config.js**
 | ||
| 
 | ||
| ```js
 | ||
| module.exports = {
 | ||
|   devtool: "source-map",
 | ||
|   module: {
 | ||
|     rules: [
 | ||
|       {
 | ||
|         test: /\.css$/i,
 | ||
|         use: [
 | ||
|           { loader: "style-loader" },
 | ||
|           { loader: "css-loader" },
 | ||
|           { loader: "postcss-loader" },
 | ||
|           { loader: "sass-loader" },
 | ||
|         ],
 | ||
|       },
 | ||
|     ],
 | ||
|   },
 | ||
| };
 | ||
| ```
 | ||
| 
 | ||
| ### `implementation`
 | ||
| 
 | ||
| Type: `Function | String`
 | ||
| Default: `postcss`
 | ||
| 
 | ||
| The special `implementation` option determines which implementation of PostCSS to use. Overrides the locally installed `peerDependency` version of `postcss`.
 | ||
| 
 | ||
| **This option is only really useful for downstream tooling authors to ease the PostCSS 7-to-8 transition.**
 | ||
| 
 | ||
| #### Function
 | ||
| 
 | ||
| **webpack.config.js**
 | ||
| 
 | ||
| ```js
 | ||
| module.exports = {
 | ||
|   module: {
 | ||
|     rules: [
 | ||
|       {
 | ||
|         test: /\.css$/i,
 | ||
|         use: [
 | ||
|           { loader: "style-loader" },
 | ||
|           { loader: "css-loader" },
 | ||
|           {
 | ||
|             loader: "postcss-loader",
 | ||
|             options: { implementation: require("postcss") },
 | ||
|           },
 | ||
|           { loader: "sass-loader" },
 | ||
|         ],
 | ||
|       },
 | ||
|     ],
 | ||
|   },
 | ||
| };
 | ||
| ```
 | ||
| 
 | ||
| #### String
 | ||
| 
 | ||
| **webpack.config.js**
 | ||
| 
 | ||
| ```js
 | ||
| module.exports = {
 | ||
|   module: {
 | ||
|     rules: [
 | ||
|       {
 | ||
|         test: /\.css$/i,
 | ||
|         use: [
 | ||
|           { loader: "style-loader" },
 | ||
|           { loader: "css-loader" },
 | ||
|           {
 | ||
|             loader: "postcss-loader",
 | ||
|             options: { implementation: require.resolve("postcss") },
 | ||
|           },
 | ||
|           { loader: "sass-loader" },
 | ||
|         ],
 | ||
|       },
 | ||
|     ],
 | ||
|   },
 | ||
| };
 | ||
| ```
 | ||
| 
 | ||
| ## Examples
 | ||
| 
 | ||
| ### SugarSS
 | ||
| 
 | ||
| You'll need to install `sugarss`:
 | ||
| 
 | ||
| ```console
 | ||
| npm install --save-dev sugarss
 | ||
| ```
 | ||
| 
 | ||
| Using [`SugarSS`](https://github.com/postcss/sugarss) syntax.
 | ||
| 
 | ||
| **webpack.config.js**
 | ||
| 
 | ||
| ```js
 | ||
| module.exports = {
 | ||
|   module: {
 | ||
|     rules: [
 | ||
|       {
 | ||
|         test: /\.sss$/i,
 | ||
|         use: [
 | ||
|           "style-loader",
 | ||
|           {
 | ||
|             loader: "css-loader",
 | ||
|             options: { importLoaders: 1 },
 | ||
|           },
 | ||
|           {
 | ||
|             loader: "postcss-loader",
 | ||
|             options: {
 | ||
|               postcssOptions: {
 | ||
|                 parser: "sugarss",
 | ||
|               },
 | ||
|             },
 | ||
|           },
 | ||
|         ],
 | ||
|       },
 | ||
|     ],
 | ||
|   },
 | ||
| };
 | ||
| ```
 | ||
| 
 | ||
| ### Autoprefixer
 | ||
| 
 | ||
| You'll need to install `autoprefixer`:
 | ||
| 
 | ||
| ```console
 | ||
| npm install --save-dev autoprefixer
 | ||
| ```
 | ||
| 
 | ||
| Add vendor prefixes to CSS rules using [`autoprefixer`](https://github.com/postcss/autoprefixer).
 | ||
| 
 | ||
| **webpack.config.js**
 | ||
| 
 | ||
| ```js
 | ||
| module.exports = {
 | ||
|   module: {
 | ||
|     rules: [
 | ||
|       {
 | ||
|         test: /\.css$/i,
 | ||
|         use: [
 | ||
|           "style-loader",
 | ||
|           {
 | ||
|             loader: "css-loader",
 | ||
|             options: { importLoaders: 1 },
 | ||
|           },
 | ||
|           {
 | ||
|             loader: "postcss-loader",
 | ||
|             options: {
 | ||
|               postcssOptions: {
 | ||
|                 plugins: [
 | ||
|                   [
 | ||
|                     "autoprefixer",
 | ||
|                     {
 | ||
|                       // Options
 | ||
|                     },
 | ||
|                   ],
 | ||
|                 ],
 | ||
|               },
 | ||
|             },
 | ||
|           },
 | ||
|         ],
 | ||
|       },
 | ||
|     ],
 | ||
|   },
 | ||
| };
 | ||
| ```
 | ||
| 
 | ||
| > :warning: [`postcss-preset-env`](https://github.com/csstools/postcss-preset-env) includes [`autoprefixer`](https://github.com/postcss/autoprefixer), so adding it separately is not necessary if you already use the preset. More [information](https://github.com/csstools/postcss-preset-env#autoprefixer)
 | ||
| 
 | ||
| ### PostCSS Preset Env
 | ||
| 
 | ||
| You'll need to install `postcss-preset-env`:
 | ||
| 
 | ||
| ```console
 | ||
| npm install --save-dev postcss-preset-env
 | ||
| ```
 | ||
| 
 | ||
| **webpack.config.js**
 | ||
| 
 | ||
| ```js
 | ||
| module.exports = {
 | ||
|   module: {
 | ||
|     rules: [
 | ||
|       {
 | ||
|         test: /\.css$/i,
 | ||
|         use: [
 | ||
|           "style-loader",
 | ||
|           {
 | ||
|             loader: "css-loader",
 | ||
|             options: { importLoaders: 1 },
 | ||
|           },
 | ||
|           {
 | ||
|             loader: "postcss-loader",
 | ||
|             options: {
 | ||
|               postcssOptions: {
 | ||
|                 plugins: [
 | ||
|                   [
 | ||
|                     "postcss-preset-env",
 | ||
|                     {
 | ||
|                       // Options
 | ||
|                     },
 | ||
|                   ],
 | ||
|                 ],
 | ||
|               },
 | ||
|             },
 | ||
|           },
 | ||
|         ],
 | ||
|       },
 | ||
|     ],
 | ||
|   },
 | ||
| };
 | ||
| ```
 | ||
| 
 | ||
| ### CSS Modules
 | ||
| 
 | ||
| What is `CSS Modules`? Please [read](https://github.com/webpack-contrib/css-loader#modules).
 | ||
| 
 | ||
| No additional options required on the `postcss-loader` side.
 | ||
| To make them work properly, either add the `css-loader`’s `importLoaders` option.
 | ||
| 
 | ||
| **webpack.config.js**
 | ||
| 
 | ||
| ```js
 | ||
| module.exports = {
 | ||
|   module: {
 | ||
|     rules: [
 | ||
|       {
 | ||
|         test: /\.css$/i,
 | ||
|         use: [
 | ||
|           "style-loader",
 | ||
|           {
 | ||
|             loader: "css-loader",
 | ||
|             options: {
 | ||
|               modules: true,
 | ||
|               importLoaders: 1,
 | ||
|             },
 | ||
|           },
 | ||
|           "postcss-loader",
 | ||
|         ],
 | ||
|       },
 | ||
|     ],
 | ||
|   },
 | ||
| };
 | ||
| ```
 | ||
| 
 | ||
| ### CSS-in-JS and [`postcss-js`](https://github.com/postcss/postcss-js)
 | ||
| 
 | ||
| You'll need to install `postcss-js`:
 | ||
| 
 | ||
| ```console
 | ||
| npm install --save-dev postcss-js
 | ||
| ```
 | ||
| 
 | ||
| If you want to process styles written in JavaScript, use the [`postcss-js`](https://github.com/postcss/postcss-js) parser.
 | ||
| 
 | ||
| **webpack.config.js**
 | ||
| 
 | ||
| ```js
 | ||
| module.exports = {
 | ||
|   module: {
 | ||
|     rules: [
 | ||
|       {
 | ||
|         test: /\.style.js$/,
 | ||
|         use: [
 | ||
|           "style-loader",
 | ||
|           {
 | ||
|             loader: "css-loader",
 | ||
|             options: {
 | ||
|               importLoaders: 2,
 | ||
|             },
 | ||
|           },
 | ||
|           {
 | ||
|             loader: "postcss-loader",
 | ||
|             options: {
 | ||
|               postcssOptions: {
 | ||
|                 parser: "postcss-js",
 | ||
|               },
 | ||
|               execute: true,
 | ||
|             },
 | ||
|           },
 | ||
|           "babel-loader",
 | ||
|         ],
 | ||
|       },
 | ||
|     ],
 | ||
|   },
 | ||
| };
 | ||
| ```
 | ||
| 
 | ||
| As result you will be able to write styles in the following way
 | ||
| 
 | ||
| ```js
 | ||
| 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
 | ||
| 
 | ||
| > 1. Add [`babel-plugin-add-module-exports`](https://github.com/59naga/babel-plugin-add-module-exports) to your configuration.
 | ||
| > 2. You need to have only one **default** export per style module.
 | ||
| 
 | ||
| ### Extract CSS
 | ||
| 
 | ||
| Using [`mini-css-extract-plugin`](https://github.com/webpack-contrib/mini-css-extract-plugin).
 | ||
| 
 | ||
| **webpack.config.js**
 | ||
| 
 | ||
| ```js
 | ||
| const isProductionMode = process.env.NODE_ENV === "production";
 | ||
| 
 | ||
| const MiniCssExtractPlugin = require("mini-css-extract-plugin");
 | ||
| 
 | ||
| module.exports = {
 | ||
|   mode: isProductionMode ? "production" : "development",
 | ||
|   module: {
 | ||
|     rules: [
 | ||
|       {
 | ||
|         test: /\.css$/,
 | ||
|         use: [
 | ||
|           isProductionMode ? MiniCssExtractPlugin.loader : "style-loader",
 | ||
|           "css-loader",
 | ||
|           "postcss-loader",
 | ||
|         ],
 | ||
|       },
 | ||
|     ],
 | ||
|   },
 | ||
|   plugins: [
 | ||
|     new MiniCssExtractPlugin({
 | ||
|       filename: isProductionMode ? "[name].[contenthash].css" : "[name].css",
 | ||
|     }),
 | ||
|   ],
 | ||
| };
 | ||
| ```
 | ||
| 
 | ||
| ### Emit assets
 | ||
| 
 | ||
| To write a asset from PostCSS plugin to the webpack, need to add a message in `result.messages`.
 | ||
| 
 | ||
| The message should contain the following fields:
 | ||
| 
 | ||
| - `type` = `asset` - Message type (require, should be equal `asset`)
 | ||
| - `file` - file name (require)
 | ||
| - `content` - file content (require)
 | ||
| - `sourceMap` - sourceMap
 | ||
| - `info` - asset info
 | ||
| 
 | ||
| **webpack.config.js**
 | ||
| 
 | ||
| ```js
 | ||
| const customPlugin = () => (css, result) => {
 | ||
|   result.messages.push({
 | ||
|     type: "asset",
 | ||
|     file: "sprite.svg",
 | ||
|     content: "<svg>...</svg>",
 | ||
|   });
 | ||
| };
 | ||
| 
 | ||
| const postcssPlugin = postcss.plugin("postcss-assets", customPlugin);
 | ||
| 
 | ||
| module.exports = {
 | ||
|   module: {
 | ||
|     rules: [
 | ||
|       {
 | ||
|         test: /\.css$/i,
 | ||
|         use: [
 | ||
|           "style-loader",
 | ||
|           "css-loader",
 | ||
|           {
 | ||
|             loader: "postcss-loader",
 | ||
|             options: {
 | ||
|               postcssOptions: {
 | ||
|                 plugins: [postcssPlugin()],
 | ||
|               },
 | ||
|             },
 | ||
|           },
 | ||
|         ],
 | ||
|       },
 | ||
|     ],
 | ||
|   },
 | ||
| };
 | ||
| ```
 | ||
| 
 | ||
| ### Add dependencies, contextDependencies, buildDependencies, missingDependencies
 | ||
| 
 | ||
| The dependencies are necessary for webpack to understand when it needs to run recompilation on the changed files.
 | ||
| 
 | ||
| There are two way to add dependencies:
 | ||
| 
 | ||
| 1. (Recommended). The plugin may emit messages in `result.messages`.
 | ||
| 
 | ||
| The message should contain the following fields:
 | ||
| 
 | ||
| - `type` = `dependency` - Message type (require, should be equal `dependency`, `context-dependency`, `build-dependency` or `missing-dependency`)
 | ||
| - `file` - absolute file path (require)
 | ||
| 
 | ||
| **webpack.config.js**
 | ||
| 
 | ||
| ```js
 | ||
| const path = require("path");
 | ||
| 
 | ||
| const customPlugin = () => (css, result) => {
 | ||
|   result.messages.push({
 | ||
|     type: "dependency",
 | ||
|     file: path.resolve(__dirname, "path", "to", "file"),
 | ||
|   });
 | ||
| };
 | ||
| 
 | ||
| const postcssPlugin = postcss.plugin("postcss-assets", customPlugin);
 | ||
| 
 | ||
| module.exports = {
 | ||
|   module: {
 | ||
|     rules: [
 | ||
|       {
 | ||
|         test: /\.css$/i,
 | ||
|         use: [
 | ||
|           "style-loader",
 | ||
|           "css-loader",
 | ||
|           {
 | ||
|             loader: "postcss-loader",
 | ||
|             options: {
 | ||
|               postcssOptions: {
 | ||
|                 plugins: [postcssPlugin()],
 | ||
|               },
 | ||
|             },
 | ||
|           },
 | ||
|         ],
 | ||
|       },
 | ||
|     ],
 | ||
|   },
 | ||
| };
 | ||
| ```
 | ||
| 
 | ||
| 2. Pass `loaderContext` in plugin.
 | ||
| 
 | ||
| **webpack.config.js**
 | ||
| 
 | ||
| ```js
 | ||
| const path = require("path");
 | ||
| 
 | ||
| module.exports = {
 | ||
|   module: {
 | ||
|     rules: [
 | ||
|       {
 | ||
|         test: /\.css$/i,
 | ||
|         use: [
 | ||
|           "style-loader",
 | ||
|           "css-loader",
 | ||
|           {
 | ||
|             loader: "postcss-loader",
 | ||
|             options: {
 | ||
|               postcssOptions: {
 | ||
|                 config: path.resolve(__dirname, "path/to/postcss.config.js"),
 | ||
|               },
 | ||
|             },
 | ||
|           },
 | ||
|         ],
 | ||
|       },
 | ||
|     ],
 | ||
|   },
 | ||
| };
 | ||
| ```
 | ||
| 
 | ||
| **postcss.config.js**
 | ||
| 
 | ||
| ```js
 | ||
| module.exports = (api) => ({
 | ||
|   plugins: [
 | ||
|     require("path/to/customPlugin")({
 | ||
|       loaderContext: api.webpackLoaderContext,
 | ||
|     }),
 | ||
|   ],
 | ||
| });
 | ||
| ```
 | ||
| 
 | ||
| **customPlugin.js**
 | ||
| 
 | ||
| ```js
 | ||
| const path = require("path");
 | ||
| 
 | ||
| const customPlugin = (loaderContext) => (css, result) => {
 | ||
|   loaderContext.webpack.addDependency(
 | ||
|     path.resolve(__dirname, "path", "to", "file")
 | ||
|   );
 | ||
| };
 | ||
| 
 | ||
| module.exports = postcss.plugin("postcss-assets", customPlugin);
 | ||
| ```
 | ||
| 
 | ||
| ## Contributing
 | ||
| 
 | ||
| Please take a moment to read our contributing guidelines if you haven't yet done so.
 | ||
| 
 | ||
| [CONTRIBUTING](./.github/CONTRIBUTING.md)
 | ||
| 
 | ||
| ## License
 | ||
| 
 | ||
| [MIT](./LICENSE)
 | ||
| 
 | ||
| [npm]: https://img.shields.io/npm/v/postcss-loader.svg
 | ||
| [npm-url]: https://npmjs.com/package/postcss-loader
 | ||
| [node]: https://img.shields.io/node/v/postcss-loader.svg
 | ||
| [node-url]: https://nodejs.org
 | ||
| [deps]: https://david-dm.org/webpack-contrib/postcss-loader.svg
 | ||
| [deps-url]: https://david-dm.org/webpack-contrib/postcss-loader
 | ||
| [tests]: https://github.com/webpack-contrib/postcss-loader/workflows/postcss-loader/badge.svg
 | ||
| [tests-url]: https://github.com/webpack-contrib/postcss-loader/actions
 | ||
| [cover]: https://codecov.io/gh/webpack-contrib/postcss-loader/branch/master/graph/badge.svg
 | ||
| [cover-url]: https://codecov.io/gh/webpack-contrib/postcss-loader
 | ||
| [chat]: https://badges.gitter.im/webpack/webpack.svg
 | ||
| [chat-url]: https://gitter.im/webpack/webpack
 | ||
| [chat-postcss]: https://badges.gitter.im/postcss/postcss.svg
 | ||
| [chat-postcss-url]: https://gitter.im/postcss/postcss
 | ||
| [size]: https://packagephobia.now.sh/badge?p=postcss-loader
 | ||
| [size-url]: https://packagephobia.now.sh/result?p=postcss-loader
 |