【问题标题】:React images not loading on multi-site page反应图像未在多站点页面上加载
【发布时间】:2019-07-14 03:17:17
【问题描述】:

我正在用 React 开发一个多页网站。 问题是当我从一页转到另一页时,我会丢失图像。它们在根页面"/" 上工作正常,但是当我转到另一个页面( company1 )时,徽标丢失了。

在浏览器控制台中,当我导航到 company1 时,我收到错误: company1.jpg:1 GET http://localhost:8080/company/images/company1.jpg 404 (Not Found)

我看不出这里出了什么问题 - 我直接在 Navbar.js 组件中导入图像。

我的文件结构


└public
│   + index.html  
|
└src
|   └───components
|   │       +  Navbar.js
|   |       +  Footer.js
|   |
|   └───img
|   │   └───companies
|   |   |    +  company1.jpg
|   |   |    +  company2.jpg
|   |   + logo.png
|   │   
|   └───pages
|   |     +  Home.js
|   |     +  Company1.js
|   |     +  Company2.js
|   |
|   └───routes
|   │     +  AppRouter.js
|   │
|   +  app.js
|
+ webpack.config.js

routes/AppRouter.js

import React from "react";
import { BrowserRouter, Route, Switch } from "react-router-dom";
import Footer from "../components/Footer";
import Home from "../pages/Home";
import Company1 from "../pages/Company1";
import Company2 from "../pages/Company2";

const AppRouter = () => (
  <BrowserRouter>
    <div>
      <Switch>
        <Route path="/" component={Home} exact={true} />
        <Route path="/company/company1" component={Company1} />
        <Route path="/company/company2" component={Company2} />
      </Switch>
      <Footer />
    </div>
  </BrowserRouter>
);

export default AppRouter;

/pages/Home.js

import React from "react";
import Navbar from "../components/Navbar";
export default class Home extends React.Component {
  render() {
    return (
      <div>
        <Navbar company="GROUP PAGE" />
      </div>
    );
  }
}

/pages/Company1.js

import React from "react";
import Navbar from "../components/Navbar";
const Company1 = () => (
  <div>
    <Navbar company="Company1" />
  </div>
);

export default Company1 ;

/components/Navbar.js

import React from "react";
import { Link } from "react-router-dom";
import logo from "../img/logo.png";

const Navbar = props => (
  <nav>
      <Link className="navbar-brand to="/">
        <img src={logo} width="120" height="50" alt="group" />
        <span>{props.company}</span>
      </Link>
  </nav>
);

export default Navbar;

webpack.config.js

const path = require("path");
module.exports = {
  entry: "./src/app.js",
  output: {
    path: path.join(__dirname, "public"),
    filename: "bundle.js"
  },
  module: {
    rules: [
      {
        loader: "babel-loader",
        test: /\.js$/,
        exclude: /node_modules/
      },
      {
        test: /\.s?css$/,
        use: ["style-loader", "css-loader", "sass-loader"]
      },
      {
        test: /\.(png|jp(e*)g|svg)$/,
        use: [
          {
            loader: "url-loader",
            options: {
              limit: 8000, // Convert images < 8kb to base64 strings
              name: "images/[hash]-[name].[ext]"
            }
          }
        ]
      }
    ]
  },
  devtool: "cheap-module-eval-source-map",
  devServer: {
    contentBase: path.join(__dirname, "public"),
    historyApiFallback: true
  }
};

【问题讨论】:

  • 您的文件结构与错误或您的webpack.config.js 不对应。错字?
  • @jayarjo 是的,好点 - 这是一个错字 - 我现在已经更新了实际的文件结构

标签: javascript html css reactjs react-router


【解决方案1】:

如果图像在 src/assets 文件夹中,您可以使用 require。

const img = require('../../img.png');

你也可以内联

<img src={require('../../img.png')} />

【讨论】:

  • 使用requireimport 有什么区别?