【webpack】 loaderを使って様々なファイルをビルドする (基本編)

Webpackは、Javascriptだけでなく、scssやsassなどをモジュールとしてバンドルするなど、様々なビルドが可能です。ここではよく利用するものを紹介します。

loader

それぞれをビルドするには、loaderが必要になることが多いです。各loaderはnpm経由で導入します。

CSS

cssのビルドを紹介します。ビルドをするファイルを作成しましょう。

/* app.css */

#app p {
    font-size: 24px;
    color: #ff0000;
}
project/
├ dist/
│ ├ js/
│ └ index.html
├ src/
│ ├ css/
│ │ └ app.css   <-- ここ
│ └ index.js
├ webpack.config.js
├ package-lock.json
└ package.json

このままでは配置しただけでビルド対象になりません。スクリプトの依存関係に置くことでビルドされます。

import "./css/app.css";

Javascriptからimport文で読み込むことで依存関係に含むことができます。これで./css/app.cssがビルド対象に含まれるようになります。

cssファイルとして別で出力する方法もありますが、あまり使わないのでここでは省略します。

mini-css-extract-pluginなどを用います。

早速ビルドといきたいのですが、このままではできないのでloaderを導入します。

npm i css-loader style-loader

css-loaderは、jsファイル内で読み込んだcssを文字列としてjsでよしなにするためのものです。

style-loaderは、js内に読み込んだcssの文字列を、HTMLに反映できるようにするものです。

次に、それらのローダーを使うために設定を記述します。

const src = "/src/";
const dist = "/dist/assets";

module.exports = {
    entry: {
        main: src + "index.js",
    },
    output: {
        filename: "[name].bundle.js",
        path: __dirname + dist,
    },
    module: {
        rules: [
            {
                test: /\.css/,
                use: [
                    "style-loader",
                    "css-loader",
                ],
            },
        ],
    },
}

rulesの中に沢山増えましたね。細かい紹介は別の章で行いますが、ここでは、testにはそのルールを適用するファイルのパターンを、useには利用するローダーを指定します。

useするローダーは下から処理されます。cssファイルをjsに読む->読んだものを反映する、という流れが必要なので、cssファイルをjsに読むを先に処理するためにstyle-loaderの下にcss-loaderを配置します。

これで準備が完了しました. 早速npm run devしてエラーなく終わればOKです。実際にブラウザでページを開いてみましょう!

ここで、HTMLからCSSを読む必要はありません。Javascriptで処理してくれるので、jsだけ読み込めばokです。

npm run watchしている場合、webpack.config.jsを書き換えても反映されないのでwatchし直してください。

SCSS

cssでは量が増えてくると階層構造の管理が面倒になるので、scssやsassなどを利用することが多いですね。ここでは、私の好みでscssをビルドしてみます。

/* app.scss */

#app {
    p {
        font-size: 24px;
        color: #0000ff;
    }
}

jsで読み込むファイルもscssを指定します。

import "./css/app.scss";

この例でのファイル構造はこのようになっています。

project/
├ dist/
│ ├ js/
│ └ index.html
├ src/
│ ├ css/
│ │ └ app.scss
│ └ index.js
├ webpack.config.js
├ package-lock.json
└ package.json

次に、ビルドするためのloaderを追加します。

npm i css-loader style-loader sass sass-loader

scssをビルドするのに必要なのはscssではなくsasssass-loaderです。これは、scssはSass記法の1つであるためです。

そして、loaderを利用するためのruleを記述します。

const src = "/src/";
const dist = "/dist/assets";

module.exports = {
    entry: {
        main: src + "index.js",
    },
    output: {
        filename: "[name].bundle.js",
        path: __dirname + dist,
    },
    module: {
        rules: [
            {
                test: /\.scss/,
                use: [
                    "style-loader",
                    "css-loader",
                    "sass-loader",
                ],
            },
        ],
    },
}

testには.scssを、useにはscssをcssにするためのscss-loadercss-loaderの下に配置します。

ビルドして反映されていればOKです。

まとめ

loaderで設定するuseでは、下から順に処理されるという事が重要です。順番を間違えるとエラーとなるので注意しましょう。

loader basic thumb

役に立ったらシェアしよう!