【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の書き方についてはこちら
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
ではなくsass
とsass-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-loader
をcss-loader
の下に配置します。
ビルドして反映されていればOKです。
まとめ
loaderで設定するuse
では、下から順に処理されるという事が重要です。順番を間違えるとエラーとなるので注意しましょう。
