UNPKG

8.72 kBMarkdownView Raw
1[![npm][npm]][npm-url]
2[![deps][deps]][deps-url]
3[![test][test]][test-url]
4
5<div align="center">
6 <img height="100"
7 src="https://worldvectorlogo.com/logos/sass-1.svg">
8 <a href="https://github.com/webpack/webpack">
9 <img height="100"
10 src="https://github.com/webpack/media/raw/master/logo/logo-on-white-bg.png?raw=true">
11 </a>
12 <h1>sass-loader</h1>
13 <p>Compiles Sass to CSS.<br>Use the <a href="https://github.com/webpack/css-loader">css-loader</a> or the <a href="https://github.com/webpack/raw-loader">raw-loader</a> to turn it into a JS module and the <a href="https://github.com/webpack/extract-text-webpack-plugin">ExtractTextPlugin</a> to extract it into a separate file.<p>
14 <p>Looking for the webpack 1 loader? Check out the <a href="https://github.com/jtangelder/sass-loader/tree/archive/webpack-1">archive/webpack-1 branch</a>.</p>
15</div>
16
17## Install
18
19```bash
20npm install sass-loader node-sass webpack --save-dev
21```
22
23The sass-loader requires [node-sass](https://github.com/sass/node-sass) and [webpack](https://github.com/webpack/webpack)
24as [`peerDependency`](https://docs.npmjs.com/files/package.json#peerdependencies). Thus you are able to control the versions accurately.
25
26## Examples
27
28Chain the sass-loader with the [css-loader](https://github.com/webpack/css-loader) and the [style-loader](https://github.com/webpack/style-loader) to immediately apply all styles to the DOM.
29
30```js
31// webpack.config.js
32module.exports = {
33 ...
34 module: {
35 rules: [{
36 test: /\.scss$/,
37 use: [{
38 loader: "style-loader" // creates style nodes from JS strings
39 }, {
40 loader: "css-loader" // translates CSS into CommonJS
41 }, {
42 loader: "sass-loader" // compiles Sass to CSS
43 }]
44 }]
45 }
46};
47```
48
49You can also pass options directly to [node-sass](https://github.com/andrew/node-sass) by specifying an `options` property like this:
50
51```js
52// webpack.config.js
53module.exports = {
54 ...
55 module: {
56 rules: [{
57 test: /\.scss$/,
58 use: [{
59 loader: "style-loader"
60 }, {
61 loader: "css-loader"
62 }, {
63 loader: "sass-loader",
64 options: {
65 includePaths: ["absolute/path/a", "absolute/path/b"]
66 }
67 }]
68 }]
69 }
70};
71```
72
73See [node-sass](https://github.com/andrew/node-sass) for all available Sass options.
74
75### In production
76
77Usually, it's recommended to extract the stylesheets into a dedicated file in production using the [ExtractTextPlugin](https://github.com/webpack/extract-text-webpack-plugin). This way your styles are not dependent on JavaScript:
78
79```js
80const ExtractTextPlugin = require("extract-text-webpack-plugin");
81
82const extractSass = new ExtractTextPlugin({
83 filename: "[name].[contenthash].css",
84 disable: process.env.NODE_ENV === "development"
85});
86
87module.exports = {
88 ...
89 module: {
90 rules: [{
91 test: /\.scss$/,
92 loader: extractSass.extract({
93 loader: [{
94 loader: "css-loader"
95 }, {
96 loader: "sass-loader"
97 }],
98 // use style-loader in development
99 fallbackLoader: "style-loader"
100 })
101 }]
102 },
103 plugins: [
104 extractSass
105 ]
106};
107```
108
109## Usage
110
111### Imports
112
113webpack provides an [advanced mechanism to resolve files](http://webpack.github.io/docs/resolving.html). The sass-loader uses node-sass' custom importer feature to pass all queries to the webpack resolving engine. Thus you can import your Sass modules from `node_modules`. Just prepend them with a `~` to tell webpack that this is not a relative import:
114
115```css
116@import "~bootstrap/css/bootstrap";
117```
118
119It's important to only prepend it with `~`, because `~/` resolves to the home directory. webpack needs to distinguish between `bootstrap` and `~bootstrap` because CSS and Sass files have no special syntax for importing relative files. Writing `@import "file"` is the same as `@import "./file";`
120
121### Environment variables
122
123If you want to prepend Sass code before the actual entry file, you can simply set the `data` option. In this case, the sass-loader will not override the `data` option but just append the entry's content. This is especially useful when some of your Sass variables depend on the environment:
124
125```javascript
126{
127 loader: "sass-loader",
128 options: {
129 data: "$env: " + process.env.NODE_ENV + ";"
130 }
131}
132```
133
134
135### Problems with `url(...)`
136
137Since Sass/[libsass](https://github.com/sass/libsass) does not provide [url rewriting](https://github.com/sass/libsass/issues/532), all linked assets must be relative to the output.
138
139- If you're just generating CSS without passing it to the css-loader, it must be relative to your web root.
140- If you pass the generated CSS on to the css-loader, all urls must be relative to the entry-file (e.g. `main.scss`).
141
142More likely you will be disrupted by this second issue. It is natural to expect relative references to be resolved against the `.scss` file in which they are specified (like in regular `.css` files). Thankfully there are a two solutions to this problem:
143
144- Add the missing url rewriting using the [resolve-url-loader](https://github.com/bholloway/resolve-url-loader). Place it directly after the sass-loader in the loader chain.
145- Library authors usually provide a variable to modify the asset path. [bootstrap-sass](https://github.com/twbs/bootstrap-sass) for example has an `$icon-font-path`. Check out [this working bootstrap example](https://github.com/jtangelder/sass-loader/tree/master/test/bootstrapSass).
146
147### Extracting stylesheets
148
149Bundling CSS with webpack has some nice advantages like referencing images and fonts with hashed urls or [hot module replacement](http://webpack.github.io/docs/hot-module-replacement-with-webpack.html) in development. In production, on the other hand, it's not a good idea to apply your stylesheets depending on JS execution. Rendering may be delayed or even a [FOUC](https://en.wikipedia.org/wiki/Flash_of_unstyled_content) might be visible. Thus it's often still better to have them as separate files in your final production build.
150
151There are two possibilties to extract a stylesheet from the bundle:
152
153- [extract-loader](https://github.com/peerigon/extract-loader) (simpler, but specialized on the css-loader's output)
154- [extract-text-webpack-plugin](https://github.com/webpack/extract-text-webpack-plugin) (more complex, but works in all use-cases)
155
156### Source maps
157
158To enable CSS source maps, you'll need to pass the `sourceMap` option to the sass-loader *and* the css-loader. Your `webpack.config.js` should look like this:
159
160```javascript
161module.exports = {
162 ...
163 devtool: "source-map", // any "source-map"-like devtool is possible
164 module: {
165 rules: [{
166 test: /\.scss$/,
167 use: [{
168 loader: "style-loader"
169 }, {
170 loader: "css-loader", options: {
171 sourceMap: true
172 }
173 }, {
174 loader: "sass-loader", options: {
175 sourceMap: true
176 }
177 }]
178 }]
179 }
180};
181```
182
183If you want to edit the original Sass files inside Chrome, [there's a good blog post](https://medium.com/@toolmantim/getting-started-with-css-sourcemaps-and-in-browser-sass-editing-b4daab987fb0). Checkout [test/sourceMap](https://github.com/jtangelder/sass-loader/tree/master/test) for a running example.
184
185
186## Maintainers
187
188<table>
189 <tbody>
190 <tr>
191 <td align="center">
192 <img width="150 height="150"
193 src="https://avatars0.githubusercontent.com/u/781746?v=3"><br>
194 <a href="https://github.com/jhnns">Johannes Ewald</a>
195 </td>
196 <td align="center">
197 <img width="150 height="150"
198 src="https://avatars1.githubusercontent.com/u/1243901?v=3&s=460"><br>
199 <a href="https://github.com/jtangelder">Jorik Tangelder</a>
200 </td>
201 <td align="center">
202 <img width="150" height="150"
203 src="https://avatars1.githubusercontent.com/u/3403295?v=3"><br>
204 <a href="https://github.com/akiran">Kiran</a>
205 </td>
206 <tr>
207 <tbody>
208</table>
209
210
211## License
212
213[MIT](http://www.opensource.org/licenses/mit-license.php)
214
215
216[npm]: https://img.shields.io/npm/v/sass-loader.svg
217[npm-url]: https://npmjs.com/package/sass-loader
218
219[deps]: https://david-dm.org/jtangelder/sass-loader.svg
220[deps-url]: https://david-dm.org/jtangelder/sass-loader
221
222[test]: http://img.shields.io/travis/jtangelder/sass-loader.svg
223[test-url]: https://travis-ci.org/jtangelder/sass-loader