Sass/SCSSファイルをロードし、CSSにコンパイルします。
まず、sass-loader
をインストールする必要があります。
npm install sass-loader sass webpack --save-dev
または
yarn add -D sass-loader sass webpack
または
pnpm add -D sass-loader sass webpack
sass-loader
を使用するには、Dart Sass、Node Sassのいずれかを自分でインストールする必要があります(詳細については以下を参照)、またはSass Embeddedをインストールする必要があります。
これにより、すべての依存関係のバージョンを制御し、使用するSassの実装を選択できます。
注
Dart Sassを使用することを強くお勧めします。
警告
警告
Sass Embeddedは実験段階であり、
beta
版であるため、一部の機能が動作しない場合があります
sass-loader
をcss-loaderおよびstyle-loaderと連鎖させて、すべてのスタイルをDOMにすぐに適用するか、mini-css-extract-pluginを使用して個別のファイルに抽出します。
次に、ローダーをWebpack構成に追加します。例えば
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",
],
},
],
},
};
最後に、ご希望の方法でwebpack
を実行します。
production
モードでのoutputStyle
(古いAPI) とstyle
(新しいAPI) オプションproduction
モードでは、outputStyle
(古いAPI) と style
(新しいAPI) オプションは、sassOptions
で特に指定されていない限り、デフォルトでcompressed
になります。
import
at-rules の解決Webpackは、ファイルを解決するための高度なメカニズムを提供します。
sass-loader
は、Sassのカスタムインポーター機能を使用して、すべてのクエリをWebpack解決エンジンに渡します。したがって、node_modules
からSassモジュールをインポートできます。
@import "bootstrap";
~
の使用は非推奨であり、コードから削除できます (推奨) が、歴史的な理由から依然としてサポートしています。なぜ削除できるのでしょうか? ローダーはまず、@import
を相対パスとして解決しようとします。解決できない場合、ローダーはnode_modules
内で@import
を解決しようとします。
モジュールパスに~
を付加すると、webpackにnode_modules
を検索するように指示します。
@import "~bootstrap";
~/
はホームディレクトリに解決されるため、~
のみを前に付けることが重要です。CSSファイルとSassファイルには相対ファイルをインポートするための特別な構文がないため、Webpackはbootstrap
と~bootstrap
を区別する必要があります。@import "style.scss"
と記述するのは@import "./style.scss";
と同じです。
url(...)
に関する問題点Sassの実装ではURLの書き換えが提供されていないため、リンクされたアセットはすべて出力に対して相対的である必要があります。
css-loader
に渡す場合、すべてのURLはエントリファイル(例:main.scss
)に対して相対的である必要があります。css-loader
に渡さずにCSSを生成するだけの場合は、Webルートに対して相対的である必要があります。最初の問題によって混乱が生じるでしょう。相対参照は、指定された.sass
/.scss
ファイルに対して解決されると予想するのが自然です(通常の.css
ファイルのように)。
幸いなことに、この問題には2つの解決策があります。
sass-loader
の前に配置します。$icon-font-path
があります。implementation
型
type implementation = object | string;
デフォルト: sass
特別なimplementation
オプションは、使用するSassの実装を決定します。
デフォルトでは、ローダーは依存関係に基づいて実装を解決します。必要な実装をpackage.json
(sass
またはnode-sass
パッケージ)に追加し、依存関係をインストールするだけです。
sass-loader
ローダーがsass
(dart-sass
)実装を使用する例
package.json
{
"devDependencies": {
"sass-loader": "^7.2.0",
"sass": "^1.22.10"
}
}
sass-loader
ローダーがnode-sass
実装を使用する例
package.json
{
"devDependencies": {
"sass-loader": "^7.2.0",
"node-sass": "^5.0.0"
}
}
node-sass
とsass
の両方がインストールされている場合に注意してください!デフォルトでは、sass-loader
はsass
を優先します。この状況を回避するために、implementation
オプションを使用できます。
implementation
オプションは、モジュールとしてsass
(Dart Sass
)またはnode-sass
を受け入れます。
object
たとえば、Dart Sassを使用するには、次のように渡します。
module.exports = {
module: {
rules: [
{
test: /\.s[ac]ss$/i,
use: [
"style-loader",
"css-loader",
{
loader: "sass-loader",
options: {
// Prefer `dart-sass`
implementation: require("sass"),
},
},
],
},
],
},
};
string
たとえば、Dart Sassを使用するには、次のように渡します。
module.exports = {
module: {
rules: [
{
test: /\.s[ac]ss$/i,
use: [
"style-loader",
"css-loader",
{
loader: "sass-loader",
options: {
// Prefer `dart-sass`
implementation: require.resolve("sass"),
},
},
],
},
],
},
};
sassOptions
型
type sassOptions =
| import("sass").LegacyOptions<"async">
| ((
content: string | Buffer,
loaderContext: LoaderContext,
meta: any,
) => import("sass").LegacyOptions<"async">);
デフォルト: Sass実装のデフォルト値
Dart SassまたはNode Sass実装のオプションです。
注
charset
オプションは、dart-sass
ではデフォルトでtrue
の値を持っています。webpackはutf-8
以外のファイルをサポートしていないため、値をfalse
に変更することは強く推奨しません。
注
indentedSyntax
オプションは、sass
拡張子に対してtrue
の値を持っています。
注
data
やfile
などのオプションは利用できず、無視されます。
ℹ
outFile
、sourceMapContents
、sourceMapEmbed
、sourceMapRoot
オプションの変更は強く推奨しません。sourceMap
オプションがtrue
の場合、sass-loader
がこれらのオプションを自動的に設定するためです。
注
カスタムインポーター内のローダーコンテキストへのアクセスは、
this.webpackLoaderContext
プロパティを使用して行うことができます。
sass
(dart-sass
)とnode-sass
のオプションにはわずかな違いがあります。
使用する前にドキュメントを参照してください
sass
オプションについてはDart Sassドキュメントを参照してください。node-sass
オプションについてはNode Sassドキュメントを参照してください。object
Sass実装のセットアップにはオブジェクトを使用します。
webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.s[ac]ss$/i,
use: [
"style-loader",
"css-loader",
{
loader: "sass-loader",
options: {
sassOptions: {
indentWidth: 4,
includePaths: ["absolute/path/a", "absolute/path/b"],
},
},
},
],
},
],
},
};
function
ローダーコンテキストに基づいて異なるオプションを設定することにより、Sass実装をセットアップできます。
module.exports = {
module: {
rules: [
{
test: /\.s[ac]ss$/i,
use: [
"style-loader",
"css-loader",
{
loader: "sass-loader",
options: {
sassOptions: (content, loaderContext) => {
// More information about available properties https://webpack.dokyumento.jp/api/loaders/
const { resourcePath, rootContext } = loaderContext;
const relativePath = path.relative(rootContext, resourcePath);
if (relativePath === "styles/foo.scss") {
return {
includePaths: ["absolute/path/c", "absolute/path/d"],
};
}
return {
includePaths: ["absolute/path/a", "absolute/path/b"],
};
},
},
},
],
},
],
},
};
sourceMap
型
type sourceMap = boolean;
デフォルト: compiler.devtool
の値に依存します
ソースマップの生成を有効/無効にします。
デフォルトでは、ソースマップの生成はdevtool
オプションに依存します。eval
およびfalse
値を除くすべての値でソースマップの生成が有効になります。
ℹ
true
の場合、sassOptions
のsourceMap
、sourceMapRoot
、sourceMapEmbed
、sourceMapContents
、omitSourceMapUrl
は無視されます。
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,
},
},
],
},
],
},
};
ℹ まれに、
node-sass
が無効なソースマップを出力する場合があります(これはnode-sass
のバグです)。
これを回避するために、
node-sass
を最新バージョンに更新するか、sassOptions
内でoutputStyle
オプションをcompressed
に設定してみてください。
webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.s[ac]ss$/i,
use: [
"style-loader",
"css-loader",
{
loader: "sass-loader",
options: {
sourceMap: true,
sassOptions: {
outputStyle: "compressed",
},
},
},
],
},
],
},
};
additionalData
型
type additionalData =
| string
| ((content: string | Buffer, loaderContext: LoaderContext) => string);
デフォルト: undefined
実際のエントリファイルの前にSass
/SCSS
コードをプリペンドします。この場合、sass-loader
はdata
オプションをオーバーライドするのではなく、エントリのコンテンツをプリペンドするだけです。
これは、Sass変数のいくつかが環境に依存している場合に特に便利です。
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
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.dokyumento.jp/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;
},
},
},
],
},
],
},
};
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.dokyumento.jp/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 webpackImporter = boolean;
デフォルト: true
デフォルトのWebpackインポーターを有効/無効にします。
これにより、場合によってはパフォーマンスが向上する可能性があります。エイリアスと~
で始まる@import
アットルールが機能しなくなるため、注意して使用してください。これを解決するために独自のimporter
を渡すことができます(importer docs
を参照)。
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 warnRuleAsWarning = boolean;
デフォルト: true
@warn
ルールをWebpackの警告として扱います。
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);
}
提示されたコードは、ログではなくwebpackの警告をスローします。
不要な警告を無視するには、ignoreWarningsオプションを使用できます。
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 api = "legacy" | "modern";
デフォルト: "legacy"
legacy
とmodern
APIを切り替えることができます。詳細についてはこちらを参照してください。
警告
「modern」APIは実験的であるため、一部の機能が動作しない場合があります(既知:組み込みの
importer
が機能せず、エラーのあるファイルが最初の実行時に監視されません)。こちらに従うことができます。
警告
sassオプションは、
modern
およびold
APIで異なります。新しいオプションへの移行方法についてはドキュメントを参照してください。
webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.s[ac]ss$/i,
use: [
"style-loader",
"css-loader",
{
loader: "sass-loader",
options: {
api: "modern",
sassOptions: {
// Your sass options
},
},
},
],
},
],
},
};
@debug
出力を有効にする方法デフォルトでは、@debug
メッセージの出力は無効になっています。有効にするには、webpack.config.jsに以下を追加します。
module.exports = {
stats: {
loggingDebug: ["sass-loader"],
},
// ...
};
プロダクションビルドの場合、CSS/JSリソースの並列ロードを後で使用できるように、バンドルからCSSを抽出することをお勧めします。
バンドルからスタイルシートを抽出するには、4つの可能性があります。
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",
}),
],
};
webpack.config.js
module.exports = {
entry: [__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"],
},
],
},
};
webpack.config.js
module.exports = {
entry: [__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",
],
},
],
},
};
(出典:https://stackoverflow.com/a/60029923/2969615)
ソースマップの生成を有効/無効にします。
CSSソースマップを有効にするには、sass-loader
とcss-loaderにsourceMap
オプションを渡す必要があります。
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,
},
},
],
},
],
},
};
Chrome内で元のSassファイルを編集したい場合は、優れたブログ記事があります。test/sourceMapで実行例を確認してください。
まだ読んでいない場合は、貢献ガイドラインをお読みください。