react-router 4.0 下服务器如何配合BrowserRouter
2018-03-14 16:56
567 查看
react-router作为react框架路由解决方案在react项目中举足轻重。 在react-router 4.0版本中,API与先前版本相比有了很大的修改,在2.0、3.0中常用的<Router>组件作为路由底层配置组件不再常用,取而代之的是四个各有不同的路由组件:
此处踩坑无数,在网上搜索方法后换用nginx,使用try_files字段定向到入口html,但是重定向后,webpack打包的js文件没有执行。在查看firebug时发现此次刷新的响应头中设置了"Connection":"keep-alive";觉得问题应该出在这里,换用nodejs用200状态配合keep-alive果然解决了问题。在react-router 4.0 多级路由下刷新页面不会再404,而是保存了前端状态。
<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,而是保存了前端状态。
相关文章推荐
- react-router 4.0 下服务器如何配合BrowserRouter/hashBrowserRouter
- 详解react-router 4.0 下服务器如何配合BrowserRouter
- React-Router如何进行页面权限管理的方法
- 狗屎一样的React(第八节,React-router 4.0的使用姿势)
- Swift服务器入门+ReactJS代码示范:如何在内存中建立高性能索引
- 初探 React Router 4.0
- react-router 4.0 升级攻略
- 利用 React/Redux/React-Router 4/webpack 开发大型 web 项目时如何按需加载
- 初探 React Router 4.0
- react路由的使用方法以及通过路由如何传参传递私有属性--【基于最新版本的react-router-dom(4.2.2)】
- react-router 4.0版本使用笔记
- webpack如何与react进行配合
- 浅谈react-router HashRouter和BrowserRouter的使用
- 【react-router】hashhistory 与 browserhistory有什么区别
- 狗屎一样的React(第八节,React-router 4.0的使用姿势)
- react-router 与react-reduct 配合使用时,页面不刷新问题
- 如何用React-Router进行页面权限管理
- react+react-router 4.0+redux+antd 购物车实战项目
- React-router(3)BrowserRouter 和 HashRouter(哈希地址和普通地址)
- react-router与react-reduct配合使用时页面不刷新问题解决方法