react学习笔记(1):从前后端分离到项目部署
我来到现在这家公司有一年多的时间,一直做的是财政系统相关的产品,前端的技术栈用的是传统的jQuery+bootStrap+requireJs,随着项目的开发,越来越多的弊病凸显出来。
首先是前后端的代码存放在同一个工程目录下,前后端工程师进行开发时,都必须把整个项目导入到开发工具中(像myEclipse和IntelliJ IDEA等),一方面前端在开发之前需要花费大量的时间来部署开发环境,如果后端上传错了文件,整个系统启动不起来,前端就只能干等着,前后端耦合性很大,另一方面使用myEclipse这样的开发工具开发前端项目操作上不熟悉,开发效率很低。
其次在整个项目中,组件化很明显,大多数页面中所需要的功能都是类似的,虽然可以使用require封装一些公用的组件,但是由于js技术有限,组件与组件之间还是存在很多耦合的问题,并且随着自定义的组件越来越多,经常遇到一个页面开头先加载几十个组件的情况,后期维护也很麻烦,对于有代码洁癖的人来说,这显然不是一种好方法。
于是就想到用react能不能解决这些问题呢?
首先了解到蚂蚁金服出品的企业级产品的设计体系——Ant Design,发现里面的很多组件都很适合我们现有的产品,如果能用到实际项目中,那么自己编写组件的问题就可以避免了,瞬间心动不已。然后就跟着上面的教程开始了学习,用create-react-app脚手架搭建了一个react开发环境,感觉是基本入门了。但是问题也随之而来:如果用react的话,如何结合到现有的项目中来呢?以前是前后端代码放在一起,使用react就需要前端单独起服务,当前端的代码开发完成后又怎么和后台的代码部署到同一台服务器上,这篇文章主要是针对这一系列的探索。
什么是前后端分离
这几年前后端分离被提到的越来越多,在网上查什么是前后端分离,基本是说后台只提供数据api,与用户的交互操作前端来实现。我们现在的工作模式,前端也是通过ajax请求后台数据,前端的代码单独放在工程目录的一个文件夹中,不与后台的代码耦合,这算不算前后端分离。
前后端分离是前后端代码库分离,前端代码中有可以进行Mock测试(通过构造虚拟测试对象以简化测试环境的方法)的伪后端,能支持前端的独立开发和测试。而后端代码中除了功能实现外,还有着详细的测试用例,以保证API的可用性,降低集成风险。具体来说应该像下图中所示的,前端使用node起一个本地服务器作为中间层,然后通过一些插件将api请求转发到后台,来模拟线上的场景。后台与数据库交互提供api接口。这里又回到之前用create-react-app搭建react开发环境,最后的npm start应该就是启动本地服务器了吧。随之而来的一个问题就是数据访问跨域的问题,前端本地服务和后台服务既然分离了,那么肯定不在同一个域当中的,这该怎么办?

