You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1102 lines
24 KiB
1102 lines
24 KiB
3 years ago
|
<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
|