详解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 相关文章推荐
一个简单的Ext.XTemplate的实例代码
Mar 18 Javascript
javascript根据像素点取位置示例
Jan 27 Javascript
javascript获取web应用根目录的方法
Feb 12 Javascript
js打开新窗口方法整理
Feb 17 Javascript
Web表单提交之disabled问题js解决方法
Jan 13 Javascript
使用JavaScript实现连续滚动字幕效果的方法
Jul 07 Javascript
JS实现从网页顶部掉下弹出层效果的方法
Aug 06 Javascript
vue中v-for循环给标签属性赋值的方法
Oct 18 Javascript
NProgress显示顶部进度条效果及使用详解
Sep 21 Javascript
jQuery插件simplePagination的使用方法示例
Apr 28 jQuery
vue实现移动端触屏拖拽功能
Aug 21 Javascript
vue-cropper组件实现图片切割上传
May 27 Vue.js
浅谈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
杏林同学录(八)
2006/10/09 PHP
奇怪的PHP引用效率问题分析
2012/03/23 PHP
php预定义变量使用帮助(带实例)
2013/10/30 PHP
Yii核心组件AssetManager原理分析
2014/12/02 PHP
PHP简单的MVC框架实现方法
2015/12/01 PHP
PHP一个简单的无需刷新爬虫
2019/01/05 PHP
PHP让网站移动访问更加友好方法
2019/02/14 PHP
js实现的网页颜色代码表全集
2007/07/17 Javascript
javascript 获取图片颜色
2009/04/05 Javascript
jquery DIV撑大让滚动条滚到最底部代码
2013/06/06 Javascript
鼠标滚轴控制文本框值的JS代码
2013/11/19 Javascript
jQuery函数的第二个参数获取指定上下文中的DOM元素
2014/05/19 Javascript
JavaScript弹出窗口方法汇总
2014/08/12 Javascript
javascript格式化json显示实例分析
2015/04/21 Javascript
详解windows下vue-cli及webpack 构建网站(三)使用组件
2017/06/17 Javascript
关于js中的鼠标事件总结
2017/07/11 Javascript
基于Vue的移动端图片裁剪组件功能
2017/11/28 Javascript
在Vue中使用highCharts绘制3d饼图的方法
2018/02/08 Javascript
详解webpack运行Babel教程
2018/06/13 Javascript
bootstrap 弹出框modal添加垂直方向滚轴效果
2018/07/09 Javascript
使用vue实现各类弹出框组件
2019/07/03 Javascript
Javascript实现关闭广告效果
2021/01/29 Javascript
python+selenium实现163邮箱自动登陆的方法
2017/12/31 Python
python pandas 对时间序列文件处理的实例
2018/06/22 Python
Pytorch十九种损失函数的使用详解
2020/04/29 Python
六种酷炫Python运行进度条效果的实现代码
2020/07/17 Python
使用html5+css3来实现slider切换效果告别javascript+css
2013/01/08 HTML / CSS
购买限量版收藏品、珠宝和礼品:Bradford Exchange
2016/09/23 全球购物
Nike澳大利亚官网:Nike.com (AU)
2019/06/03 全球购物
印度手工编织服装和家居用品商店:Fabindi
2019/10/07 全球购物
法制报告会主持词
2014/04/02 职场文书
离婚协议书怎么写
2014/09/12 职场文书
学校开学标语
2014/10/06 职场文书
2014年高中教师工作总结
2014/12/19 职场文书
2015暑期爱心支教策划书
2015/07/14 职场文书
mysql幻读详解实例以及解决办法
2022/06/16 MySQL