webpack 4给出背景:url([object Module])as bg image

时间:2019-08-27 09:49:26

标签: javascript webpack webpack-4 svg-sprite

我在设置Web Pack 4和svg-sprite-loader来将svg图标呈现为背景图像时遇到问题。我遵循的是svg-sprite-loader(https://github.com/kisenka/svg-sprite-loader/tree/master/examples/extract-mode)官方文档中的这些说明。

我已经成功地在dist文件夹中创建了sprite.svg文件,并将其用作html内use标签的参考。但是,我也试图将src / images / icons文件夹中的svg图标用于背景图像,如下所示:

background: url('../images/icons/upload_icon.svg') 10% 50% no-repeat;

这样做时,webpack可以正确编译,但是会在dist css文件中创建它:

background: url([object Module]) 10% 50% no-repeat;

任何帮助都会很棒。

这是我的webpack配置文件:

const path = require("path");
const webpack = require("webpack");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const CleanWebpackPlugin = require("clean-webpack-plugin");
const SpriteLoaderPlugin = require("svg-sprite-loader/plugin");

module.exports = {
  mode: "development",
  devtool: "source-map",
  output: {
    filename: "bundle.js",
    path: path.resolve(__dirname, "dist")
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: "babel-loader",
          options: {
            sourceMap: true
          }
        }
      },
      {
        // scss configuration
        test: /\.scss$/,
        use: [
          MiniCssExtractPlugin.loader,
          {
            loader: "css-loader"
          },
          {
            loader: "postcss-loader"
          },
          {
            loader: "sass-loader",
            options: {
              sourceMap: true
            }
          }
        ]
      },
      {
        // html configuration
        test: /\.html$/,
        use: {
          loader: "html-loader"
        }
      },
      {
        // images configuration
        test: /\.(jpg|jpeg|gif|png|woff|woff2)$/,
        use: [
          {
            loader: "file-loader",
            options: {
              name: "[path][name].[ext]"
            }
          }
        ]
      },
      {
        test: /\.svg$/,
        use: [
          {
            loader: "svg-sprite-loader",
            options: {
              extract: true,
              spriteFilename: "sprite.svg"
            }
          }
        ]
      }
    ]
  },
  plugins: [
    // all plugins used for compiling by webpack
    new CleanWebpackPlugin(),
    new HtmlWebpackPlugin({
      title: "Style Guide",
      template: path.resolve(__dirname, "src", "index.html")
    }),
    new MiniCssExtractPlugin({
      filename: "app.css"
    }),
    new SpriteLoaderPlugin()
  ]
};

3 个答案:

答案 0 :(得分:9)

在文件加载器选项中添加esModule: false对我来说很成功。

{
    test: /\.(jpg|png|gif|svg)$/,
    use: {
        loader: 'file-loader',
        options: {
            name: "[name].[ext]",
            outputPath: "img",
            esModule: false
    }
},

答案 1 :(得分:2)

几个小时后,由于@WimmDeveloper为我指明了正确的方向,我设法使这件事起作用。与之前的webpack配置文件相比,主要变化是我在svg-sprite-loader选项中添加了esModule:false,并用extract-text-webpack-plugin替换了MiniCssExtractPlugin。请注意,由于不推荐使用此webpack插件,因此该解决方案并不理想。

这是我完整的webpack配置文件:

const path = require("path");
const webpack = require("webpack");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const CleanWebpackPlugin = require("clean-webpack-plugin");
const SpriteLoaderPlugin = require("svg-sprite-loader/plugin");
const ExtractTextPlugin = require("extract-text-webpack-plugin");

module.exports = {
    mode: "development",
    devtool: "source-map",
    output: {
        filename: "bundle.js",
        path: path.resolve(__dirname, "dist")
    },
    module: {
        rules: [
            {
                test: /\.js$/,
                exclude: /node_modules/,
                use: {
                    loader: "babel-loader",
                    options: {
                        sourceMap: true
                    }
                }
            },
            {
                test: /\.(s*)css$/,
                use: ExtractTextPlugin.extract({
                    use: ["css-loader", "postcss-loader", "sass-loader"]
                })
            },
            {
                // html configuration
                test: /\.html$/,
                use: {
                    loader: "html-loader"
                }
            },
            {
                test: /\.svg$/,
                use: [
                    {
                        loader: "svg-sprite-loader",
                        options: {
                            esModule: false,
                            extract: true,
                            spriteFilename: "sprite.svg"
                        }
                    }
                ]
            },
            {
                // files configuration
                test: /\.(jpg|jpeg|gif|png|woff|woff2)$/,
                use: [
                    {
                        loader: "file-loader",
                        options: {
                            name: "[path][name].[ext]"
                        }
                    }
                ]
            }
        ]
    },
    plugins: [
        // all plugins used for compiling by webpack
        new CleanWebpackPlugin(),
        new HtmlWebpackPlugin({
            title: "Style Guide",
            template: path.resolve(__dirname, "src", "index.html")
        }),
        new ExtractTextPlugin({ filename: "app.css" }),
        new SpriteLoaderPlugin()
    ]
};

答案 2 :(得分:0)

您必须传递esModule: false的{​​{1}}选项。

顺便说一句(与esModule无关):使用 MiniCssExtractPlugin ,您无法提取svg子画面。一个小时前我已经遇到了这个问题。