React Router 4嵌套路由在Webpack 3上无法正常工作

9
正如标题所示,我无法获得像这样的路由。
<Route path="/events/:id" component={EventDetailRoute} />

工作起来,据我所读,似乎在 index.html 中的捆绑包必须是绝对路径,但是我正在使用 HtmlWebpackPlugin,因此捆绑包被注入为相对路径。
我尝试将 webpack 的输出配置设置如下:
output: {
    path: path.resolve('dist'),
    filename: 'index_bundle.js',
    publicPath: '/'
},

但是那也行不通。
如果我尝试这个路由:http://localhost:8080/events/7,当我试图找到http://localhost:8080/events/index_bundle.js时,会出现404错误
这是我的webpack.config
const path = require('path'),
    HtmlWebpackPlugin = require('html-webpack-plugin'),
    webpack = require('webpack');

const HtmlWebpackPluginConfig = new HtmlWebpackPlugin({
    template: './src/index.html',
    filename: 'index.html',
    inject: 'body'
})

module.exports = {
    entry: './src/index.js',
    output: {
        path: "/" + path.resolve('dist', 'build'),
        filename: 'index_bundle.js',
        publicPath: '/'
    },
    devServer: {
        historyApiFallback: true,
        hot: true,
        publicPath: '/'
    },
    module: {
        rules: [
            {
                test: /\.jsx?$/,
                loader: 'babel-loader',
                exclude: /node_modules/
            },
            {
                test: /\.scss$/,
                use: [
                    {
                        loader: 'style-loader'
                    },
                    {
                        loader: 'css-loader',
                        options: {
                            modules: true,
                            camelCase: 'dashes',
                            localIdentName: '[name]__[local]'
                        }
                    },
                    {
                        loader: 'resolve-url-loader'
                    },
                    {
                        loader: 'sass-loader'
                    }
                ]
            },
            {
                test: /\.css$/,
                use: [
                    { loader: 'style-loader' },
                    { loader: 'css-loader' },
                ]
            },
            {
                test: /\.(eot|svg|ttf|woff|woff2)$/,
                use: {
                    loader: 'file-loader?name=[name].[ext]&outputPath=fonts/',
                }
            },
            {
                test: /\.(png|jpg)$/,
                use: {
                    loader: 'file-loader?name=[name].[ext]&outputPath=assets/',
                }
            }
        ]
    },
    plugins: [
        HtmlWebpackPluginConfig,
        new webpack.HotModuleReplacementPlugin(),
        new webpack.NamedModulesPlugin()
    ]
}

我正在使用 webpack 3.1.0,webpack-dev-server 2.5.1 和 react-router-dom 4.1.1。

你能描述一下"doesn't work"是什么意思吗?当你加载"/"并使用"<Link to="events/2" />"时会发生什么? - azium
@azium,我编辑了这个问题并添加了更多关于错误的细节。 - Sebastian Hernandez
2个回答

33

<base href="/" />添加到您的index.html文件的head标签中。

<head>
    <meta charset="utf-8">
    <title>React App Setup</title>
    <base href="/" />
</head>

5
救命建议。谢谢 - Thierry Prost
最好的,你节省了我的时间。非常感谢。 - Mehadi Hassan
2
你能否简要解释一下答案?为什么它会失败,以及这行代码是用来解决问题的? - Michael Jaison G
可以运行,但是怎么运行的呢?有人能详细解释一下吗? - DarkTrick

0

我尝试了<base href="/" />这个解决方案。它对我的bundle文件有效,但对我的css无效。后来我发现了真正的问题。我的两条路径都是相对路径,所以重新加载会导致它们加载到错误的路径。

解决方案

  <head>
    <link rel="stylesheet" href="/index.css" />
  </head>
  <body>
    <div id="app"></div>
    <script src="/bundle.js"></script>
  </body>

请注意,非相对路径 /index.css/bundle.js。之前它们是 ./index.css./bundle.js


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接