webpack/sass-loader
As a frontend project, webpack/sass-loader has picked up 3.9k stars on GitHub (JavaScript). Compiles Sass to CSS
Snapshot summary built from the project's own GitHub metadata — there's no written TopGit review yet. The page will update automatically when a full review is published.
TopGit writes full reviews for the most-starred, most-requested repositories. This page is a snapshot until then — see the READ ME tab for the original README in full.
Snapshot
Top contributors
Show top contributors
sass-loader
Loads a Sass/SCSS file and compiles it to CSS.
Getting Started
To begin, you'll need to install sass-loader:
npm install sass-loader sass webpack --save-dev
or
yarn add -D sass-loader sass webpack
or
pnpm add -D sass-loader sass webpack
[!NOTE]
To enable CSS processing in your project, you need to install style-loader and css-loader via
npm i style-loader css-loader.
sass-loader requires you to install either Dart Sass or Sass Embedded on your own (more documentation can be found below).
This allows you to control the versions of all your dependencies and to choose which Sass implementation to use.
[!NOTE]
We highly recommend using Sass Embedded or Dart Sass.
Chain the sass-loader with the css-loader and the style-loader to immediately apply all styles to the DOM, or with the mini-css-extract-plugin to extract it into a separate file.
Then add the loader to your webpack configuration. For example:
app.js
import "./style.scss";
style.scss
$body-color: red;
body {
color: $body-color;
}
webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.s[ac]ss$/i,
use: [
// Creates `style` nodes from JS strings
"style-loader",
// Translates CSS into CommonJS
"css-loader",
// Compiles Sass to CSS
"sass-loader",
],
},
],
},
};
Finally run webpack via your preferred method (e.g., via CLI or an npm script).
The style option in production mode
For production mode, the style option defaults to compressed unless otherwise specified in sassOptions.
Resolving import and use at-rules
Webpack provides an advanced mechanism to resolve files.
The sass-loader uses Sass's custom importer feature to pass all queries to the webpack resolving engine, enabling you to import your Sass modules from node_modules.
@import "bootstrap";
Using ~ is deprecated and should be removed from your code, but we still support it for historical reasons.
Why can you remove it? The loader will first try to resolve @import as a relative path. If it cannot be resolved, then the loader will try to resolve @import inside node_modules.
Prepending module paths with a ~ tells webpack to search through node_modules.
@import "~bootstrap";
It's important to prepend the path with only ~, 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 "style.scss" is the same as @import "./style.scss";
Problems with url(...)
Since Sass implementations don't provide url rewriting, all linked assets must be relative to the output.
- If you pass the generated CSS on to the
css-loader, all URLs must be relative to the entry-file (e.g.main.scss). - If you're just generating CSS without passing it to the
css-loader, URLs must be relative to your web root.
You might be surprised by this first issue, as it is natural to expect relative references to be resolved against the .sass/.scss file in which they are specified (like in regular .css files).
Thankfully there are two solutions to this problem:
-
Add the missing URL rewriting using the resolve-url-loader. Place it before
sass-loaderin the loader chain. -
Library authors usually provide a variable to modify the asset path. bootstrap-sass for example, has an
$icon-font-path.
Options
implementationsassOptionssourceMapadditionalDatawebpackImporterwarnRuleAsWarningapi
implementation
Type:
type implementation = object | string;
Default: sass
The special implementation option determines which implementation of Sass to use.
By default, the loader resolves the implementation based on your dependencies.
Just add the desired implementation to your package.json (sass or sass-embedded package) and install dependencies.
Example where the sass-loader uses the sass (dart-sass) implementation:
package.json
{
"devDependencies": {
"sass-loader": "^7.2.0",
"sass": "^1.22.10"
}
}
Example where the sass-loader uses the sass-embedded implementation:
package.json
{
"devDependencies": {
"sass-loader": "^7.2.0",
"sass": "^1.22.10"
},
"optionalDependencies": {
"sass-embedded": "^1.70.0"
}
}
[!NOTE]
Using
optionalDependenciesmeans thatsass-loadercan fallback tosasswhen running on an operating system not supported bysass-embedded
Be aware of the order that sass-loader will resolve the implementation:
sass-embeddedsass
You can specify a specific implementation by using the implementation option, which accepts one of the above values.
object
For example, to always use Dart Sass, you'd pass:
module.exports = {
module: {
rules: [
{
test: /\.s[ac]ss$/i,
use: [
"style-loader",
"css-loader",
{
loader: "sass-loader",
options: {
// Prefer `dart-sass`, even if `sass-embedded` is available
implementation: require("sass"),
},
},
],
},
],
},
};
string
For example, to use Dart Sass, you'd pass:
module.exports = {
module: {
rules: [
{
test: /\.s[ac]ss$/i,
use: [
"style-loader",
"css-loader",
{
loader: "sass-loader",
options: {
// Prefer `dart-sass`, even if `sass-embedded` is available
implementation: require.resolve("sass"),
},
},
],
},
],
},
};
sassOptions
Type:
type sassOptions =
| import("sass").StringOptionsWithImporter<"async">
| ((
content: string | Buffer,
loaderContext: LoaderContext,
meta: any,
) => import("sass").StringOptionsWithImporter<"async">);
Default: defaults values for Sass implementation
Options for Dart Sass or Sass Embedded implementation.
[!NOTE]
The
charsetoption istrueby default fordart-sass. We strongly discourage setting this tofalsebecause webpack doesn't support files other thanutf-8.
[!NOTE]
The
syntaxoption isscssfor thescssextension,indentedfor thesassextension, andcssfor thecssextension.
[!NOTE]
Options such as
dataandurlare unavailable and will be ignored.
ℹ We strongly discourage changing the
sourceMapoption becausesass-loadersets it automatically when thesourceMapoption istrue.
Please consult their respective documentation before using them:
- Dart Sass documentation for all available
sassoptions. - Sass Embedded documentation for all available
sass-embeddedoptions.
object
Use an object for the Sass implementation setup.
webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.s[ac]ss$/i,
use: [
"style-loader",
"css-loader",
{
loader: "sass-loader",
options: {
sassOptions: {
style: "compressed",
loadPaths: ["absolute/path/a", "absolute/path/b"],
},
},
},
],
},
],
},
};
function
Allows configuring the Sass implementation with different options based on the loader context.
module.exports = {
module: {
rules: [
{
test: /\.s[ac]ss$/i,
use: [
"style-loader",
"css-loader",
{
loader: "sass-loader",
options: {
sassOptions: (loaderContext) => {
// More information about available properties https://webpack.js.org/api/loaders/
const { resourcePath, rootContext } = loaderContext;
const relativePath = path.relative(rootContext, resourcePath);
if (relativePath === "styles/foo.scss") {
return {
loadPaths: ["absolute/path/c", "absolute/path/d"],
};
}
return {
loadPaths: ["absolute/path/a", "absolute/path/b"],
};
},
},
},
],
},
],
},
};
sourceMap
Type:
type sourceMap = boolean;
Default: depends on the compiler.devtool value
Enables/disables generation of source maps.
By default generation of source maps depends on the devtool option.
All values enable source map generation except eval and false.
ℹ If
true, thesourceMapoption fromsassOptionswill be ignored.
webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.s[ac]ss$/i,
use: [
"style-loader",
{
loader: "css-loader",
options: {
sourceMap: true,
},
},
{
loader: "sass-loader",
options: {
sourceMap: true,
},
},
],
},
],
},
};
webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.s[ac]ss$/i,
use: [
"style-loader",
"css-loader",
{
loader: "sass-loader",
options: {
sourceMap: true,
sassOptions: {
style: "compressed",
},
},
},
],
},
],
},
};
additionalData
Type:
type additionalData =
| string
| ((content: string | Buffer, loaderContext: LoaderContext) => string);
Default: undefined
Prepends Sass/SCSS code before the actual entry file.
In this case, the sass-loader will not override the data option but just prepend the entry's content.
This is especially useful when some of your Sass variables depend on the environment:
string
module.exports = {
module: {
rules: [
{
test: /\.s[ac]ss$/i,
use: [
"style-loader",
"css-loader",
{
loader: "sass-loader",
options: {
additionalData: `$env: ${process.env.NODE_ENV};`,
},
},
],
},
],
},
};
function
Sync
module.exports = {
module: {
rules: [
{
test: /\.s[ac]ss$/i,
use: [
"style-loader",
"css-loader",
{
loader: "sass-loader",
options: {
additionalData: (content, loaderContext) => {
// More information about available properties https://webpack.js.org/api/loaders/
const { resourcePath, rootContext } = loaderContext;
const relativePath = path.relative(rootContext, resourcePath);
if (relativePath === "styles/foo.scss") {
return `$value: 100px;${content}`;
}
return `$value: 200px;${content}`;
},
},
},
],
},
],
},
};
Async
module.exports = {
module: {
rules: [
{
test: /\.s[ac]ss$/i,
use: [
"style-loader",
"css-loader",
{
loader: "sass-loader",
options: {
additionalData: async (content, loaderContext) => {
// More information about available properties https://webpack.js.org/api/loaders/
const { resourcePath, rootContext } = loaderContext;
const relativePath = path.relative(rootContext, resourcePath);
if (relativePath === "styles/foo.scss") {
return `$value: 100px;${content}`;
}
return `$value: 200px;${content}`;
},
},
},
],
},
],
},
};
webpackImporter
Type:
type webpackImporter = boolean;
Default: true
Enables/disables the default webpack importer.
This can improve performance in some cases, though use it with caution because aliases and @import at-rules starting with ~ will not work.
You can pass your own importer to solve this (see Sass importer documentation).
webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.s[ac]ss$/i,
use: [
"style-loader",
"css-loader",
{
loader: "sass-loader",
options: {
webpackImporter: false,
},
},
],
},
],
},
};
warnRuleAsWarning
Type:
type warnRuleAsWarning = boolean;
Default: true
Treats the @warn rule as a webpack warning.
style.scss
$known-prefixes: webkit, moz, ms, o;
@mixin prefix($property, $value, $prefixes) {
@each $prefix in $prefixes {
@if not index($known-prefixes, $prefix) {
@warn "Unknown prefix #{$prefix}.";
}
-#{$prefix}-#{$property}: $value;
}
#{$property}: $value;
}
.tilt {
// Oops, we typo'd "webkit" as "wekbit"!
@include prefix(transform, rotate(15deg), wekbit ms);
}
The presented code will throw a webpack warning instead of logging.
To ignore unnecessary warnings you can use the ignoreWarnings option.
webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.s[ac]ss$/i,
use: [
"style-loader",
"css-loader",
{
loader: "sass-loader",
options: {
warnRuleAsWarning: true,
},
},
],
},
],
},
};
api
Type:
type api = "auto" | "modern" | "modern-compiler";
Default: "auto" for sass (dart-sass) and sass-embedded
Allows you to switch between the modern and modern-compiler APIs. You can find more information here. The modern-compiler option enables the modern API with support for Shared Resources.
When "auto" is used, the loader picks "modern-compiler" whenever the implementation exposes initAsyncCompiler (i.e. recent versions of sass and sass-embedded) and falls back to "modern" otherwise. Combined with sass-embedded, this yields the best build performance out of the box.
[!NOTE]
Using
modern-compilerandsass-embeddedtogether significantly improves performance and decreases build time. They are now selected automatically by the default"auto"API.
[!NOTE]
The legacy Sass JS API is no longer supported. If you were using
api: "legacy", please migrate to the modern API. See the Sass JS API docs to learn how to migrate.
webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.s[ac]ss$/i,
use: [
"style-loader",
"css-loader",
{
loader: "sass-loader",
options: {
api: "modern-compiler",
sassOptions: {
// Your sass options
},
},
},
],
},
],
},
};
How to enable @debug output
By default, the output of @debug messages is disabled.
Add the following to webpack.config.js to enable them:
module.exports = {
stats: {
loggingDebug: ["sass-loader"],
},
// ...
};
Examples
Extracts CSS into separate files
For production builds, it's recommended to extract the CSS from your bundle to enable parallel loading of CSS/JS resources.
There are four recommended ways to extract a stylesheet from a bundle:
1. mini-css-extract-plugin
webpack.config.js
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
module.exports = {
module: {
rules: [
{
test: /\.s[ac]ss$/i,
use: [
// fallback to style-loader in development
process.env.NODE_ENV !== "production"
? "style-loader"
: MiniCssExtractPlugin.loader,
"css-loader",
"sass-loader",
],
},
],
},
plugins: [
new MiniCssExtractPlugin({
// Options similar to the same options in webpackOptions.output
// both options are optional
filename: "[name].css",
chunkFilename: "[id].css",
}),
],
};
2. Asset Modules
webpack.config.js
const path = require("node:path");
module.exports = {
entry: [path.resolve(__dirname, "./src/scss/app.scss")],
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: [],
},
{
test: /\.scss$/,
exclude: /node_modules/,
type: "asset/resource",
generator: {
filename: "bundle.css",
},
use: ["sass-loader"],
},
],
},
};
3. extract-loader (simpler, but specialized on the css-loader's output)
4. file-loader (deprecated--should only be used in webpack v4)
webpack.config.js
const path = require("node:path");
module.exports = {
entry: [path.resolve(__dirname, "./src/scss/app.scss")],
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: [],
},
{
test: /\.scss$/,
exclude: /node_modules/,
use: [
{
loader: "file-loader",
options: { outputPath: "css/", name: "[name].min.css" },
},
"sass-loader",
],
},
],
},
};
(source: https://stackoverflow.com/a/60029923/2969615)
Source maps
Enables/disables generation of source maps.
To enable CSS source maps, you'll need to pass the sourceMap option to both the sass-loader and the css-loader.
webpack.config.js
module.exports = {
devtool: "source-map", // any "source-map"-like devtool is possible
module: {
rules: [
{
test: /\.s[ac]ss$/i,
use: [
"style-loader",
{
loader: "css-loader",
options: {
sourceMap: true,
},
},
{
loader: "sass-loader",
options: {
sourceMap: true,
},
},
],
},
],
},
};
If you want to edit the original Sass files inside Chrome, there's a good blog post. Checkout test/sourceMap for a working example.
Contributing
We welcome all contributions! If you're new here, please take a moment to review our contributing guidelines before submitting issues or pull requests.
CONTRIBUTING
License
MIT
Related repositories
The most popular HTML, CSS, and JavaScript framework for developing responsive, mobile first projects on the web.
Storybook is the industry standard workshop for building, documenting, and testing UI components in isolation
:tada: A magical vue admin https://panjiachen.github.io/vue-element-admin
A bundler for javascript and friends. Packs many modules into a few bundled assets. Code Splitting allows for loading parts of the application on demand. Through "loaders", modules can be CommonJs, AMD, ES6 modules, CSS, Images, JSON, Coffeescript, LESS, ... and your custom stuff.
Quick answers
Does webpack/sass-loader have a project website?
No homepage URL was recorded for webpack/sass-loader in TopGit's last sync. The README tab above frequently contains screenshots and demo links, or check the repository description on GitHub.
Is webpack/sass-loader open source?
Yes — webpack/sass-loader ships under the MIT license, which makes its source code freely readable (and, depending on license terms, forkable and reusable). Source: github.com/webpack/sass-loader.
What else is in the Frontend space?
webpack/sass-loader is tracked by TopGit under the Frontend category, alongside 7 GitHub-tagged topics. Trending and Topics pages list peer repositories of comparable stars and language.
What is webpack/sass-loader?
webpack/sass-loader (webpack/sass-loader) is a JavaScript project on GitHub. From the project's own README: Compiles Sass to CSS
What license does webpack/sass-loader use?
webpack/sass-loader is released under the MIT license. Always verify the LICENSE file directly on GitHub for the authoritative terms — license strings can be edited out of sync with a project's actual stance.
Where do I read more about webpack/sass-loader?
This TopGit page is a snapshot — the READ ME tab shows the project's own README content (links stripped, images preserved). The GitHub repository at github.com/webpack/sass-loader is the definitive source.
Why is webpack/sass-loader categorized under Frontend?
TopGit places webpack/sass-loader in the Frontend category based on its GitHub topics and description (tagged: "dart-sass", "loader", "node-sass"). Categories are assigned from real repository metadata, not editorial guesswork.
Read full README in the tab above.