跨域问题
1.react当中解决跨域问题用proxy可以实现
对于使用creat-react-app构建的项目,可以直接在package.json下配置,具体如下
"proxy": "http://api.xxxx.com"
如果同时使用多个域,配置如下
//package.json中加入
"proxy": {
"/api/RoomApi": {
"target": "http://open.douyucdn.cn",
"changeOrigin":true
},
"/api/v1":{
"target":"http://capi.douyucdn.cn",
"changeOrigin":true
}
}
对于antd-pro的项目,需要在package.json的同等目录下添加.roadhogrc文件
{
"entry": "src/index.js",
"extraBabelPlugins": [
"transform-runtime",
"transform-decorators-legacy",
"transform-class-properties",
["import", { "libraryName": "antd", "libraryDirectory": "es", "style": true }]
],
"env": {
"development": {
"extraBabelPlugins": [
"dva-hmr"
]
}
},
"externals": {
"g2": "G2",
"g-cloud": "Cloud",
"g2-plugin-slider": "G2.Plugin.slider"
},
"ignoreMomentLocale": true,
"theme": "./src/theme.js",
"proxy": {
"/api": {
"target": "http://api.xxxx.com/",
"changeOrigin": true
}
}
}
2.使用nodejs中的http-proxy-middleware插件
3.使用jsonp,但是不支持post请求方式
4.后台配置cors,但是ie67完全不兼容,ie89需要做一些特殊处理,ie10以上才能使用
后两种需要后台大拿配合
好了跨域的问题解决了,那么如果是react怎么请求后台数据?
数据请求
ajax、axios、fetch
jquery ajax是使用最多的一种方式,问题是jQuery文件太大,react中单纯的使用ajax就引入jquery不太合理
Axios 是一个基于promise的HTTP库,可以用在浏览器和node.js中。简单易用,功能强大。兼容性方面要低于jQuery的ajax,支持ie9以上。提供了很多并发请求的接口,方便了很多。
fetch更加底层,写法很方便,缺点是只对网络请求报错,对400,500都当作成功的请求,需要封装处理。
综上考虑使用axios更好一些。
上线统一部署
前端代码开发完成后如何与后台代码统一部署呢,这里就用到了webpack之类的打包工具,使用打包工具可以把前端项目打包成静态压缩文件,即一个index.html一个css一个js压缩文件,然后把他们放在后台工程目录里面运行整个项目就行了,这里要注意文件路径问题,并且之前的跨域处理也要去掉。
对于使用creat-react-app构建的项目,可以使用npm run build来打包。
到此,整个使用react的流程就基本搞清了,接下来就是实际的开发工作,react的使用,es6的语法都是重中之重。这里推荐看一下这篇文档,在 2017 年学习 React + Redux 的一些建议,对react的学习应该会有所帮助。
博主从事前端开发也只有一两年时间,见解不深,还望大家多多指摘。
原创文章,版权所有,转载请注明出处。
react学习笔记(1):从前后端分离到项目部署的更多相关文章
- react学习笔记1--基础知识
什么是react A JAVASCRIPT LIBRARY FOR BUILDING USER INTERFACES[React是一个用于构建用户界面的JavaScript库.] React之所以快, ...
- React学习笔记--程序调试
React学习笔记 二 程序调试 前面我们搭建好了React的基本开发环境,可以编写基本的React js程序了.但完成的开发环境肯定包含调试器,怎么调试用React编写的JS程序呢?有浏览器,比 ...
- React学习笔记(一)- 入门笔记
React入门指南 作者:狐狸家的鱼 本文链接:React学习笔记 GitHub:sueRimn 1.组件内部状态state的修改 修改组件的每个状态,组件的render()方法都会再次运行.这样就可 ...
- React学习笔记(七)条件渲染
React学习笔记(七) 六.条件渲染 使用if或条件运算符来创建表示当前状态的元素. 可以使用变量来存储元素.比如: let button = null; if (isLoggedIn) { but ...
- React学习笔记(六)事件处理
React学习笔记(六) 五.事件处理 React事件绑定属性的命名采用驼峰写法,不同于传统DOM全部小写. 如果采用JSX的语法,事件函数需要用大括号{}包裹函数名,不同于传统DOM字符串小括号的方 ...
- React学习笔记(五)State&声明周期
React学习笔记(五) 四.State&声明周期 可以为组件添加"状态(state)".状态与属性相似,但是状态是私有的,完全受控于当前组件. 局部状态就是只能用于类(定 ...
- React学习笔记 - 组件&Props
React Learn Note 4 React学习笔记(四) 标签(空格分隔): React JavaScript 三.组件&Props 组件可以将UI切分成一些独立的.可复用的部件,这样你 ...
- React学习笔记 - 元素渲染
React Learn Note 3 React学习笔记(三) 标签(空格分隔): React JavaScript 二.元素渲染 元素是构成react应用的最小单位. 元素是普通的对象. 元素是构成 ...
- React学习笔记 - JSX简介
React Learn Note 2 React学习笔记(二) 标签(空格分隔): React JavaScript 一.JSX简介 像const element = <h1>Hello ...
随机推荐
- ansible初识三
一.setup模块 ansible的 setup模块主要用来收集信息, 查看参数: [root@localhost ~]# ansible-doc -s setup # 查看参数,部分参数如下: fi ...
- Python入门——import
最近身边的人或多或少都知道一点python,自己也想动手试试吧.按照网上的教程,安装了python,Eclipse插件pydev.接下来就是在Eclipse下新建工程,创建py文件这就不多说了. 第一 ...
- python操作docx文档(转)
python操作docx文档 关于python操作docx格式文档,我用到了两个python包,一个便是python-docx包,另一个便是python-docx-template;,同时我也用到了很 ...
- 常用经典SQL语句大全完整版--详解+实例 (存)
常用经典SQL语句大全完整版--详解+实例 转 傻豆儿的博客 http://blog.sina.com.cn/shadou2012 http://blog.sina.com.cn/s/blog_84 ...
- Java设计模式学习06——静态代理与动态代理(转)
原地址:http://blog.csdn.net/xu__cg/article/details/52970885 一.代理模式 为某个对象提供一个代理,从而控制这个代理的访问.代理类和委托类具有共同的 ...
- spring中 Bean的装配 Bean后处理器
- 【LA3415 训练指南】保守的老师 【二分图最大独立集,最小割】
题意 Frank是一个思想有些保守的高中老师.有一次,他需要带一些学生出去旅行,但又怕其中一些学生在旅行中萌生爱意.为了降低这种事情发生的概率,他决定确保带出去的任意两个学生至少要满足下面四条中的一条 ...
- 75. Sort Colors (Array)
Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...
- 微信小程序文档里看不到的小Tips
前几天折腾了下.然后列出一些实验结果,供大家参考. 0. 使用开发工具模拟的和真机差异还是比较大的.也建议大家还是真机调试比较靠谱. 1. WXML(HTML) 1.1 小程序的WXML没有HTML的 ...
- ATM取款机的数据库模拟开发和实战总结
一.ATM实战开发的简介. 学习了几天的Oracle,开始着手用数据库PL/SQL语言做一个简单的ATM取款机业务,主要是为了巩固数据库的知识,并非真正的去实现高端的业务.有兴趣的可以看看,希望对同胞 ...