【问题标题】:React Router routes not working from URLReact Router 路由无法从 URL 工作
【发布时间】:2018-04-09 07:23:15
【问题描述】:

我有一个具有以下路线的应用程序:

export default class Content extends Component {
    constructor() {
        super();
    }
    render() {
        return (
            <Switch>
                    <Route exact path='/' component={Home}/>
                    <Route path='/restaurant/:id' component={Restaurant}/>
                    <Route path='/admin' component={Admin}/>
            </Switch>
        )
    }
}

路线在应用程序中运行良好。例如,如果我运行我的 live-server 命令,它会在http://127.0.0.1:8080/ 中弹出并运行路由。从那里我可以单击一个链接并带我到其他路线。但是,如果我尝试通过 url 去那里,它会给我一个“无法获取/路由”错误。

当我尝试在这些路由上进行表单提交时,这是一个问题,因为重定向到其自身不再起作用。

我正在使用 webpack 并阅读了与它有关的内容,但没有找到解决方案。

这是我的 webpack:

var path = require('path');
var webpack = require('webpack');

module.exports = {
    entry: [
        './src/app.jsx', './src/sass/main.scss', './src/index.js'
    ],
    output: {
        path: __dirname + "/src",
        filename: 'bundle.min.js',
    },
    plugins: [
        new webpack.DefinePlugin({ // <-- key to reducing React's size
            'process.env': {
                'NODE_ENV': JSON.stringify('development')
            }
        })
        // new webpack.optimize.UglifyJsPlugin(), //minify everything new
        // webpack.optimize.AggressiveMergingPlugin(), //Merge chunks
    ],
    watch: true,
    module: {
        loaders: [{
            test: /.jsx?$/,
            loader: 'babel-loader',
            exclude: /node_modules/,
            query: {
                presets: ['es2015', 'react']
            }
        }, { // regular css files
            test: /\.scss$/,
            loader: 'style-loader!css-loader!sass-loader'
        }]
    }
};

我没有使用任何服务器,这是我第一次使用路由,所以我很困惑。我使用 live-server 来部署我的 react 应用程序和 webpack 来构建和捆绑我的 scss 和 jsx 等。

感谢您的帮助!

【问题讨论】:

    标签: reactjs webpack react-router


    【解决方案1】:

    在集成 react-router 之前,您需要配置您的备用网址:因此,如果您使用 webpack 为您的应用程序提供服务,请将以下内容添加到您的 webpack 配置中:

    devServer: {
      historyApiFallback: true
    }
    

    在 React 应用程序中,通常您会将 &lt;Route /&gt; 包装在 &lt;Router /&gt; 中,这样当 URL 更改时,&lt;Router /&gt; 将匹配其路由的一个分支,并呈现其配置的组件。执行以下操作:

    import { BrowserRouter as Router, Route } from 'react-router-dom';
    
    export default class Content extends Component {
     constructor() {
       super();
     }
     render() {
      return (
        <Router>
          <div>
            <Switch>
                <Route exact path='/' component={Home}/>
                <Route path='/restaurant/:id' component={Restaurant}/>
                <Route path='/admin' component={Admin}/>
            </Switch>
          </div>
        </Router>
    )}
    }
    

    【讨论】:

    • 是的,我在另一个调用 Content 组件的组件中有它。我尝试使用 devServer 后备,但我使用的是实时服务器而不是 webpack 开发服务器,因为当我尝试使用 webpack 开发服务器时,我得到了无法获取/错误。
    【解决方案2】:

    对于开发环境,您需要设置 webpack-dev-server 来处理您的反应路线,将其安装到您的依赖项中。

    那么在package.jsonscripts部分启动脚本应该是这样的:

    "scripts": {
       "start": "webpack-dev-server --watch"
    }
    

    然后在 webpack 配置对象的根目录下设置 devServer:

    devServer: {
      hot: true,
      contentBase: './',
      historyApiFallback: true
    },
    

    对于生产,您需要编写自己的 ssr 或使用任何 ssr 库,例如 next.js

    【讨论】:

    • 这不起作用,当我运行服务器时,甚至我的索引页面也没有使用这个命令显示。我的主管是这样的:node_module webpack.js src,在 src 中是我的 index.html 和 index.js 以及 webpack 创建的 bundle.min.js。我不确定这是否有帮助
    • 在 index.html 中你需要包含 bundle.min.js(它是从 webpack 输出的)然后移动到 localhost:8080 或者你的自定义端口
    【解决方案3】:

    在这样的应用程序(仅前端)中,问题是浏览器无法处理 /any-route,因为它们不存在,因此它返回您看到的错误。

    要解决这个问题,开发工具中有一些选项,例如 live-server 中的 entry-file

    根据它的描述,它应该可以完成这项工作。

    --entry-file=PATH - serve this file (server root relative) in place of missing files (useful for single page apps)
    

    【讨论】:

    • 我在哪里添加这个?可以发个例子吗
    • 为了发布一个更好的例子,您能否更新您的问题以显示您如何运行您的项目?
    猜你喜欢
    • 2022-12-04
    • 1970-01-01
    • 2022-08-02
    • 2019-12-11
    • 2021-09-26
    • 2017-03-10
    • 2018-01-06
    • 1970-01-01
    • 2022-01-21
    相关资源
    最近更新 更多