reactjs 使用Webpack解析css背景图像URL

kfgdxczn  于 2022-11-22  发布在  React
关注(0)|答案(3)|浏览(86)

我正在使用webpack,只是尝试将url属性中指定的background-image应用于html元素。
我已经查看了几个线程(例如this one),但没有找到适合我的线程。
我的设置如下:
//索引. js

import React from 'react'
import styles from './styles.css'

const MyComponent = () => {
  return (
    <div className={styles.container}></div>
  )
}

export default MyComponent

//样式. css

.container {
  background-image: url('../../../static/public/images/my-background.jpg');
}

//网页包配置. js

const path = require('path');
const HtmlWebpackPlugin = require("html-webpack-plugin");
const CopyWebpackPlugin = require('copy-webpack-plugin');

module.exports = {
  entry: path.join(__dirname, "src", "index.js"),
  output: {
    path: path.join(__dirname, "dist"),
    filename: "index.bundle.js"
  },
  mode: process.env.NODE_ENV || 'development',
  resolve: { 
    modules: [path.resolve(__dirname, "src"), "node_modules"],
  },
  devServer: {
    static: path.join(__dirname, 'src')
  },
  plugins: [
    new HtmlWebpackPlugin({
        template: path.join(__dirname, "src", "index.html"),
    }),
    new CopyWebpackPlugin({
      patterns: [
        {
          from: 'static',
          to: 'static'
        }
      ]
    })
  ],
  module: {
    rules: [
        { 
            test: /\.(js|jsx)$/, 
            exclude: /node_modules/, 
            use: ["babel-loader"] 
        },
        {
            test: /\.(css)$/,
            use: ["style-loader", "css-loader"],
        },
        {
          test: /\.(jpg|png|svg|gif)$/,
          use: ['url-loader', 'file-loader'],
        },
    ],
},
}

当到达localhost时,我确实看到正在解析的路径:

然而,当我试图到达那个网址时,我看到的只是一个白色的小方块...

这绝对不是图像。我确实发现图像存在于我的构建./dist/static/public/images/my-background.jpg
请注意,该图像的尺寸较大:小行星3842  
我认为这与webpack加载程序的配置有关,但没有找到如何调整它来让它在这里工作。任何帮助都将非常感谢!

wn9m85ua

wn9m85ua1#

您可能正在使用新版本的Webpack,其中url-loaderfile-loader已过时,Asset Modules是替代版本。
尝试使用:

{
      test: /\.(jpg|png|svg|gif)$/,
      type: 'asset/resource',
},

得双曲余切值.
更多信息click here

flmtquvp

flmtquvp2#

我遇到了同样的问题,它最终通过使用~引用项目目录并从那里访问public文件夹来工作。

background-image: url("~/public/images/person.png");

这对我来说很好:)

另一种方法是将图像移动到src目录,webpack会将它们作为静态文件打包到名为static/media的文件夹中

8i9zcol2

8i9zcol23#

解决方案是关闭css-loader的URL解析,因为在构建webpack时CSS文件不会更新URL字符串

module.exports = { 
      ...
     module: {
        rules: [ 
            { //https://webpack.js.org/loaders/css-loader/
                test: /\.css$/, 
                use: ["style-loader"]
            },

            { //https://webpack.js.org/loaders/css-loader/
                test: /\.css$/, 
                loader: "css-loader",
                options: {
                    url: false,
                }
            }
        ]
    }

}

请注意,这将使得.css中使用的文件不会被散列,并且在将项目构建到/dist/文件夹时,其结构将类似于原始的/public/文件夹。这就是它工作的原因。
有关参考,请参阅此github问题和this one
此外,我使用:

  • “css加载程序”:“^6.7.2”、
  • “文件加载程序”:“^6.2.0”,
  • “html-webpack插件”:“^5.5.0”,
  • “样式加载器”:“^3.3.1”,
  • “网址加载器”:“^4.1.1”、
  • “webpack-cli”:“^4.10.0”,
  • “webpack开发服务器”:“^4.11.1”

相关问题