You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Router v6 createBrowserRouter非根路由Cannot GET错误求助

使用createBrowserRouter创建路由时/hello路径出现Cannot GET /hello错误的问题排查

问题描述

我尝试使用createBrowserRouter创建除根路径"/"之外的新路由,但该路由无法正常工作,访问"/hello"时出现"Cannot GET /hello"错误,请求帮忙指出可能遗漏的配置或问题所在。

相关代码配置

index.js代码

import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './app';
import { createBrowserRouter, RouterProvider } from 'react-router-dom';

const router = createBrowserRouter([
  {
    path: "/", // 该路由正常工作
    element: <App />,
  },
  {
    path: "/hello", // 访问此路由出现"Cannot GET /hello"错误
    element: <div>Hello</div>
  }
])

ReactDOM.createRoot(document.getElementById('root'))
  .render(
    <React.StrictMode>
      <App />
    </React.StrictMode>
  )

webpack公共配置

const path = require('path');

const babelLoaderRule = {
  test: /\.(js|jsx)$/,
  exclude: /(node_modules|bower_components)/,
  use: {
    loader: 'babel-loader',
    options: {
      presets: ['@babel/preset-env', '@babel/preset-react'],
      plugins: [
        '@babel/plugin-transform-runtime',
        '@babel/plugin-proposal-class-properties',
      ]
    }
  }
}

const urlLoaderRule =  {
  test: /\.(png|jpe?g|gif)$/i,
  loader: 'url-loader',
  options: {
    name: '[name].[ext]',
    outputPath: 'images',
    limit: 8192,
  }
}

module.exports = {
  entry: {
    app: './src/index.js',
  },
  output: {
    filename: 'js/[name]-bundle-[chunkhash:6].js',
    path: path.resolve(__dirname, '../dist'),
  },
  module: {
    rules: [babelLoaderRule, urlLoaderRule]
  }
};

webpack开发配置

const path = require('path');
const { merge } = require('webpack-merge');
const common = require('./webpack.common.config.js');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const webpack = require('webpack');

module.exports = merge(common, {
  mode: 'development',
  devtool: 'eval-cheap-module-source-map',
  devServer: {
    static: path.join(__dirname, '../dist'),
    port: 3000,
    compress: true,
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: 'public/index.html',
      inject: 'body',
      hash: false,
    }),
    new webpack.DefinePlugin({
      'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'development')
    }),
  ],
  module: {
    rules: [{        
        test: /\.css$/,
        use: [
            'style-loader',
            'css-loader',
            'postcss-loader',
        ]
    }]
  }
});

项目启动命令

"start": "webpack serve --open --config ./config/webpack.dev.config.js",

问题排查与解决方案

1. 未正确挂载路由提供者

在index.js中,你已经创建了router实例,但并未通过RouterProvider将其注入到React应用中,而是直接渲染了<App />。React Router需要通过RouterProvider来管理路由上下文,修改后的render代码如下:

ReactDOM.createRoot(document.getElementById('root'))
  .render(
    <React.StrictMode>
      <RouterProvider router={router} /> {/* 替换原有的<App /> */}
    </React.StrictMode>
  )

2. 缺少HTML5 History模式的服务器配置

createBrowserRouter使用HTML5 History API来管理路由,当直接访问子路由(如/hello)或刷新页面时,webpack-dev-server会尝试去服务器上请求对应的物理文件,而这些文件并不存在,因此会返回"Cannot GET /hello"错误。需要在webpack开发配置的devServer中添加historyApiFallback: true,让所有请求都重定向到index.html:

devServer: {
  static: path.join(__dirname, '../dist'),
  port: 3000,
  compress: true,
  historyApiFallback: true, // 添加这一行
},

完成以上两处修改后,重启开发服务器,访问/hello即可正常显示内容。

内容的提问来源于stack exchange,提问作者Jun Q

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 23:49:58