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 --save-dev
Starting with 1.0.0
, the sass-loader requires node-sass as peerDependency
. Thus you are able to specify the required version accurately.
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'
}
]
}
};
Then you only need to write: require('./file.scss')
.
Sass options
You can pass any Sass specific configuration options through to the render function via query parameters.
module.exports = {
module: {
loaders: [
{
test: /\.scss$/,
loader: "style!css!sass?outputStyle=expanded&" +
"includePaths[]=" +
encodeURIComponent(path.resolve(__dirname, "./some-folder")) + "&" +
"includePaths[]=" +
encodeURIComponent(path.resolve(__dirname, "./another-folder"))
}
]
}
};
See node-sass for all available options.
Imports
webpack provides an advanced mechanism to resolve files. 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 ~
which tells webpack to look-up the modulesDirectories
.
@import "~bootstrap/less/bootstrap";
It'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";
.sass files
For requiring .sass
files, add indentedSyntax
as a loader option:
module.exports = {
module: {
loaders: [
{
test: /\.sass$/,
loader: "style!css!sass?indentedSyntax"
}
]
}
};
Problems with url(...)
Since Sass/libsass does not provide url rewriting, all linked assets must be relative to the output.
- If you're just generating CSS without passing it to the css-loader, it must be relative to your web root.
- If you pass the generated CSS on to the css-loader, all urls must be relative to the entry-file (e.g.
main.scss
).
Library authors usually provide a variable to modify the asset path. bootstrap-sass for example has an $icon-font-path
. Check out this example.
Source maps
Because of browser limitations, 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 downloaded 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 edit the original Sass files inside Chrome, there's a good blog post. Checkout test/sourceMap for a running example. Make sure to serve the content with an HTTP server.
License
MIT (http://www.opensource.org/licenses/mit-license.php)