目次
css-loader、style-loader、sass-loaderを使わないでSassをnpmでコマンドからコンパイルするものがシンプルでいいなと思ってましたがwebpackのloaderを使うものも作ってみた。
SassのコンパイルやらCSSをrequireしないと?と思ってたけどプラグインを使えばできた。
必要なものあるかどうか確認
1 | node -v |
まずはお決まりのNode.js入ってるか確認。
1 | npm -v |
npm(Node.jsのパッケージマネージャー)も入ってるか確認。
1 | webpack -v |
webpackも入っているか確認。
もし入ってなかったら
1 | npm install -g webpack |
-gオプションはGlobalオプションのこと。
ファイル・フォルダ構成
1 | git clone https://github.com/shigekitakeguchi/npm-webpack-sass-loader.git |
https://github.com/shigekitakeguchi/npm-webpack-sass-loader
GitHubから落として使ってください。
カスタマイズなりなんなりして。
1 | cd npm-webpack-sass |
落としたフォルダ内に移動する。
1 | ├── LICENSE |
ファイル・フォルダ構成はこんな感じ。README.mdやLICENSEは開発するには不要。
1 | npm install |
これで必要なパッケージがインストールされるはず。
package.json
1 | { |
中身はこんな感じ。
パッケージの説明
落としてきたpackage.jsonからインストールすればいいんですがそれぞれのパッケージの説明を。
1 | npm install --save-dev concurrently |
https://github.com/kimmobrunfeldt/concurrently
concurrentlyは複数のコマンド実行できるようにするため。具体的に何をしているかは後ほど説明。
1 | npm install --save-dev lite-server |
https://github.com/johnpapa/lite-server
webpackにもwebpack dev serverというのがあるみたいだけどlite-serverのがシンプルで良さそうなので使ってみた。
ただし設定ファイルは必要でした。
1 | npm install --save-dev css-loader |
webpack的な使い方であるJavaScriptファイルにCSSをロードしたりしないけどCSSを扱うなら必要らしいのでインストール。またCSSを最適化(minimize)はこのパッケージの機能を利用。
1 | npm install --save-dev style-loader |
こちらもCSSを扱うためにインストール。css-loaderとあわせて使うことが推奨されているみたい。
1 | npm install --save-dev sass-loader |
Sassのコンパイルには必要らしいのでインストール。
1 | npm install --save-dev extract-text-webpack-plugin |
webpackは本来、JavaScirptのファイルの中にCSSを読みこんで使うようになっているけどこのプラグインを使うと読み込まずに使うことが可能になる(後述)。
1 | npm install --save-dev webpack |
https://github.com/webpack/webpack
webpack。もうすでに何をするツールなのか説明しがたいくらい機能がある。
静的なファイル(JavaScript系、CSS系、画像ファイル)の依存関係を解決するためのビルドツールってことなんだけど、ここでははJavaScriptだけを扱うようにしている。
package.jsonの中のscriptsで何をしているか
1 | "scripts": { |
1 | npm start |
このコマンドでlite-serverを立ち上げwebpackでwatchを行う。
1 | "start": "concurrently \"npm run lite\" \"npm run webpack\"" |
scriptsの中にあるstartがこれにあたる。
1 | npm run lite |
1 | npm run webpack |
これらのコマンドはそれぞれ独立したコマンドですが、最初にちょっと触れたがconcurrentlyにダブルクオーテーションでくくってスペースで区切って引数で渡せば並行して実行することになる。便利。
1 | "webpack": "webpack -w", |
これはwebpackのwatch(監視)を走らせている。こちらも後ほど触れるがwebpack.config.jsonで記述されたことをもとに監視している。
1 | "lite": "lite-server", |
lite-serverを立ち上げている。bs-config.jsonに設定ないようを記述している(こちらも後ほど触れる)。
bs-config.json
1 | { |
lite-serverの設定はドキュメントルートをappの直下にしたかったのと監視対象のファイル(html、css、js)が変更されたらリロードしてinjectChangesというBrowsersyncを動すため。
webpack.config.json
1 | var webpack = require("webpack"); |
webpackの設定は複数のモジュール機能(この場合はJavaScriptとSass)なので以下のように配列で持たせるようになっている。
1 | module.exports = [{},{}] |
ひとつのモジュールだとこんな感じ。オブジェクトがひとつだけでいい。
1 | module.exports = {} |
entryにもとファイルJavaScriptは./src/scripts/app.js、CSS(Sass)は./src/scss/app.scssですね。それぞれ/app内のscriptsとstylesに出力している。
JavaScriptはwebpackのUglifyJsPluginで圧縮している。
CSS(Sass)の場合はExtractTextPluginで普通のCSSファイルに出力している。
1 | module: { |
最適化(minimize)しない場合はこのように記述することでSassファイルがコンパイルされつつoutputで指定した場所とファイル名(/app/styles/style.css)で出力される。
1 | module: { |
minimizeしたい場合はこのようにcss-loaderにminimizeオプションを引き数で渡す。
まだwebpackをはじめて数日とかという状態なので間違えや指摘をいただけると助かります。