What is sass-loader?
The sass-loader npm package is a loader for webpack that allows you to preprocess .scss or .sass files to standard CSS. It uses the Sass compiler to convert Sass code into CSS, and then webpack can bundle the resulting CSS into your final build.
What are sass-loader's main functionalities?
Compiling Sass/SCSS to CSS
This webpack configuration snippet demonstrates how to set up sass-loader in conjunction with css-loader and style-loader to process .scss files.
module.exports = {
module: {
rules: [
{
test: /\.scss$/,
use: [
'style-loader',
'css-loader',
'sass-loader'
]
}
]
}
};
Source Maps
This code enables source maps for easier debugging of Sass files. It configures sass-loader to generate source maps so that the browser dev tools can display the original Sass code instead of the compiled CSS.
module.exports = {
module: {
rules: [
{
test: /\.scss$/,
use: [
'style-loader',
{
loader: 'css-loader',
options: { sourceMap: true }
},
{
loader: 'sass-loader',
options: { sourceMap: true }
}
]
}
]
}
};
Custom Functions
This example shows how to add custom functions to the Sass compilation process. The custom 'pow' function can be used within Sass files to compute powers.
const sass = require('sass');
module.exports = {
module: {
rules: [
{
test: /\.scss$/,
use: [
'style-loader',
'css-loader',
{
loader: 'sass-loader',
options: {
sassOptions: {
functions: {
'pow($base, $exponent)': function(base, exponent) {
return new sass.types.Number(Math.pow(base.getValue(), exponent.getValue()));
}
}
}
}
}
]
}
]
}
};
Other packages similar to sass-loader
node-sass
node-sass is a library that provides binding for Node.js to the Sass compiler. It allows you to natively compile .scss files to css at incredible speed. However, node-sass is deprecated in favor of Dart Sass.
postcss-loader
postcss-loader is a tool that uses PostCSS to process CSS with JavaScript plugins. It can be used for tasks such as autoprefixing, linting, and more. While sass-loader focuses on compiling Sass, postcss-loader is more about post-processing CSS.
less-loader
less-loader is similar to sass-loader but for Less, which is another preprocessor language that extends the capabilities of CSS. It's a loader for webpack that compiles Less to CSS.
stylus-loader
stylus-loader enables webpack to compile Stylus files to CSS. Stylus is another CSS preprocessor scripting language, offering similar features to Sass/SCSS.
sass loader for webpack
Install
npm install sass-loader
Usage
Documentation: Using loaders
var css = require("raw!sass!./file.scss");
var css = require("css!sass!./file.scss");
Use in tandem with the style-loader
to add the css rules to your document:
require("style!css!sass!./file.scss");
Apply via webpack config
It's recommended to adjust your webpack.config
so style!css!sass!
is applied automatically on all files ending on .scss
:
module.exports = {
module: {
loaders: [
{
test: /\.scss$/,
loader: "style!css!sass?outputStyle=expanded&" +
"includePaths[]=" +
(path.resolve(__dirname, "./bower_components")) + "&" +
"includePaths[]=" +
(path.resolve(__dirname, "./node_modules"))
}
]
}
};
Then you only need to write: require("./file.scss")
. See node-sass
for all available options.
.sass files
For requiring .sass
files, add indentedSyntax=sass
as a loader option:
module.exports = {
module: {
loaders: [
{
test: /\.scss$/,
loader: "style!css!sass?indentedSyntax=sass"
}
]
}
};
Source maps
Source maps are only available in conjunction with the extract-text-webpack-plugin. Use that plugin to extract the CSS code from the generated JS bundle into a separate file (which even improves the perceived performance because JS and CSS are loaded in parallel).
Then your webpack.config.js
should look like this:
var ExtractTextPlugin = require('extract-text-webpack-plugin');
module.exports = {
...
devtool: 'source-map',
module: {
loaders: [
{
test: /\.scss$/,
loader: ExtractTextPlugin.extract(
'css?sourceMap!' +
'sass?sourceMap'
)
}
]
},
plugins: [
new ExtractTextPlugin('styles.css')
]
};
If you want to view the original SASS files inside Chrome and even edit it, there's a good blog post. Checkout test/sourceMap for a running example. Make sure to serve the content with an HTTP server.
Caveats
Currently the sass-loader does not follow all of the webpack loader guidelines. The general problem is that the entry scss-file is passed to node-sass which does pretty much the rest. Thus @import
statements inside your scss-files cannot be resolved by webpack's resolver. However, there is an issue for that missing feature in libsass.
License
MIT (http://www.opensource.org/licenses/mit-license.php)