WebpackDevServer解决单页面应用路由问题

假设我们现在有几个页面
  1. Home页面


    image.png
  2. List页面


    image.png
  3. 还有一个index.js页面,展示的是 Hello World


    image.png
当我们启动服务器,页面显示的是Hello World,但是我们希望,当访问根路径 /的时候,展示的是Home页面,而访问/list路径的时候,展示的是List页面;要实现这种效果,在react种,我们就需要使用单页面路由。步骤如下:
  1. 安装前端路由模块
npm install react-router-dom --save
  1. 修改index.js文件
import React, { Component } from 'react';
import { BrowserRouter, Route } from 'react-router-dom'
import ReactDom from 'react-dom';
import Home from './home.js'
import List from './list.js'

class App extends Component {
    render() {
        return (
            <BrowserRouter>
                <div>
                    <Route path='/' exact component={Home}/>
                    <Route path='/list' component={List}/>
                </div>
            </BrowserRouter>
        )
    }
}

ReactDom.render(<App />, document.getElementById('root'));
  1. 启动服务器,可以看到,直接显示了Home Page
    image.png
  2. 但是当我们访问localhost:8080/list的时候,就会报错,找不到list页面;为什么会这样呢? 原因是当我们访问localhost:8080/list的时候,webpack-dev-server会以为我们访问的是后端的一个叫list的页面,但是我们的文件夹内,只有一个index.html这个页面,并没有list.html这个页面,这种情况下,就会提示我们页面不存在,这也是我们做前端单页应用经常遇到的问题
    image.png
那再webpack-dev-server里,怎么解决这个问题呢?我们还是先看下wepack官网文档
image.png
  • 我们直接这样配置就可以了


    image.png
  • 配置后,我们再重启服务器,访问localhost:8080/list就可以看到内容了,也就是说路由生效了
    image.png
  • 它的原理是,当我们配置了historyApiFallback: true的时候,无论我们访问的是任何一个路径,它都会默默的把对这个路径的请求转换到对根路径的请求。也就是说都会去引入我们的index.html页面,只要引入index.html,它引入的main.js就会执行,而这个main.js就是我们打包过后的代码,就是我们index.js的业务代码,所以它里面的路由就会生效
    image.png
historyApiFallback 还可以配置其他的内容

1.出了上边配置一个布尔类型的值以外,它还可以配置一个 rewrites规则,比如像下边这样的配置,意思就是吗,如果发现访问的是abc.html那么就让页面展示list.html,不过因为我们上边例子目录中并没有list.html所以是访问不到的

image.png

image.png

  1. 我们把配置修改为,当我们访问abc.html,页面展示 index.html,我们的目录里是有这个文件的。会展示吗?重启后,发现也没有展示,但是查看网页源代码时发现index.html内容展示出来了;之所以会这样,是因为index.html里有我们的业务代码,而我们的业务代码里,没有写如果访问abc.html就显示其他的内容的逻辑
    image.png

    image.png

    image.png
  2. 实际上,当我们配置了historyApiFallback: true的时候,就相当于这样配置;访问任何内容都会展示index.html
    image.png
  • 更多的配置,可以到这里去了解


    image.png
注意因为historyApiFallbackdevServer的配置,所以只在开发环境下有效。一旦到了线上环境,就可能出现页面找不到的情况,因为我们在开发环境,通过historyApiFallback配置了跳转的规则,但是后端的服务器很有可能没有配置跳转的规则,这个问题,前端是解决不了的,需要后端的小伙伴去nginx 或者 apache上仿照webpack-dev-server的一些配置,去在他的对应的服务器上去做同样的配置,这样才可以在前端使用路由不会有问题;

所以,上线之前,一定要周知后端去改配置

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前端开发面试题 面试题目: 根据你的等级和职位的变化,入门级到专家级,广度和深度都会有所增加。 题目类型: 理论知...
    怡宝丶阅读 2,606评论 0 7
  • 一.HAProxy介绍 HAProxy: 是法国人Willy Tarreau开发的一个开源软件,是 一款应对客户端...
    楠人帮阅读 1,135评论 0 2
  • 大清早我来到了没有其他人的办公室,打开相册看了很久,当看到一些照片的时候,竟然有点莫名的鼻酸。特别感谢这些瞬间被记...
    张公子在这等你阅读 307评论 0 2
  • 我记得一年前的时候我的确很纠结,到底什么是爱,什么是喜欢,什么是依赖,不断地在知乎和百度上五花八门的回答中寻找答案...
    52赫兹的小六阅读 211评论 0 0
  • 8月18日 星期六 阴转雨 亲子日记 93篇 今天早上,我和大宝一起去送二宝上学,到了门口,...
    开心锁吧阅读 79评论 0 0