Webpack 不会为生产 css 文件中的图像创建正确的路径

taw*_*eon 2 sass reactjs webpack css-loader

要将图像添加到项目中,我正在使用 sass 文件中的 content: url() css 属性并指定 src 文件夹的相对路径,例如content: url('/images/right-arrow.svg');.

问题是,在生产版本中,我需要去掉第一个斜杠才能('images/right-arrow.svg')在捆绑的 css 文件中包含这样的路径。

我可以获得所需行为的唯一方法是使用url: false选项 for css-loader,并在 sass file: 中写入不带斜杠的路径content: url('/images/right-arrow.svg'),但这样的选项不会从 node_modules 添加必要的文件,例如字体和图像。

网络包配置

return {
entry: ['babel-polyfill', './src/app.js'],
output: {
  path: path.join(__dirname, 'public/'),
  filename: '[name].[hash].js',
},
mode: isProduction || 'development',
module: {
  rules: [
    {
      loader: 'babel-loader',
      test: /\.js$/,
      exclude: /node_modules/
    },

    {
      test: /\.s?css$/,
      use: [
        isProduction ? MiniCssExtractPlugin.loader : 'style-loader',
        {
          loader: 'css-loader',
          options: {
            url: true
          }
        },
        'sass-loader'
      ]
    },

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

      }
    },

    {
      test: /\.(otf|woff2|ttf|eot|woff)$/,
      use: {
        loader: 'file-loader',
        options: {
          name: '[name].[ext]',
          outputPath: 'fonts/'
        }
      }
    }

  ]
}
Run Code Online (Sandbox Code Playgroud)

我在 webpack 配置中缺少什么来实现正确工作的路径?

taw*_*eon 6

好的,我已经解决了这个问题。在@Ujin 建议使用它之前,我正在使用resolve-url-loader没有结果。在他发表评论后,我澄清了resolve-url-loader 的作用,并正确配置了它以解决我的问题。主要问题是我错过了阅读 resolve-url-loader 文档的重要段落,其中说:

加载器需要在 resolve-url-loader 之前的源映射(不管 devtool)。

我也没有使用resolve-url-loader 插件的root选项。所以,配置的WebPack为.scss文件看起来像这样:

      test: /\.s?css$/,
      use: [
        isProduction ? MiniCssExtractPlugin.loader : 'style-loader',
        'css-loader',
        {
          loader: 'resolve-url-loader',
          options: {
            root: path.join(__dirname, 'src')
          }
        },
        {
          loader: 'sass-loader',
          options: {
            sourceMap: true,
            sourceMapContents: false
          }
        }
      ]
    }
Run Code Online (Sandbox Code Playgroud)