详解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 相关文章推荐
javascript call方法使用说明
Jan 11 Javascript
Jquery仿IGoogle实现可拖动窗口示例代码
Aug 22 Javascript
jquery小火箭返回顶部代码分享
Aug 19 Javascript
AngularJS实现数据列表的增加、删除和上移下移等功能实例
Sep 05 Javascript
JavaScript中this的用法实例分析
Dec 19 Javascript
vue的常用组件操作方法应用分析
Apr 13 Javascript
微信小程序判断页面是否从其他页面返回的实例代码
Jul 03 Javascript
a标签调用js的方法总结
Sep 05 Javascript
JS使用H5实现图片预览功能
Sep 30 Javascript
javascript 数组精简技巧小结
Feb 26 Javascript
vue页面引入three.js实现3d动画场景操作
Aug 10 Javascript
在js中修改html body的样式
Nov 11 Javascript
浅谈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
php下关于中英数字混排的字符串分割问题
2010/04/06 PHP
php中explode与split的区别介绍
2012/10/03 PHP
php中fsockopen用法实例
2015/01/05 PHP
yii2 数据库读写分离配置示例
2017/02/10 PHP
PHP7内核CGI与FastCGI详解
2019/04/14 PHP
IE和Mozilla的兼容性汇总event
2007/08/12 Javascript
jQuery Study Notes学习笔记 (二)
2010/08/04 Javascript
原生JS可拖动弹窗效果实例代码
2013/11/09 Javascript
PHP开发者必须掌握的6个关键字
2014/04/14 Javascript
kindeditor修复会替换script内容的问题
2015/04/03 Javascript
JS实现点击按钮控制Div变宽、增高及调整背景色的方法
2015/08/05 Javascript
JavaScript继承模式粗探
2016/01/12 Javascript
jQuery+CSS3+Html5实现弹出层效果实例代码(附源码下载)
2016/05/16 Javascript
详解vue-validator(vue验证器)
2017/01/16 Javascript
jQuery实现的分页功能示例
2017/01/22 Javascript
Vue中通过vue-router实现命名视图的问题
2020/04/23 Javascript
Vue 实现监听窗口关闭事件,并在窗口关闭前发送请求
2020/09/01 Javascript
使用python分析git log日志示例
2014/02/27 Python
python计算时间差的方法
2015/05/20 Python
使用python 对验证码图片进行降噪处理
2019/12/18 Python
Python类super()及私有属性原理解析
2020/06/15 Python
使用django自带的user做外键的方法
2020/11/30 Python
使用CSS3实现input多选框自定义样式的方法示例
2019/07/19 HTML / CSS
JD Sports瑞典:英国领先的运动时尚商店
2018/01/28 全球购物
斐乐美国官方网站:FILA美国
2019/03/01 全球购物
城市规划毕业生求职信
2013/10/10 职场文书
工作表扬信的范文
2014/01/10 职场文书
大学生职业规划论文
2014/01/11 职场文书
银行优秀员工事迹
2014/02/06 职场文书
婚前协议书怎么写
2014/04/15 职场文书
贷款委托书
2014/08/01 职场文书
我的中国梦演讲稿初中篇
2014/08/19 职场文书
八一建军节演讲稿
2014/09/10 职场文书
创业计划书之家教托管
2019/09/25 职场文书
centos7安装mysql5.7经验记录
2022/05/02 Servers
python数字图像处理之对比度与亮度调整示例
2022/06/28 Python