webpackで画像ファイルをバンドルする方法は2つあります。
url-loaderを使うことで、画像ファイルをDataUrl化して、.jsファイルの一部として取り込めます。
インストール
$ npm install --save-dev webpack webpack-cli url-loader
webpack.config.jsの設定
<!-- webpack.config.js -->
module.exports = {
entry: './src/index.js',
output: {
path: `${__dirname}/public`,
filename: 'main.js'
},
devServer: {
contentBase: `${__dirname}/public`,
},
module: {
rules: [
{
test: /\.(gif|png|jpg)$/,
loader: 'url-loader'
}
],
}
};
url-loaderを使うのはアイコンなどの利用が多いので、index.js
に以下のようにimport
して、sass側で画像を指定します。
<!-- index.js -->
import './assets/images/logo.svg';
sassで使う場合は普通に
account-icon::after {
background-image: url("../images/logo.svg")
}
JavaScript
で画像を出力する場合は、コードを見た方が早いと思うので、こんな感じ。
// Logo
import logo from './assets/images/logo.svg';
window.addEventListener('DOMContentLoaded', function () {
const headerLogo = document.createElement('img');
headerLogo.src = logo;
headerLogo.alt = 'logo';
siteHeader.appendChild(headerLogo);
})
file-loaderはファイルをバンドルせずに外部ファイルの参照を保つためのローダーです。
インストール
$ npm install --save-dev webpack webpack-cli file-loader
webpack.config.jsの設定
<!-- webpack.config.js -->
module.exports = {
entry: './src/index.js',
output: {
path: `${__dirname}/public`,
filename: 'main.js'
},
devServer: {
contentBase: `${__dirname}/public`,
},
module: {
rules: [
{
test: /\.(png|jpe?g|gif)$/i,
use: [
{
loader: 'file-loader',
options: {
limit: 51200,
name: '../images/[name].[ext]'
}
}
]
}
],
}
};
options配下のlimitパラメータは、ファイルをDateUrl形式にするかファイルにするかを決める閾値をバイトで単位で表します。上記の場合だと画像サイズが50KB以上であれば、これを../images/[name].[ext]
のような名前で出力しなさいという意味になります。
参照する方法は、url-loaderと一緒。
<!-- index.js -->
import './assets/images/backgroudimage.jpg';
sassは普通に
background-image: url("../images/backgroudimage.jpg");
例)
50KB以下の画像はDateUrl化して、50KB以上はファイル出力。みたいな形にして切り替える場合は、options
を設定すればいい。
module: {
rules: [
{
test: /\.(svg|png|jpe?g)$/,
loader: 'url-loader',
options: {
limit: 51200,
name: '../images/[name].[ext]'
}
}
],
}