详解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实现列表分页功能特效
May 15 Javascript
jquery实现的伪分页效果代码
Oct 29 Javascript
整理Javascript事件响应学习笔记
Dec 02 Javascript
基于javascript 显式转换与隐式转换(详解)
Dec 15 Javascript
微信小程序收藏功能的实现代码
Jun 12 Javascript
详解使用VUE搭建后台管理系统(vue-cli更新至3.0)
Aug 22 Javascript
原生JS实现的简单小钟表功能示例
Aug 30 Javascript
Vue插槽原理与用法详解
Mar 05 Javascript
vue-cli脚手架打包静态资源请求出错的原因与解决
Jun 06 Javascript
JavaScript自动生成 年月范围 选择功能完整示例【基于jQuery插件】
Sep 03 jQuery
《javascript设计模式》学习笔记三:Javascript面向对象程序设计单例模式原理与实现方法分析
Apr 07 Javascript
VSCode 添加自定义注释的方法(附带红色警戒经典注释风格)
Aug 27 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
评分9.0以上的动画电影,剧情除了经典还很燃
2020/03/04 日漫
zf框架的数据库追踪器使用示例
2014/03/13 PHP
php读取flash文件高宽帧数背景颜色的方法
2015/01/06 PHP
PHP中如何使用session实现保存用户登录信息
2015/10/20 PHP
基于laravel belongsTo使用详解
2019/10/18 PHP
javascript 面向对象编程基础 多态
2009/08/21 Javascript
基于jQuery的固定表格头部的代码(IE6,7,8测试通过)
2010/05/18 Javascript
页面调用单个swf文件,嵌套出多个方法。
2011/11/21 Javascript
js open() 与showModalDialog()方法使用介绍
2013/09/10 Javascript
浅析jquery某一元素重复绑定的问题
2014/01/03 Javascript
json的使用小结
2016/06/08 Javascript
jQuery内存泄露解决办法
2016/12/13 Javascript
vue 引入公共css文件的简单方法(推荐)
2018/01/20 Javascript
Vue.js项目中管理每个页面的头部标签的两种方法
2018/06/25 Javascript
从零开始用electron手撸一个截屏工具的示例代码
2018/10/10 Javascript
Vue拖拽组件列表实现动态页面配置功能
2019/06/17 Javascript
ES6实现图片切换特效代码
2020/01/14 Javascript
JavaScript实现页面高亮操作提示和蒙板
2021/01/04 Javascript
python 从远程服务器下载东西的代码
2013/02/10 Python
python每隔N秒运行指定函数的方法
2015/03/16 Python
python的中异常处理机制
2018/08/30 Python
Python连接Mssql基础教程之Python库pymssql
2018/09/16 Python
提升Python程序性能的7个习惯
2019/04/14 Python
pymysql模块使用简介与示例
2020/11/17 Python
java字符串格式化输出实例讲解
2021/01/06 Python
CSS3+Sprite实现僵尸行走动画特效源码
2016/01/27 HTML / CSS
iframe与window.onload如何使用详解
2020/05/07 HTML / CSS
德国高端单身人士交友网站:ElitePartner
2018/12/02 全球购物
PHP如何去执行一个SQL语句
2016/03/05 面试题
网络公司美工设计工作个人的自我评价
2013/11/03 职场文书
旅游市场营销方案
2014/03/09 职场文书
环境日宣传活动总结
2014/07/09 职场文书
暑假学习心得体会
2014/09/02 职场文书
公司庆典主持词
2015/07/04 职场文书
创业计划书之零食店(进口)
2019/09/24 职场文书
CSS3实现模糊背景的三种效果示例
2021/03/30 HTML / CSS