reactjs webpack文件加载器不加载背景图像

voase2hg  于 2023-03-29  发布在  React
关注(0)|答案(4)|浏览(196)

我已经有这个问题有一段时间了,我看到其他人也有这个问题,但即使我和他们有相同的代码,它仍然不起作用,我不知道我做错了什么。我正在为一个项目使用react,webpack,babel和scss。首先,我创建一个主组件,它有一个背景图像,加载没有问题,但是当我添加一个carousel组件时,我遇到了一个错误,说我需要一个加载器来显示图像(html图像,而不是bakground)。所以我在互联网上查找它,出现了两个加载器:我安装了url-loader和file-loader,并在我的webpack配置文件中添加了一个,就像文档中所说的那样。图像加载,但主组件的背景图像没有,不仅如此,所有的背景样式也不适用。
这是我的webpack配置文件,我试着把两个加载器,然后只有一个,然后另一个,但没有一个工作。我尝试了每一个解决方案,遇到stackoverflow,但代码不工作,并没有在我的终端错误。
/////编辑
我添加了绝对路径,但它仍然不起作用。图像获取,因为我会得到一个错误,如果它不是,所以我不认为这是一个路径问题。我更新了webpack配置文件

const HtmlWebPackPlugin = require("html-webpack-plugin");
const path = require("path");
const htmlPlugin = new HtmlWebPackPlugin({
 template: "./src/index.html",
 filename: "./index.html"
});



module.exports = {
mode: "development",
resolve: {
  alias: {
    Assets: path.resolve(__dirname, 'src/assets/')
  }
},
  module: {
    rules: [{
   test: /\.js$/,
   exclude: /node_modules/,
   use: {
     loader: "babel-loader"
   }
 },
  {
   test: /\.s?css$/,
   use: ["style-loader", "css-loader", "sass-loader"]
  },
  {
    test: /\.(png|jpg|gif)$/i,
    use: [
      {
        loader: 'url-loader',
        options: {
          limit: 10000,
          esModule: false
        },
      },
    ]
  }
]},
 plugins: [htmlPlugin],
 devServer:{
   historyApiFallback : true
 }
}

这是我的主要组件及其SCSS文件(Bakground映像所在的位置)
React组件

import React from "react";
import { NavBar } from "../components/NavBar";
import CarouselComponent from "../components/Carousel";

export const MainPage = () => {
    return (
        <div>
        <NavBar />
        <div>
            <div className="main">
                <h1>Find a new musical to watch!</h1>
                <a className="main__btn" href="/musicals">See categories</a>
            </div>
            <div className="login-info">
                <h2 className= "login-info__login">See our forum for reacomendations and post your own!</h2>
                <div className="login-info__btn-login-position">
                    <a className="btn login-btn-position-config" href="#"><strong>Loging</strong></a>   
                </div>
                <span></span>
                <h2 className= "login-info__create-account">Don't have an account? Create one!</h2>
                <div className="login-info__btn-create-position">
                <   a className="btn login-btn-position-config" href="#"><strong>Create account</strong></a> 
                </div>
           </div>
            <CarouselComponent />
        </div>
        </div>
    )
}

Scss组件

body{ 
    padding: 56px 50px 0 50px;
    background-color: $color-background;
}

.main{
    font-family: $primary-title-font;
    height: 90%;
    background: url(Assets/main_background.jpg) no-repeat center center; 
    -webkit-background-size: cover; 
    -moz-background-size: cover;
    -o-background-size: cover;
    background-size: cover;
    
    h1{
        background-image: linear-gradient(90deg, rgba(1,50,1,1) 5%, rgba(70,82,25,1) 51%, rgba(78,82,29,1) 87%);
        background-size: 100%; 
        background-clip: text;
        -webkit-background-clip: text;
        -moz-background-clip: text;
        -webkit-text-fill-color: transparent; 
        -moz-text-fill-color: transparent;
        position: absolute;
        top: 15rem;
        left: 5rem;
        font-size: 5rem;
        
    }

    &__btn{ 
        position: absolute; 
        top: 350px;
        left: 459px;
        border-radius: 10% / 20%;
        padding: 1rem;
        text-decoration: none;
        color: $primary-black-color;
        background: $golden-button;
        font-size: 1.5rem;

        &:hover{
            color: $primary-black-color;
        }

        &:active{
            transform: translateY(2px);
        }
    }
}

这是带有scss的carousel组件
React组件

import React, { Component } from "react";
import "react-responsive-carousel/lib/styles/carousel.min.css"; 
import { Carousel } from 'react-responsive-carousel';
import hamilton from "../assets/hamilton.jpg";
import six from "../assets/six_the_musical.jpg";
import hadestown from "../assets/hadestown.jpg";
import theGuy from "../assets/the_guy_who_didnt_like_musicals.png";

class CarouselComponent extends Component {
    render (){
        return (
            <Carousel autoPlay = {true} infiniteLoop={true} interval={4000} showStatus={false} useKeyboardArrows={true} showThumbs={false}>
                <div className="carousel__box-1">
                    <img src={hamilton} alt="Hamilton wallpaper"/>
                </div>
                <div className="carousel__box-2">
                    <img src={six} alt="Six wallpaper"/>
                </div>
                <div className="carousel__box-3">
                    <img src={hadestown} alt="Hadestown wallpaper"/>
                </div>
                <div className="carousel__box-4">
                    <img src={theGuy} alt="The guy who didnt like musicals wallpaper"/>
                </div>
            </Carousel>
        )
    }
}

export default CarouselComponent;

Scss组件

.carousel__box{
    height: 9rem;

    img{
        min-width: 100%;
        min-height: 100%;
    }
}

我还将添加我的文件夹结构,以备不时之需

/project
  /dist
  /node_modules
  /src
    /assets
       (all the images are stored here)
    /components
       card.js
       cardBlock.js
       carousel.js
       navbar.js
    /pages
       main.js
       musicals.js
       notFound.js
    /sass
       (all scss are stored here, there is a styles.scss that imports the rest of files and it's 
       called in index.js)
    index.html
    index.js (imports all react component an renders them in index.html)
    .babelrc
    packaje.json
    packaje-lock.json
    webpack.config.js

/////新编辑
我发现如果你把esModule: false放在url加载器选项中,图像就会被加载。

gwbalxhn

gwbalxhn1#

这就是我的https://webpack.js.org/guides/asset-management/。你需要已经设置了css-loader。这不是使用file-loaderurl-loader,所以要注意影响,但这是Webpack推荐的一个简单的解决方案。我删除了file-loader的设置并更新了:

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

解释是这样的:
当使用css-loader时,如上所示,CSS中的url('./my-image.png')将发生类似的过程。loader将识别这是一个本地文件,并替换'./my-image.png'
这对我来说非常有效,希望能有帮助。

pgccezyw

pgccezyw2#

如果你有webpack 5,那么不要安装(file-loader,url-loader,raw-loader),它们是5附带的。一切都会正常工作,只需要像没有webpack一样在css文件中包含图像。
https://webpack.js.org/guides/asset-modules/

0md85ypi

0md85ypi3#

在url加载器选项中添加esModule: false对我有帮助,虽然我不知道为什么,如果有人有同样的问题,你应该试试这个技巧。

5cnsuln7

5cnsuln74#

如果您正在构建NextJs应用程序,您可以将所有图像或svg移动到公共文件夹并直接从那里访问它们。
这对我很有效

background-image: url("/pattern.png");

相关问题