详解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 相关文章推荐
parseInt parseFloat js字符串转换数字
Aug 01 Javascript
疯狂Jquery第一天(Jquery学习笔记)
May 11 Javascript
js获取或设置当前窗口url参数的小例子
Oct 14 Javascript
浅谈Unicode与JavaScript的发展史
Jan 19 Javascript
javascript实现汉字转拼音代码分享
Apr 20 Javascript
在JavaScript中如何解决用execCommand(
Oct 19 Javascript
JavaScript运行过程中的“预编译阶段”和“执行阶段”
Dec 16 Javascript
JQuery给select添加/删除节点的实现代码
Apr 26 Javascript
jQuery插件echarts实现的多折线图效果示例【附demo源码下载】
Mar 04 Javascript
基于vue实现可搜索下拉框定制组件
Mar 26 Javascript
爬虫利器Puppeteer实战
Jan 09 Javascript
JS实现电话号码的字母组合算法示例
Feb 26 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中current、next与reset函数用法实例
2014/11/17 PHP
PHP上传文件时自动分配路径的方法
2015/01/09 PHP
PHP 实现类似js中alert() 提示框
2015/03/18 PHP
php指定长度分割字符串str_split函数用法示例
2017/01/30 PHP
php如何实现数据库的备份和恢复
2020/11/30 PHP
Dom在ajax技术中的作用说明
2010/10/25 Javascript
JavaScript 模拟类机制及私有变量的方法及思路
2013/07/10 Javascript
jquery制作select列表双向选择示例代码
2014/09/02 Javascript
判断在css加载完毕后执行后续代码示例
2014/09/03 Javascript
JS实现仿google、百度搜索框输入信息智能提示的实现方法
2015/04/20 Javascript
angularjs表格分页功能详解
2016/01/21 Javascript
轻量级jQuery插件slideBox实现带底栏轮播(焦点图)代码
2016/03/28 Javascript
seajs模块之间依赖的加载以及模块的执行
2016/10/21 Javascript
jquery Banner轮播选项卡
2016/12/26 Javascript
微信小程序 页面之间传参实例详解
2017/01/13 Javascript
详解node HTTP请求客户端 - Request
2017/05/05 Javascript
js封装成插件的步骤方法
2017/09/11 Javascript
JS实现的将html转为pdf功能【基于浏览器端插件jsPDF】
2018/02/06 Javascript
用ES6写全屏滚动插件的示例代码
2018/05/02 Javascript
vue中rem的配置的方法示例
2018/08/30 Javascript
Element中的Cascader(级联列表)动态加载省\市\区数据的方法
2019/03/27 Javascript
JavaScript 作用域实例分析
2019/10/02 Javascript
vue keep-alive实现多组件嵌套中个别组件存活不销毁的操作
2020/10/30 Javascript
pyqt5 QlistView列表显示的实现示例
2020/03/24 Python
使用SVG实现提示框功能的示例代码
2020/06/05 HTML / CSS
缅甸网上购物:Shop.com.mm
2017/12/05 全球购物
Theory美国官网:后现代都市风时装品牌
2018/05/09 全球购物
澳大利亚排名第一的儿童在线玩具商店:Toy Galaxy
2018/10/06 全球购物
美国儿童服装、家具和玩具精品店:Maisonette
2019/11/24 全球购物
Engel & Bengel官网:婴儿推车、儿童房家具和婴儿设备
2019/12/28 全球购物
领班岗位职责范文
2014/02/06 职场文书
高中生期中考试失利检讨书
2014/10/23 职场文书
学校禁毒宣传活动总结
2015/05/08 职场文书
公司保洁员管理制度
2015/08/04 职场文书
会议承办单位欢迎词
2019/07/09 职场文书
Tomcat用户管理的优化配置详解
2022/03/31 Servers