关于React部署服务器中有关BrowserRouter和HashRouter的使用

前言

在新版本的React中,Router组件被拆分为BrowserRouter,HashRouter,createMemoryHistory,虽然更加的规范,但也带来了更多的问题。

问题

本来项目开始我用的是BrowserRouter做路由跳转,在开发环境下完全没有问题。但当部署到服务器上时,只有首页加载正常,当跳转路由时,便找不到路径,报404。

Browserhistory ,Hashhistory 介绍

BrowserRouter使用的是Browserhistory ,而HashRouter使用的是Hashhistory

1.Browser history

是使用 React Router 的应用推荐的 history。它使用浏览器中的 History API 用于处理 URL,创建一个像example.com/some/path这样真实的 URL 。每当进行路由跳转时,他都会将url发送给服务器进行请求。

2.Hash history

使用 URL 中的 hash(#)部分去创建形如 example.com/#/some/path 的路由。主要原理是通过监听 # 后的 URL 路径标识符的更改而触发的浏览器 hashchange 事件,然后通过获取 location.hash 得到当前的路径标识符,再进行一些路由跳转的操作。他不会给服务器发送请求

所以出现404的原因就在于,在browserHistory 模式下,URL 是指向真实 URL 的资源路径,当通过真实 URL 访问网站的时候,由于路径是指向服务器的真实路径,但该路径下并没有相关资源,所以用户访问的资源不存在。

原因

在综合了网上大部分博客后得出,BrowserRouter在开发环境下是没问题的,webpack的配置里面已经做了处理。但是服务器环境下是直接访问了服务器的真实路径,然而这路径没有,就产生了404的问题。

解决方法

1.使用HashRouter:

将代码中的BrowserRouter改为HashRouter,通过‘#’访问,使其路径不会发给服务器,实现正常的跳转。

2.BrowserRouter

方法一如果是个人项目的话是可以这么做的,而实际生产生活中,是不推荐使用‘#’来进行路由的跳转,路由的跳转还是用真实路径较为规范,而且React官方也是主推使用BrowserRouter。

所以,我们通过nginx配置,把找不到的路由,都返回index.html,这样刷新后,利用浏览器缓存,js会根据路由,控制应该那个页面显示。配置如下:

location / {
	   try_files $uri /index.html;
 }

参考资料:
http://react-guide.github.io/react-router-cn/docs/guides/basics/Histories.html

猜你喜欢

转载自blog.csdn.net/weixin_43896829/article/details/110074446