反应路由器,在 webpack 中使用 historyApiFallback true 重新加载 404

Posted

技术标签:

【中文标题】反应路由器,在 webpack 中使用 historyApiFallback true 重新加载 404【英文标题】:React router, 404 on reload with historyApiFallback true in webpack 【发布时间】:2017-10-13 11:40:33 【问题描述】:

我正在使用 react-router-bootstrap 和 react-router V4,以及用于开发的 Webpack

我的问题是我创建了 /services/firstService 之类的路径,但在重新加载时它给出了 404

我得到了我的 index.js

ReactDOM.render(
    <Router>
        <App />
    </Router>
    , document.getElementById('container'));

然后是我的 App.jsx,这是我的“主要”组件

export default class App extends React.Component 
    render() 
        return (
            <div>
                <Navigation/>
                <div className="content">
                    <Route exact=true path="/" component=Home/>
                    <Route exact=true path="/home" component=Home/>
                    <Route path="/services" component=Services/>
                    <Route path="/infos" component=Infos/>
                    <Route path="/contacts" component=Contacts/>
                    <Route path="/basic" component=BasicComponent/>
                </div>
            </div>
        );
    

导航组件只是一个 react-router-bootstrap/react-bootstrap 链接

export default class Navigation extends React.Component 
    render() 
        return (
            <Navbar>
                <Nav>
                    <LinkContainer to="/home">
                        <NavItem eventKey=1>Home</NavItem>
                    </LinkContainer>
                    <LinkContainer to="/services">
                        <NavItem eventKey=2>Services</NavItem>
                    </LinkContainer>
                    <LinkContainer to="/infos">
                        <NavItem eventKey=3>Infos</NavItem>
                    </LinkContainer>
                    <LinkContainer to="/contacts">
                        <NavItem eventKey=4>Contacts</NavItem>
                    </LinkContainer>
                </Nav>
            </Navbar>
        );
    

Services 组件是我想要显示组件 FirstService 并将路径更改为 /services/firstService 的地方,对于 secondService 也是如此

export default class Services extends React.Component 
    constructor(props) 
        super( props );
    

    render() 
        return (
            <div>
                ul/li
                <Link to=`$this.props.match.url/firstService`>
                    firstService
                </Link>
                <Link to=`$this.props.match.url/firstService`>
                    firstService
                </Link>
                ul/li
                <Route path=`$this.props.match.url/firstService` component=FirstService/>
                <Route path=`$this.props.match.url/secondService` component=SecondService/>
            </div>
        );
    

由于它是另一个组件,this.props 需要在 match.url 前面(这是我的第一个问题)

但是现在,如果我重新加载页面,我会收到以下消息:

'GET localhost:8080/services/index_bundle.js 404 (Not Found)'

我的 webpack.config.js

/*
./webpack.config.js
*/
const path = require('path');
const htmlWebpackPlugin = require('html-webpack-plugin');

const HtmlWebpackPluginConfig = new HtmlWebpackPlugin(
    template: './src/index.html'
)

module.exports = 
    entry: './src',
    output: 
        path: __dirname + "/builds",
        filename: 'index_bundle.js'
    ,
    module: 
        loaders: [
             test: /\.js$/, loader: 'babel-loader', exclude: /node_modules/ ,
             test: /\.jsx$/, loader: 'babel-loader', exclude: /node_modules/ ,
             test: /\.scss$/, loaders: ['style-loader', 'css-loader', 'sass-loader']
        ]
    ,
    plugins: [HtmlWebpackPluginConfig],
    devServer: 
        historyApiFallback: true
    

【问题讨论】:

【参考方案1】:

index.html 文件中的包导入从相对路径 &lt;script src="index_bundle.js"&gt;&lt;/script&gt; 更改为绝对路径 &lt;script src="/index_bundle.js"&gt;&lt;/script&gt;。当你 GET services 路由时,你的包相对于 url 路径('/services')被加载并且无处可寻(404 Not Found)。

【讨论】:

我刚刚注意到一些东西,似乎有东西已经将脚本注入到我的 index.html 中,我现在有两个脚本:&lt;body&gt; &lt;div id="container"/&gt; &lt;script src="/index_bundle.js"&gt;&lt;/script&gt; &lt;script type="text/javascript" src="index_bundle.js"&gt;&lt;/script&gt;&lt;/body&gt; 所以我仍然有一个错误 404 但因为那个是在绝对路径中它可以工作......我不知道脚本是在哪里注入的,所以我无法将其修改为绝对路径 我用那个确切的链接弄明白了,我的小应用程序已经完成,我只需要学习如何在网络上部署 ReactJS 应用程序。【参考方案2】:

确保在index.html 中设置正确的base tag:&lt;base href="/"&gt;

【讨论】:

以上是关于反应路由器,在 webpack 中使用 historyApiFallback true 重新加载 404的主要内容,如果未能解决你的问题,请参考以下文章

如何使用反应路由器 dom v4 配置 webpack 开发服务器?

React slingshot - 使用反应路由器子路由时,Webpack 热中间件在 hot-update.json 上返回 404

反应路由器+ webpack,子路由不起作用

启用单页应用响应热重载 webpack

反应路由和django url冲突

使用 Sass 反应服务器端渲染