当直接在浏览器中请求时,React Router 仅渲染基本路径(/)并为其他路径抛出错误

Posted

技术标签:

【中文标题】当直接在浏览器中请求时,React Router 仅渲染基本路径(/)并为其他路径抛出错误【英文标题】:React Router rendering only base path (/) and throwing error for other paths when requested directly in the browser 【发布时间】:2018-09-11 01:19:54 【问题描述】:

我是 ReactJS 的新手,遇到了路由问题。这是我定义了 React 路由器的 App.js 文件。

import React from "react";
import  BrowserRouter as Router, Route, Link  from "react-router-dom";

import Home from "./Home";
import About from "./About";
import Feedback from "./Feedback"
import Chunking from "./Chunking"

export default class App extends React.Component 
  render() 
    return(
      <Router>
        <div>
          <nav class="navbar navbar-expand-lg navbar-light bg-light">
            <div class="collapse navbar-collapse" id="navbarNavAltMarkup">
              <div class="navbar-nav">
                <Link class="nav-item nav-link" to="/">Home <span class="sr-only">(current)</span></Link>
                <Link class="nav-item nav-link" to="/about">About</Link>
                <Link class="nav-item nav-link" to="/feedback">Feedback</Link>
                <Link class="nav-item nav-link" to="/chunking">Chunking</Link>
              </div>
            </div>
          </nav>

          <hr class="my-4" />

          <div id="mainContentContainer">
            <Route exact path="/" component=Home />
            <Route path="/about" component=About />
            <Route path="/feedback" component=Feedback />
            <Route path="/chunking" component=Chunking />
          </div>

        </div>
      </Router>
    );
  

当我启动服务器并在浏览器中呈现页面时,页面加载完美。

即使是导航栏中的链接也能完美运行。单击导航栏中的链接会呈现相应的组件。

问题是,当我尝试使用完整路径名加载页面时,我无法呈现页面。喜欢:- http://localhost:8080/about http://localhost:8080/feedback

该页面仅针对 url http://localhost:8080/ 呈现

我可以从主页导航到所有其他页面,但是当我在浏览器中输入 url http://localhost:8080/about 并按 Enter 时,我收到了这样的错误 -

About 组件类如下所示 -

import React from "react";

export default class About extends React.Component 
  render() 
      return (
         <div>
            <h2>About Page</h2>
         </div>
      );
   

当直接请求时,如何让其他 url 在我的应用程序中工作?

【问题讨论】:

【参考方案1】:

当您键入localhost:8080/about 时,浏览器会向您的服务器发出请求,显然您的服务器不知道它必须在/ 之外的其他路由上加载您的反应代码。确保你正确配置你的服务器(例如独立于路由渲染相同的反应代码),然后反应路由器将能够处理你的路由。

【讨论】:

Make sure you configure your server correctly (for example to render the same react code independent of the route),这就是我想要理解的。 React 教程都没有涵盖这部分。另外,我的是一个简单的带有 Webpack 的 ReactJS 项目,我在这里没有什么花哨的。 如果你使用 create-react-app 来创建你的应用,它不需要额外的配置就可以工作。【参考方案2】:

这可能是 @user3526468 所说的服务配置。尝试在您的webpack.config.js > devServer 中修改它:

devServer = 
        host: 'localhost',
        port: 8080,
        contentBase: PATH.join(__dirname, '/src'), // This is were I store content of my project. Ir your case, could be different
        hot: true,
        inline: true,
        historyApiFallback: true // THIS LINE WILL SOLVE YOUR PROBLEM
    ;

希望它能解决您的问题。问候。

【讨论】:

以上是关于当直接在浏览器中请求时,React Router 仅渲染基本路径(/)并为其他路径抛出错误的主要内容,如果未能解决你的问题,请参考以下文章

React Router 在重新加载时起作用,但在单击链接时不起作用

React-router:更改 URL 并清除历史记录

react-router打包后无法通过路由进入到页面

React Router v4:无法在 GitHub 页面上加载页面

react-router详细解释

通过在 react-router 的地址栏上输入它的地址直接访问路由器