【问题标题】:webpack 4 gives background: url([object Module]) as bg imagewebpack 4 给出背景: url([object Module]) as bg image
【发布时间】:2019-12-31 11:26:22
【问题描述】:

我在设置 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()
  ]
};

【问题讨论】:

    标签: javascript webpack webpack-4 svg-sprite


    【解决方案1】:

    esModule: false 添加到文件加载器选项对我来说是个窍门。

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

    【讨论】:

      【解决方案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()
          ]
      };
      

      【讨论】:

      • 我在字体方面遇到了同样的问题,添加此选项修复了它。感谢您发布解决方案:)
      【解决方案3】:

      对于svg-sprite-loader 选项,您必须传递esModule: false

      顺便说一下(它与 esModule 无关): 使用 MiniCssExtractPlugin 可以不提取 svg sprite。我一小时前就遇到了这个问题..

      【讨论】:

      • 感谢您的回答,请问您现在使用的是哪个其他的 css 提取器?
      • @bullettrain 没有提取器。不幸的是,我在 svg spriting 中没有成功
      猜你喜欢
      • 2020-03-28
      • 2020-03-23
      • 2019-12-20
      • 2021-04-13
      • 1970-01-01
      • 2015-09-26
      • 2014-02-03
      • 2023-03-13
      • 2019-12-20
      相关资源
      最近更新 更多