【Webpack】SCSSをCSSにコンパイルする

パッケージインストール&Webpack設定

SCSSをCSSにコンパイルする必要最低限の設定は以下のとおりです。※html-webpack-pluginは、自動でインジェクトさせるためインストールしています。

npm i -D sass sass-loader css-loader style-loader html-webpack-plugin
Bash
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
    mode: 'development',
    output: {
        path: path.resolve(__dirname, 'dist')
    },
    module: {
        rules: [
            {
                test: /\.(sa|sc|c)ss$/,
                use: [
                    'style-loader',
                    'css-loader',
                    'sass-loader',
                ]
            }
        ]
    },
    plugins: [
        new HtmlWebpackPlugin({
            inject: 'body',
            filename: 'index.html',
            template: './src/index.html'
        })
    ]
}
webpack.config.js

CSSを別ファイルに分離させる

先程の設定では、スタイルがhtmlのheadタグ内にインジェクトされましたが、殆どの場合CSSは別ファイルとして管理したいことが多いでしょう。

この場合は、style-loader→mini-css-extract-pluginに変更します。

npm i -D mini-css-extract-plugin
Bash
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');

module.exports = {
    mode: 'development',
    output: {
        path: path.resolve(__dirname, 'dist')
    },
    module: {
        rules: [
            {
                test: /\.(sa|sc|c)ss$/,
                use: [
                    MiniCssExtractPlugin.loader,
                    'css-loader',
                    'sass-loader',
                ]
            }
        ]
    },
    plugins: [
        new MiniCssExtractPlugin({
            filename: './css/style.css'
        }),
        new HtmlWebpackPlugin({
            inject: 'body',
            filename: 'index.html',
            template: './src/index.html'
        })
    ]
}
webpack.config.js

ベンダープレフィックスを自動で付与させる

ベンダープレフィックスを自動で付与させるには、以下のパッケージをインストールします。

npm i -D postcss-loader autoprefixer
Bash
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');

module.exports = {
    mode: 'development',
    output: {
        path: path.resolve(__dirname, 'dist')
    },
    module: {
        rules: [
            {
                test: /\.(sa|sc|c)ss$/,
                use: [
                    MiniCssExtractPlugin.loader,
                    'css-loader',
                    'postcss-loader',
                    'sass-loader',
                ]
            }
        ]
    },
    plugins: [
        new MiniCssExtractPlugin({
            filename: './css/style.css'
        }),
        new HtmlWebpackPlugin({
            inject: 'body',
            filename: 'index.html',
            template: './src/index.html'
        })
    ]
}
webpack.config.js
module.exports = {
    plugins: [
        require('autoprefixer')({grid: true})
    ]
}
postcss.config.js

ベンダープレフィックスが付与されているか確認するには、.browserslistrcファイルに「> 0%」と設定し対象を全てのブラウザにします。そしてCSSでflexやgridなどを使い、出力されたファイルにベンダープレフィックスが付与されているか確認します。

> 0%
.browserslistrc

【注意点】背景画像を使う

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');

module.exports = {
    mode: 'development',
    output: {
        path: path.resolve(__dirname, 'dist')
    },
    module: {
        rules: [
            {
                test: /\.(sa|sc|c)ss$/,
                use: [
                    MiniCssExtractPlugin.loader,
                    'css-loader',
                    'postcss-loader',
                    'sass-loader',
                ]
            }
        ]
    },
    plugins: [
        new MiniCssExtractPlugin({
            filename: './css/style.css'
        }),
        new HtmlWebpackPlugin({
            inject: 'body',
            filename: 'index.html',
            template: './src/index.html'
        })
    ],
    resolve: {
        alias: {
          '@': path.resolve(__dirname, 'src/images'),
        },
    },
}
webpack.config.js
.hero {
    background-image: url("@/sample.png");
}
.browserslistrc