详解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获取当前屏幕的高度宽度的实现代码
Jul 12 Javascript
JQuery操作Select的Options的Bug(IE8兼容性视图模式)
Apr 21 Javascript
页面js遇到乱码问题的解决方法是和无法转码的情况
Apr 30 Javascript
js四舍五入数学函数round使用实例
May 09 Javascript
javascript拖拽应用实例
Mar 25 Javascript
jquery 遍历数组 each 方法详解
May 25 Javascript
js脚本编写简单刷票投票系统
Jun 27 Javascript
解决Vue.js 2.0 有时双向绑定img src属性失败的问题
Mar 14 Javascript
详解从Vue-router到html5的pushState
Jul 21 Javascript
JavaScript事件发布/订阅模式原理与用法分析
Aug 21 Javascript
浅谈vue中使用编辑器vue-quill-editor踩过的坑
Aug 03 Javascript
JS实现页面鼠标点击出现图片特效
Aug 19 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 清除网页病毒的方法
2008/12/05 PHP
PHP 采集心得技巧
2009/05/15 PHP
mayfish 数据入库验证代码
2010/04/30 PHP
PHP目录函数实现创建、读取目录教程实例
2011/01/13 PHP
PHP 字符串长度判断效率更高的方法
2014/03/02 PHP
Yii框架日志操作图文与实例详解
2019/09/09 PHP
关于IE、Firefox、Opera页面呈现异同 写脚本很痛苦
2009/08/28 Javascript
JavaScript作用域链示例分享
2014/05/27 Javascript
js简单实现点击左右运动的方法
2015/04/10 Javascript
jQuery中使用each处理json数据
2015/04/23 Javascript
BootStrap fileinput.js文件上传组件实例代码
2017/02/20 Javascript
JS利用cookies设置每隔24小时弹出框
2017/04/20 Javascript
基于jQuery实现图片推拉门动画效果的两种方法
2017/08/26 jQuery
Vue.js移动端左滑删除组件的实现代码
2017/09/08 Javascript
vue.js 实现图片本地预览 裁剪 压缩 上传功能
2018/03/01 Javascript
小程序图片长按识别功能的实现方法
2018/08/30 Javascript
vue移动端html5页面根据屏幕适配的四种解决方法
2018/10/19 Javascript
vue组件间的参数传递实例详解
2019/04/26 Javascript
JS获取当前时间的年月日时分秒及时间的格式化的方法
2019/12/18 Javascript
python从ftp下载数据保存实例
2013/11/20 Python
python修改字典内key对应值的方法
2015/07/11 Python
利用Python查看目录中的文件示例详解
2017/08/28 Python
[原创]pip和pygal的安装实例教程
2017/12/07 Python
python3 pygame实现接小球游戏
2019/05/14 Python
Python的赋值、深拷贝与浅拷贝的区别详解
2020/02/12 Python
KIKO MILANO英国官网:意大利知名化妆品和护肤品品牌
2017/09/25 全球购物
迪士尼西班牙官方网上商店:ShopDisney西班牙
2020/02/02 全球购物
使用索引有什么好处
2016/07/27 面试题
简单英文演讲稿
2014/01/01 职场文书
情人节活动策划方案
2014/02/27 职场文书
有趣的广告词
2014/03/18 职场文书
民生工作实施方案
2014/05/31 职场文书
自愿离婚协议书范本
2014/09/13 职场文书
2014年销售工作总结与计划
2014/12/01 职场文书
中班下学期个人工作总结
2015/02/12 职场文书
Python源码解析之List
2021/05/21 Python