CSS背景画像のWebpackバンドル手法

CSS内で背景画像を使用する場合、Webpackでビルドすると以下のようなエラーが発生することがあります。

この問題を解決するには、file-loaderurl-loader の2つのパッケージを利用する必要があります。

1. パッケージのインストール

npm install --save-dev url-loader file-loader

url-loader: 取り込んだ画像データをBase64エンコードし、DataURLとしてインライン化します。

file-loader: 画像のURL参照を解決し、設定に基づいて画像ファイルを適切なパスにコピーし、バンドル後のファイルの参照パスを正しく修正します。

動作ルール:

  • ファイルサイズ < limit: url-loaderがBase64エンコードしてDataURL化
  • ファイルサイズ > limit: url-loaderがfile-loaderに処理を委譲、パラメータもそのまま渡される

2. webpack.config.js の設定

module: {
  rules: [
    {
      test: /\.css$/,
      use: ['style-loader', 'css-loader']
    },
    {
      test: /\.(png|jpg|jpeg|gif|svg)$/,
      use: [{
        loader: 'url-loader',
        options: {
          limit: 1024 * 10,  // 10KB以下をDataURLに変換
          name: '[name].[ext]',
          outputPath: 'assets/images/',
          publicPath: '../dist/assets/images/'
        }
      }]
    }
  ]
}

各オプションの説明:

  • limit: DataURL化する閾値(バイト単位)
  • name: 出力ファイル名のテンプレート
  • outputPath: 画像ファイルの出力先ディレクトリ
  • publicPath: バンドルファイル内の画像参照パスのプレフィックス

3. ディレクトリ構成例

index.html:

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>サンプルページ</title>
</head>
<body>
  <div class="hero"></div>
  <script src="../dist/index.bundle.js"></script>
</body>
</html>

src/js/main.js:

import '../css/style.css';

webpack.config.js:

const path = require('path');

module.exports = {
  mode: 'development',
  entry: {
    main: path.resolve(__dirname, 'src/js/main.js'),
    auth: path.resolve(__dirname, 'src/js/auth.js')
  },
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].bundle.js'
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: ['style-loader', 'css-loader']
      },
      {
        test: /\.(png|jpg|jpeg|gif)$/,
        use: [{
          loader: 'url-loader',
          options: {
            limit: 5120,  // 5KB
            name: '[name]-[hash:8].[ext]',
            outputPath: 'images/',
            publicPath: '../dist/images/'
          }
        }]
      }
    ]
  }
};

4. ビルド実行と確認

npm run build または npm run start を実行すると、dist/images/ ディレクトリに画像がコピーされ、バンドルファイル内の参照パスが適切に設定されます。

これでCSS背景画像をWebpackで正しく扱えるようになります。

タグ: webpack url-loader file-loader CSS背景画像 バンドル設定

5月23日 01:18 投稿