详解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 相关文章推荐
js计数器代码
Nov 04 Javascript
jquery实现一个简单好用的弹出框
Sep 26 Javascript
jQuery插件简单学习实例教程
Jul 01 Javascript
获取JavaScript异步函数的返回值
Dec 21 Javascript
旺旺在线客服代码 旺旺客服代码生成器
Jan 09 Javascript
VUE Error: getaddrinfo ENOTFOUND localhost
May 03 Javascript
解决vue接口数据赋值给data没有反应的问题
Aug 27 Javascript
Vue $mount实战之实现消息弹窗组件
Apr 22 Javascript
Vue.use()在new Vue() 之前使用的原因浅析
Aug 26 Javascript
js找出5个数中最大的一个数和倒数第二大的数实现方法示例小结
Mar 04 Javascript
解决vue项目运行npm run serve报错的问题
Oct 26 Javascript
详解Vue的mixin策略
Nov 19 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
PHP 万年历实现代码
2012/10/18 PHP
php简单日历函数
2015/10/28 PHP
Yii2 hasOne(), hasMany() 实现三表关联的方法(两种)
2017/02/15 PHP
JavaScript 创建运动框架的实现代码
2013/05/08 Javascript
js 用CreateElement动态创建标签示例
2013/11/20 Javascript
Javascript保存网页为图片借助于html2canvas库实现
2014/09/05 Javascript
20条学习javascript的编程规范的建议
2014/11/28 Javascript
jquery限定文本框只能输入数字(整数和小数)
2016/01/08 Javascript
jquery解析XML及获取XML节点名称的实现代码
2016/05/18 Javascript
BootStrap 智能表单实战系列(二)BootStrap支持的类型简介
2016/06/13 Javascript
jQuery 调用WebService 实例讲解
2016/06/28 Javascript
String字符串截取的四种方式总结
2016/11/28 Javascript
js正则表达式惰性匹配和贪婪匹配用法分析
2016/12/26 Javascript
Bootstrap进度条与AJAX后端数据传递结合使用实例详解
2017/04/23 Javascript
JS实现多张图片预览同步上传功能
2017/06/23 Javascript
js实现网页的两个input标签内的数值加减(示例代码)
2017/08/15 Javascript
nodejs超出最大的调用栈错误问题
2017/12/27 NodeJs
angular第三方包开发整理(小结)
2018/04/19 Javascript
基于vue+element实现全局loading过程详解
2020/07/10 Javascript
进一步探究Python中的正则表达式
2015/04/28 Python
python常用函数详解
2016/09/13 Python
python通过pip更新所有已安装的包实现方法
2017/05/19 Python
python 显示数组全部元素的方法
2018/04/19 Python
python email smtplib模块发送邮件代码实例
2018/04/26 Python
python列表插入append(), extend(), insert()用法详解
2019/09/14 Python
Python Print实现在输出中插入变量的例子
2019/12/25 Python
Python解释器及PyCharm工具安装过程
2020/02/26 Python
python读取图像矩阵文件并转换为向量实例
2020/06/18 Python
使用layui框架实现点击左侧导航切换右侧内容且右侧选项卡跟随变化的效果
2020/11/10 HTML / CSS
Nike加拿大官网:Nike.com (CA)
2019/04/09 全球购物
总务岗位职责
2013/11/19 职场文书
国际贸易个人求职信范文
2014/01/04 职场文书
汽车检测与维修专业求职信
2014/07/04 职场文书
旅游活动总结
2014/08/27 职场文书
2015法院个人工作总结范文
2015/05/25 职场文书
opencv检测动态物体的实现
2021/07/21 Python