我已经有这个问题有一段时间了,我看到其他人也有这个问题,但即使我和他们有相同的代码,它仍然不起作用,我不知道我做错了什么。我正在为一个项目使用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加载器选项中,图像就会被加载。
4条答案
按热度按时间gwbalxhn1#
这就是我的https://webpack.js.org/guides/asset-management/。你需要已经设置了
css-loader
。这不是使用file-loader
或url-loader
,所以要注意影响,但这是Webpack推荐的一个简单的解决方案。我删除了file-loader
的设置并更新了:解释是这样的:
当使用css-loader时,如上所示,CSS中的url('./my-image.png')将发生类似的过程。loader将识别这是一个本地文件,并替换'./my-image.png'
这对我来说非常有效,希望能有帮助。
pgccezyw2#
如果你有webpack 5,那么不要安装(file-loader,url-loader,raw-loader),它们是5附带的。一切都会正常工作,只需要像没有webpack一样在css文件中包含图像。
https://webpack.js.org/guides/asset-modules/
0md85ypi3#
在url加载器选项中添加
esModule: false
对我有帮助,虽然我不知道为什么,如果有人有同样的问题,你应该试试这个技巧。5cnsuln74#
如果您正在构建NextJs应用程序,您可以将所有图像或svg移动到公共文件夹并直接从那里访问它们。
这对我很有效