2017-09-13 07:52:34 +02:00

228 lines
6.5 KiB
Markdown

# css loader for webpack
## installation
`npm install css-loader --save-dev`
## Usage
[Documentation: Using loaders](http://webpack.github.io/docs/using-loaders.html)
``` javascript
var css = require("css!./file.css");
// => returns css code from file.css, resolves imports and url(...)
```
`@import` and `url(...)` are interpreted like `require()` and will be resolved by the css-loader.
Good loaders for requiring your assets are the [file-loader](https://github.com/webpack/file-loader)
and the [url-loader](https://github.com/webpack/url-loader) which you should specify in your config (see below).
To be compatible with existing css files:
* `url(image.png)` => `require("./image.png")`
* `url(~module/image.png)` => `require("module/image.png")`
### Example config
This webpack config can load css files, embed small png images as Data Urls and jpg images as files.
``` javascript
module.exports = {
module: {
loaders: [
{ test: /\.css$/, loader: "style-loader!css-loader" },
{ test: /\.png$/, loader: "url-loader?limit=100000" },
{ test: /\.jpg$/, loader: "file-loader" }
]
}
};
```
### 'Root-relative' urls
For urls that start with a `/`, the default behavior is to not translate them:
* `url(/image.png)` => `url(/image.png)`
If a `root` query parameter is set, however, it will be prepended to the url
and then translated:
With a config like:
``` javascript
loaders: [
{ test: /\.css$/, loader: "style-loader!css-loader?root=." },
...
]
```
The result is:
* `url(/image.png)` => `require("./image.png")`
### Local scope
By default CSS exports all class names into a global selector scope. This is a feature which offer a local selector scope.
The syntax `:local(.className)` can be used to declare `className` in the local scope. The local identifiers are exported by the module.
With `:local` (without brackets) local mode can be switched on for this selector. `:global(.className)` can be used to declare an explicit global selector. With `:global` (without brackets) global mode can be switched on for this selector.
The loader replaces local selectors with unique identifiers. The choosen unique identifiers are exported by the module.
Example:
``` css
:local(.className) { background: red; }
:local .className { color: green; }
:local(.className .subClass) { color: green; }
:local .className .subClass :global(.global-class-name) { color: blue; }
```
is transformed to
``` css
._23_aKvs-b8bW2Vg3fwHozO { background: red; }
._23_aKvs-b8bW2Vg3fwHozO { color: green; }
._23_aKvs-b8bW2Vg3fwHozO ._13LGdX8RMStbBE9w-t0gZ1 { color: green; }
._23_aKvs-b8bW2Vg3fwHozO ._13LGdX8RMStbBE9w-t0gZ1 .global-class-name { color: blue; }
```
and the identifiers are exported:
``` js
exports.locals = {
className: "_23_aKvs-b8bW2Vg3fwHozO",
subClass: "_13LGdX8RMStbBE9w-t0gZ1"
}
```
Camelcasing is recommended for local selectors. They are easier to use in the importing javascript module.
You can use `:local(#someId)`, but this is not recommended. Use classes instead of ids.
You can configure the generated ident with the `localIdentName` query parameter (default `[hash:base64]`). Example: `css-loader?localIdentName=[path][name]---[local]---[hash:base64:5]` for easier debugging.
Note: For prerendering with extract-text-webpack-plugin you should use `css-loader/locals` instead of `style-loader!css-loader` in the prerendering bundle. It doesn't embed CSS but only exports the identifier mappings.
### Module mode
(experimental)
The query parameter `module` enables **CSS Module** mode. (`css-loader?module`)
* Local scoped by default.
* `url(...)` URLs behave like requests in modules:
* `./file.png` instead of `file.png`
* `module/file.png` instead of `~module/file.png`
Thanks to [@markdalgleish](https://github.com/markdalgleish) for prior work on this topic.
### Inheriting
When declaring a local class name you can inherit from another local class name.
``` css
:local(.className) {
background: red;
color: yellow;
}
:local(.subClass) {
extends: className;
background: blue;
}
```
This doesn't result in any change to the CSS itself but exports multiple class names:
``` js
exports.locals = {
className: "_23_aKvs-b8bW2Vg3fwHozO",
subClass: "_13LGdX8RMStbBE9w-t0gZ1 _23_aKvs-b8bW2Vg3fwHozO"
}
```
and CSS is transformed to:
``` css
._23_aKvs-b8bW2Vg3fwHozO {
background: red;
color: yellow;
}
._13LGdX8RMStbBE9w-t0gZ1 {
background: blue;
}
```
### Importing local class names
To import a local class name from another module:
``` css
:local(.continueButton) {
extends: button from "library/button.css";
background: red;
}
```
``` css
:local(.nameEdit) {
extends: edit highlight from "./edit.css";
background: red;
}
```
To import from multiple modules use multiple `extends:` rules. You can also use `url(...)` to specify the module (it behave a bit different).
``` css
:local(.className) {
extends: edit hightlight from "./edit.css";
extends: button from url("button.css");
/* equal to 'extends: button from "./button.css";' */
extends: classFromThisModule;
background: red;
}
```
### SourceMaps
To include SourceMaps set the `sourceMap` query param.
`require("css-loader?sourceMap!./file.css")`
I. e. the extract-text-webpack-plugin can handle them.
### importing and chained loaders
The query parameter `importLoaders` allow to configure which loaders should be applied to `@import`ed resources.
`importLoaders` (int): That many loaders after the css-loader are used to import resources.
Examples:
``` js
require("style-loader!css-loader?importLoaders=1!autoprefixer-loader!...")
// => imported resources are handled this way:
require("css-loader?importLoaders=1!autoprefixer-loader!...")
require("style-loader!css-loader!stylus-loader!...")
// => imported resources are handled this way:
require("css-loader!...")
```
### Minification
By default the css-loader minimizes the css if specified by the module system.
In some cases the minification is destructive to the css, so you can provide some options to it. clean-css is used for minification and you find a [list of options here](https://github.com/jakubpawlowicz/clean-css#how-to-use-clean-css-programmatically). Just provide them as query parameter: i. e. `require("css-loader?-restructuring&compatibility")` to disable restructuring and enable compatibility mode.
You can also disable or enforce minification with the `minimize` query parameter.
`require("css-loader?minimize!./file.css")` (enforced)
`require("css-loader?-minimize!./file.css")` (disabled)
## License
MIT (http://www.opensource.org/licenses/mit-license.php)