はじめに
sass-loader
を使っているものの entry
や output
にjsが指定されている記事があったり、
loaderの指定方法が変わっていたりして、よくわからなかったので理解のため自分の記事を書きます。
また、SCSSで background-image
を扱おうとした際に、
webpackのビルドで扱けてしまったので、その解決策も書く。
Webpack2でsassをビルドする
参考にしたページ: http://qiita.com/nicchi__1985/items/e30e73de6d8443909537
SCSSをWebpackでビルドするのに必要なパッケージたち
{
~略~
"devDependencies": {
"css-loader": "^0.26.1",
"extract-text-webpack-plugin": "2.0.0-rc.3",
"node-sass": "^4.5.0",
"sass-loader": "^5.0.1",
"style-loader": "^0.13.1",
"webpack": "^2.2.1"
},
~略~
}
extract-text-webpack-plugin
は、jsではなくcssとして出力するプラグインという認識。
Webpack2でビルドしてエラーが出た際に、調べていたらRC版を使えばいいよというIssueを見つけたので使用しています。
Webpack1 と Webpack2 の記述で混乱したところ
-
module.loaders.loader
ではなくmodule.rules.use
を使う -
loader: 'style!css!sass'
やloader: 'style-loader!css-loader!sass-loader'
ではなくuse: ['sass-loader', 'css-loader', 'sass-loader']
を使う
参考にしたページ(公式): https://webpack.js.org/guides/migrating/
ファイル構成
$ tree
.
├── index.html
├── package.json
├── scss
│ ├── app.scss
│ └── _body.scss
└── webpack.config.js
scss/app.scss
@import '_body';
scss/_body.scss
body {
color: #ffffff;
background-color: #000000;
}
webpack.config.js
var ExtractTextPlugin = require('extract-text-webpack-plugin');
module.exports = {
entry: './scss/app.scss',
output: {
filename: 'bundle.css'
},
module: {
rules: [
{
test: /\.scss$/,
use: ExtractTextPlugin.extract(
{
fallback: "style-loader",
use: ["css-loader", "sass-loader?outputStyle=expanded"]
}
)
}
]
},
plugins: [
new ExtractTextPlugin('bundle.css')
]
};
エントリポイント: scss/app.scss
を指定
アウトプットに: bundle.css
を指定
ビルド
$ webpack
これで bundle.css
が出力されます。
index.html
で bundle.css
を読み込めばバンドルされたCSSがそのまま使えます。
Webpack2 + sass で画像ファイルを扱う
background-image: url(../res/background.png);
を指定したかったのだが、
Webpackがエラーになってしまって上手くいかなかったときに調べたこと
必要なパッケージ
{
~略~
"devDependencies": {
"css-loader": "^0.26.1",
"extract-text-webpack-plugin": "2.0.0-rc.3",
+ "file-loader": "^0.10.0",
"node-sass": "^4.5.0",
"sass-loader": "^5.0.1",
"style-loader": "^0.13.1",
"webpack": "^2.2.1"
},
~略~
}
url-loader
または file-loder
が必要と書かれているページがありました。
参考にしたページ: http://a0sy.hatenablog.jp/entry/2015/08/03/204933
url-loader
を使用すると BASE64エンコード されてしまうという記述があったので、
file-loader
を使って試してみることにしました。
ファイル構成
$ tree
.
├── index.html
├── package.json
+├── res
+│ └── background.png
├── scss
│ ├── app.scss
│ └── _body.scss
└── webpack.config.js
scss/_body.scss
body {
- color: #ffffff;
- background-color: #000000;
+ color: #000000;
+ background-image: url(../res/background.png);
}
ここで指定するパスは、
webpack.config.js
のエントリポイントになっているファイルからのパスのようです。
webpack.config.js
var ExtractTextPlugin = require('extract-text-webpack-plugin');
module.exports = {
entry: './scss/app.scss',
output: {
filename: 'bundle.css'
},
module: {
rules: [
{
test: /\.scss$/,
use: ExtractTextPlugin.extract(
{
fallback: "style-loader",
use: ["css-loader", "sass-loader?outputStyle=expanded"]
}
)
- }
+ }, {
+ test: /\.(jpg|png)$/,
+ use: 'file-loader?name=assets/[name].[ext]'
+ }
]
},
plugins: [
new ExtractTextPlugin('bundle.css')
]
};
SCSS内で指定されたパス ../res/background.png
が assets/[name].[ext]
として出力されます。
※res内のファイルを直接参照するのではなく bundle.js
や bundle.css
のように、別のファイルとして出力されるようです。
つまり今回のケースでは assets/
も .gitignore
に追加しておく必要がある。