当 URL 包含多个路径时,React Router 不工作

IT技术 reactjs webpack react-router
2021-05-16 11:42:57

我正在使用webpack-dev-server进行开发并同样响应路由器。这是我的wepack配置。

const webpack = require('webpack');
const path = require('path');
const common = require('./common.config.js')
const merge  = require('webpack-merge')

const HtmlWebpackPlugin = require('html-webpack-plugin')
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const CleanWebpackPlugin = require('clean-webpack-plugin')

module.exports = merge(common, {
    devtool: 'source-map',
    mode:'development',
    module: {
        rules: [
           {
                test: /\.(sa|sc|c)ss$/,
            use: [
                       {
                  // Adds CSS to the DOM by injecting a `<style>` tag
                  loader: 'style-loader'
                       },
                       {
                          // Interprets `@import` and `url()` like `import/require()` and will resolve them
                          loader: 'css-loader'
                   },
                   {
                          // Loader for webpack to process CSS with PostCSS
                          loader: 'postcss-loader',
                          options: {
                          plugins: function () {
                                return [
                                require('autoprefixer')
                                ];
                                   }
                          }
                       },
               {
                  // Loads a SASS/SCSS file and compiles it to CSS
                  loader: 'sass-loader'
               }
                 ]
           }
        ]
    },
    devServer:{
       contentBase: path.join(__dirname, '../dist'),
       port: 3000,
       proxy:{
          '/api': 'http://127.0.0.1:5000',
       },
       historyApiFallback:true,
       overlay: true,
       stats: 'normal'
    },
    watchOptions: {
       ignored: /node_modules/
    },

    plugins: [
    new CleanWebpackPlugin(['../dist'], { exclude:['sw.js']}),
        new HtmlWebpackPlugin({
            title: 'Script App - Dev',
            filename: '../dist/index.html',
        template:'index_template.html'
        }),
    new MiniCssExtractPlugin({
            filename: 'bundled_styles.css'
        }),
        new webpack.NamedModulesPlugin(),
        new webpack.HotModuleReplacementPlugin()    
    ],
});

这是我的应用程序的入口点(我在其中定义了路由)

import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import {BrowserRouter, Route, Switch} from 'react-router-dom'

import configureStore from './store/configureStore';

import FirstComponent from './FirstComponent';
import SecondComponent from './SecondComponent';
import App from './App';

const store = configureStore();

ReactDOM.render(
    <Provider store={store}>
        <BrowserRouter>
            <App>
               <Switch>
                   <Route path="/first/:a_code" component={FirstComponent} />
                   <Route path="/second" component={SecondComponent} />
               </Switch>
            </App>
        </BrowserRouter>
    </Provider>,

    document.getElementById('root')
);

我正在使用react-router v4wepack v4.29

我的问题:当我使用historyprop从我的代码中推送路由时,一切正常,但是当我用路由刷新浏览器时,一切都变成空白。此行为仅在具有多条路径( /first/:param)的路由中观察到

我尝试过的:我从一些 SO 帖子中读到,我必须将historyApiFallbackwebpack 配置中属性设置true,我做了但它仍然没有帮助。这个 github 问题中的评论之一说,historyApiFallback如果proxywebpack 配置中的某些配置可用它将无法正常工作

我不想删除这些proxy配置,因为我正在对在不同端口上运行的另一台服务器进行 api 调用。

谁可以帮我这个事?请!

2个回答

我实际上错过了 webpack 配置。我不得不添加一个output配置并将其设置publicPath/. IE

output:{
  publicPath: '/'
}

我还添加了publicPathdevServer配置。IE

devServer:{
  ...
  publicPath:'/',
  historyApiFallback: true
}

更新:

同样确保您的bundle.js脚本插入到您的 html 文件中,如下所示:

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

并不是

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

我遇到了类似的情况,我使用 render: func 解决了这个问题,这避免了在位置匹配时重新安装组件。

所以我的路线看起来像这样

<Route
  path="/first/:a_code"
  render={props => 
    <FirstComponent {...props}/>
  }
/>

然后在我的组件中我得到了匹配的参数

const first_component = (props) => {
  return (
    <div>
      {props.match.params.a_code}
    </div>
  )
}

在 url "/first/something" 我可以刷新浏览器并仍然获得所需的参数,并且没有任何错误或空白页面。我不相信这是一个配置问题,因为到目前为止我还没有弹出这个项目中的 webpack 配置。