在带有 webpack 的 React-Router 中使用嵌套路由的问题

Posted

技术标签:

【中文标题】在带有 webpack 的 React-Router 中使用嵌套路由的问题【英文标题】:Issue using nested routes in React-Router with webpack 【发布时间】:2016-01-07 14:52:53 【问题描述】:

我已经做了一些谷歌搜索,但在这个问题上无济于事。目前我使用 React-Router 进行了以下设置

Router.run(routes, Router.HistoryLocation, function(Handler) 
  React.render(<Handler />, document.getElementById('app'));
);


export default (
  <Route path="/" handler=App>
    <Route path="" handler=Home />
    <Route path="create-job" handler=CreateJob />
    <Route path="jobs" handler=JobStatuses />
    <Route path="job/:jobId" handler=Job />
  </Route>
); 

我还有以下webpack.config.js 文件。

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

module.exports = 
    entry: [
        path.resolve(__dirname, 'app', 'main.js')
    ],
    output: 
        path: path.join(__dirname, 'static'),
        publicPath: "static/",
        filename: 'bundle.js'
    ,
    module: 
        loaders: [
             test: path.join(__dirname, 'app'), loaders: ["react-hot", "babel?stage=0"] ,
             test: /\.woff(2)?(\?v=[0-9]\.[0-9]\.[0-9])?$/, loader: "url-loader?limit=10000&minetype=application/font-woff" ,
             test: /\.(ttf|eot|svg|png)(\?v=[0-9]\.[0-9]\.[0-9])?$/, loader: "file-loader" 
        ]
    ,
    plugins: [
        // Avoid publishing files when compilation failed
        new webpack.NoErrorsPlugin()
    ],
    stats: 
        // Nice colored output
        colors: true
    ,
    devServer: 
        historyApiFallback: true,
        proxy:  "\/api\/*": "http://localhost:8888" 
    ,
    // Create Sourcemaps for the bundle
    devtool: 'source-map'
;

index.html

<!doctype html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Project Hippo</title>
  </head>
  <body>
    <div id="app"></div>
    <script src="./static/bundle.js"></script>
  </body>
</html>

现在,当我转到带有 http:localhost:8080/job/0001 的以下网址时,由于无法找到 http:localhost:8080/job/static/bundle.js 而出现 404 错误

我觉得我只是缺少一些相当简单的东西。

另一方面,这完全是客户端路由。

【问题讨论】:

【参考方案1】:

很高兴知道你的目录结构。

从您的 webpack.config.jspublicPath,您的 javascript 文件被捆绑到 http://localhost:8080/static/bundle.js

但是您在 index.html 文件中设置了相对路径 (./static/bundle.js)。

这就是为什么当您访问 http://localhost:8080/jobs/0001 时,您的浏览器会尝试在 http://localhost:8080/jobs/static/bundle.js 中查找您的 bundle.js。

所以在 index.html 中设置脚本源以使用绝对路径,即

&lt;script src="/static/bundle.js"&gt;&lt;/script&gt;

你应该没事的。

【讨论】:

【参考方案2】:

这是因为您的publicPath相对。将您的公共路径更改为绝对路径,如下所示:

output: 
            path: path.join(__dirname, 'static'),
            publicPath: "/static/",
            filename: 'bundle.js'
,

【讨论】:

以上是关于在带有 webpack 的 React-Router 中使用嵌套路由的问题的主要内容,如果未能解决你的问题,请参考以下文章

webpack3终极配置及其优化(react)

如何使用 react-route 链接刷新页面

在react-route r中设置params的类型

采用reactjs 开发时,redux 和 react-route 是怎么配合使用的

React-Route的属性exact

react-route动态路由,它的子路由路径配置在啥地方