详解react-router 4.0 下服务器如何配合BrowserRouter


Posted in Javascript onDecember 29, 2017

react-router作为react框架路由解决方案在react项目中举足轻重。

在react-router 4.0版本中,API与先前版本相比有了很大的修改,在2.0、3.0中常用的<Router>组件作为路由底层配置组件不再常用,取而代之的是四个各有不同的路由组件:

<BrowserRouter>, <HashRouter>, <MemoryRouter>, <StaticRouter>

其中<MemoryRouter>组件在内存中保存“URL”信息,不会修改浏览器的地址栏,往往用于React Native或测试环境等非浏览器环境。

而<StaticRouter>组件从名字能看出它从不修改路由,这在服务器端渲染时很有用。

<HashRouter>组件我们最为熟悉的路由组件不用再多赘述,这里来说说我在使用react-router推荐的<BrowserRouter>时遇到的坑。

<BrowserRouter>

<BrowserRouter>和<HashRouter>都可以实现前端路由的功能,区别是前者基于rul的pathname段,后者基于hash段。

前者:http://127.0.0.1:3000/article/num1

后者:http://127.0.0.1:3000/#/article/num1(不一定是这样,但#是少不了的)

这样的区别带来的直接问题就是当处于二级或多级路由状态时,刷新页面,<BrowserRouter>会将当前路由发送到服务器(因为是pathname),而<HashRouter>不会(因为是hash段)。

我们当然不希望前端路由被发送到后台。

在react-router 4.0 的文档中有这样一段话:

注意: 使用 hash 的方式记录导航历史不支持 location.key 和 location.state。 在以前的版本中,我们为这种行为提供了 shim,但是仍有一些问题我们无法解决。 任何依赖此行为的代码或插件都将无法正常使用。 由于该技术仅用于支持传统的浏览器,因此在用于浏览器时可以使用 <BrowserHistory> 代替。

这就要求服务器要配合前端做一些简单的修改。

修改的思想就是当收到请求的url不是功能性的,而是前端路由时,重新加载入口html文件(我的后台是nodejs)。

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  //判断是主动导向404页面,还是传来的前端路由。
 //如果是前端路由则如下处理

  fs.readFile(__dirname + '/public/dist/index.html', function(err, data){
    if(err){
      console.log(err);
      res.send('后台错误');
    } else {
      res.writeHead(200, {
        'Content-type': 'text/html',
        'Connection':'keep-alive'
      });
      res.end(data);
    }
  })
});

此处踩坑无数,在网上搜索方法后换用nginx,使用try_files字段定向到入口html,但是重定向后,webpack打包的js文件没有执行。

在查看firebug时发现此次刷新的响应头中设置了"Connection":"keep-alive";

觉得问题应该出在这里,换用nodejs用200状态配合keep-alive果然解决了问题。

在react-router 4.0 多级路由下刷新页面不会再404,而是保存了前端状态。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于jquery的一个图片hover的插件
Apr 24 Javascript
JS批量修改PS中图层名称的方法
Jan 26 Javascript
jquery选择器之内容过滤选择器详解
Jan 27 Javascript
javascript怎么禁用浏览器后退按钮
Mar 27 Javascript
超棒的响应式布局jQuery插件Freetile.js
Nov 17 Javascript
深入理解jquery自定义动画animate()
May 24 Javascript
原生JS实现网络彩票投注效果
Sep 25 Javascript
JavaScript hasOwnProperty() 函数实例详解
Aug 04 Javascript
详解基于 axios 的 Vue 项目 http 请求优化
Sep 04 Javascript
高性能的javascript之加载顺序与执行原理篇
Jan 14 Javascript
Vue.js组件使用props传递数据的方法
Oct 19 Javascript
JQuery插件tablesorter表格排序实现过程解析
May 28 jQuery
浅谈react-router HashRouter和BrowserRouter的使用
Dec 29 #Javascript
javaScript 连接打印机,打印小票的实例
Dec 29 #Javascript
深入浅析vue组件间事件传递
Dec 29 #Javascript
详解Vue 事件修饰符capture 的使用
Dec 29 #Javascript
react-router browserHistory刷新页面404问题解决方法
Dec 29 #Javascript
node简单实现一个更改头像功能的示例
Dec 29 #Javascript
JavaScript 中使用 Generator的方法
Dec 29 #Javascript
You might like
火影忍者:这才是千手柱间和扉间的真正死因,角都就比较搞笑了!
2020/03/10 日漫
php上传文件中文文件名乱码的解决方法
2013/11/01 PHP
PHP框架实现WebSocket在线聊天通讯系统
2019/11/21 PHP
提高 DHTML 页面性能
2006/12/25 Javascript
javascript 操作cookies及正确使用cookies的属性
2009/10/15 Javascript
JavaScript面向对象(极简主义法minimalist approach)
2012/07/17 Javascript
js解析与序列化json数据(一)json.stringify()的基本用法
2013/02/01 Javascript
Jquery 监视按键,按下回车键触发某方法的实现代码
2014/05/11 Javascript
jquery调整表格行tr上下顺序实例讲解
2016/01/09 Javascript
Node.js环境下编写爬虫爬取维基百科内容的实例分享
2016/06/12 Javascript
js基础之DOM中document对象的常用属性方法详解
2016/10/28 Javascript
jQuery实现遍历复选框的方法示例
2017/03/06 Javascript
Vue 2.0学习笔记之Vue中的computed属性
2017/10/16 Javascript
用node-webkit把web应用打包成桌面应用(windows环境)
2018/02/01 Javascript
浅谈vue项目如何打包扔向服务器
2018/05/08 Javascript
layer弹出层取消遮罩的方法
2019/09/25 Javascript
[01:34]2016国际邀请赛中国区预选赛IG战队教练采访
2016/06/27 DOTA
Python实现配置文件备份的方法
2015/07/30 Python
Python实现Linux中的du命令
2017/06/12 Python
Python3.4实现从HTTP代理网站批量获取代理并筛选的方法示例
2017/09/26 Python
Window 64位下python3.6.2环境搭建图文教程
2018/09/19 Python
Python二叉树的镜像转换实现方法示例
2019/03/06 Python
django admin组件使用方法详解
2019/07/19 Python
python实现socket+threading处理多连接的方法
2019/07/23 Python
Python中类似于jquery的pyquery库用法分析
2019/12/02 Python
Django REST 异常处理详解
2020/07/15 Python
酒店总经理岗位职责
2014/03/17 职场文书
小学生评语集锦
2014/04/18 职场文书
放飞梦想演讲稿
2014/05/05 职场文书
学雷锋标兵事迹材料
2014/08/18 职场文书
群众路线领导对照材料
2014/08/23 职场文书
网上祭先烈心得体会
2014/09/01 职场文书
2014年医院十一国庆节活动方案
2014/09/15 职场文书
班子群众路线教育实践个人对照检查材料思想汇报
2014/09/30 职场文书
统计员岗位职责范本
2015/04/14 职场文书
Mysql开启外网访问
2022/05/15 MySQL