React 嵌套路由无法在刷新时加载

IT技术 reactjs routing http-status-code-404 react-router webpack-dev-server
2021-05-08 12:14:00

我有一个 React 应用程序,其导航由react-router我在开发中运行webpack-dev-server并启用了历史回退选项。这是我在我的index.js

ReactDOM.render((
  <Router history={browserHistory}>
    <Route path="/" component={App}>
      <IndexRedirect to="/intro" />
      <Route path="/intro" component={Intro} />
      <Route path="/device" component={Device} />
      <Route path="/clothing" component={Clothing} />
      <Route path="/build" component={Build}>
        <IndexRedirect to="/build/pattern" />
        <Route path="/build/pattern" component={Pattern} />
        <Route path="/build/layout" component={Layout} />
        <Route path="/build/color" component={Color} />
      </Route>
      <Route path="/capture" component={Capture} />
      <Route path="/review" component={Review} />
    </Route>
  </Router>
), document.getElementById('app'))

当我浏览链接时,一切正常,我可以看到嵌套路由组件按预期嵌套在其父路由组件中。例如,当我导航到/build/color我可以看到我的App组件嵌套Build组件嵌套Color组件。

它失败的地方是当我尝试点击嵌套路由中的刷新按钮时。React 完全无法加载,我收到以下错误

GET http://localhost:8080/build/app.js 404(未找到)

我的应用程序中确实没有这样的文件,但我仍然很困惑为什么它会自动查找此文件而不是从根重新加载路由。请注意,在页面上点击刷新/device确实可以正常工作。

如果您需要有关我的设置的更多详细信息,请告诉我。谢谢!


解决方案:

我的webpack设置实际上正在使用HtmlWebpackPluginwhich 将路径注入我的应用程序包,如下所示

<script src="app.js" type="text/javascript"></script>

我需要做的就是配置我的webpack公共路径,publicPath: '/'以便按如下方式注入包

<script src="/app.js" type="text/javascript"></script>

4个回答

它不起作用,因为它无法加载您的 javascript 包。我猜问题出在 HTML 脚本标记中的路径上。可能你已经像这样在开头用点指定了app.js的路径 <script src="./app.js"></script>,如果是这样,请删除点并检查问题是否仍然存在<script src="/app.js"></script>

让我们来举例说明之间有什么区别./app.js/app.js

案例1.您使用类似路线的第一个层次是加载页面//intro

  • ./app.js: HTML 尝试从 http://address/app.js
  • /app.js: HTML 尝试从 http://address/app.js

没有不同

案例 2. 您正在使用二级路由加载页面 /build/pattern

  • ./app.js: HTML 尝试加载脚本http://address/build/app.js-不存在
  • /app.js:HTML 尝试从中加载脚本http://address/app.js- 好的

@niba 的回答完美地解决了我的问题。我一直遇到的问题是,当我<Route/>在已经由 a 呈现的组件中嵌套一个元素<Route/>时,当我尝试转到子路由 url 时,它将无法加载脚本 bundle.js。在webpackConfig.json中添加以下内容后,一切恢复正常。

module.exports = {
    ...
    output: {
        path: path.resolve('dist'),
        publicPath: '/',
        filename: 'bundle.js'
    },
    ...
}

对于那些尝试过上述方法但仍然有问题的人,我在我的 webpack 配置中使用了 html-webpack-plugin,因此它会在 HTML 中注入包,而无需在 index.html 上添加任何脚本导入

所以我从我的 index.html 文件中删除了以下行:

<script src="/bundle.js"></script>

并在 webpack plugins 部分添加了以下配置:

// some other imports 
const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
...
webpack default config
...

plugins: [
    new HtmlWebpackPlugin({
      template: './public/index.html',
      hash: true,
      inject: true,
    }),
    ...
    other plugins,
  ],

}

请记住还要根据您的项目使用输出配置,例如我的:

output: {
    path: path.resolve(__dirname, 'public'),
    publicPath: '/',
    filename: 'bundle.js',
  },

package.json文件中,只需设置

    "homepage": "/"