[转] React风格的企业前端技术
亲爱的各位朋友们,大家下午好!
首先祝大家国庆节快乐!
很高兴可以在国庆前夕,可以为大家分享一下React风格的企业前端技术。
谈到前端,可能以前大家的第一感觉就是,前端嘛,无非就是做做页面切图,顶多加上CSS做做页面样式,或者JS做页面的交互、动画、特效等等。
其实,随着近几年前端的飞速发展,像组件化、模块化理念的出现,MVC、MVVM等前端框架越来越成熟,以及越来越健全的开发、调试工具,前端可以说已经不是以前的那个前端了,前端正在变得像后端一样的复杂。
而另一方面,随着互联网+的热潮的到来,越来越多的传统系统内部应用,正在转型成为互联网化的应用。
而互联网化应用的一个鲜明特点就是快速,那怎样打造一个快速、React的前端应用呢,这就是我们今天所要将的React风格的企业前端技术。
首先还是稍微啰嗦一下谈谈前端的发展简史。
早期还是以JSP、PHP、ASP等为主的页面开发年代,那个时候的主要场景是
1. 用户在页面上进行一个操作,比如Button的点击或者Form表单的提交
2. 浏览器发送请求到后端
3. 后端经过DB查询拿到数据,再将数据绑定到JSP、PHP、ASP
4. 最后生产HTMl,返回给浏览器
5. 浏览器进行全屏渲染
注意,这里讲到了全屏渲染,全屏这个词注定了用户体验的不佳,开发人员可以做的优化的事情是非常少的。
另外,前端逻辑放在后端JSP里,这种前后端混淆的开发方式首先降低了开发效率,尤其当页面变复杂后,以及带来了后期的一系列维护性、扩展性等问题。
带着前期的这些问题,我们来到了中期AJAX的时代。
这个时候场景从第三步开始变成了
3. 后端经过DB查询拿到数据
4. 根据数据,生成对应的JSON/XML这种前后端达成一致的数据格式,返回给浏览器
5. 浏览器对JSON/XML进行解析,绑定到对应的组件上,再进行组件渲染
大家可以看到,这个阶段全屏渲染换成了组件渲染,用户体验可以说是提升了。
而业务逻辑也慢慢得从后端移向了前端,这种前后端代码分离的方式提升了一定的维护性、可扩展性。
但与此同时,我们的应用也慢慢地变成了JavaScript的富应用,而打造一个富应用其实是不简单的,我们需要
1. 基础类库来对请求、DOM、事件、特效等的封装
2. 组件库来达到组件复用
3. 框架来进行数据的解析及绑定
4. 解决不同浏览器的兼容性问题,以及相同浏览器不同版本的兼容性问题
这个阶段的早期都是各家公司自己造轮子的时代,可以说当时打造一个富应用是非常痛苦的。直到后来出现了一批优秀的类库,比如jQuery、Prototype,以及好的一些开发理念,比如jQuery UI的组件化、YUI的模块化、EXT JS的MVC框架,借助这些优秀类库及开发理念,大大减轻了我们打造富应用的痛苦。
另外06年初FireFox的Firebug插件的出现,终于可以使我们前端开发人员能够像后端一样,可以方便的调试前端代码,告别了手写alert这种繁琐的调试方式。
这个阶段的优点,刚刚也说了,就是在用户体验以及开发效率等方面的提升。
而缺点就是,随着业务逻辑慢慢变复杂,应用变为复杂的富应用,当前的类库或开发理念显得力不从心,像jQuery UI Widget Factory将一个页面分成几块开发,这种组件化开发的理念虽然是好的,但是块与快之间的数据传递、同步还是没有解决,导致开发人员还是需要通过reference传递、callback、listener绑定等繁琐方式来进行数据传递或同步。而ExtJS虽然MVC理念也非常好,但是初期被人诟病的就是它的性能、稳定性问题,以及3.0之后的license问题。
总之这个阶段虽然理念有了,但还是处于萌芽阶段,还尚不成熟。
其实正是由于中期的这些缺点及不足,才来到了我们当代生机勃勃的生态圈。
主要分为四大块
1. Angular、React、Ember为首的优秀前端框架
2. Bootstrap、Semantic UI为首的优秀组件库
3. npm、webpack模块化开发
4. Gulp、Grunt等构建工具来进行项目构建
可以说正是由于当代这些优秀的、成熟的技术,才能使我们快速地打造非常棒的前端应用。
说了这么多,那到底具体怎么做呢,下面就来讲讲我们认为的构建React风格应用的三大要素。
首先成熟的框架是项目的支柱
为什么说成熟呢,因为你不是第一个吃螃蟹的人!
Google使用了AngularJS在Google Trends、Google Analytics上,Facebook、Airbnb等使用了React相关的技术,而Apple、Amazon等也使用了Ember相关的技术。
可以说,这些前端框架已经在生产线上经过反复验证过了,所以大家完全可以放心大胆的使用。
另一方面,现在优秀的前端框架选择也非常多,各自有各自的优点。
像Angular通过双向绑定的方式,使开发人员不用关心View和Model之间的数据同步,简化了代码。
而React可以说是另辟蹊径,通过组件化的开发方式,虚拟Dom的理念,以及结合Redux单向数据流,更高效的开发我们的前端应用。
这么多优秀的、成熟的前端框架到底怎么选择呢?
首先从框架本身来说 (上图评分仅供参考)
1. 学习难度
如官网的文档、示例是否多
2. 框架特性
浏览器兼容性、前后端同构、移动端的支持等等
3. 社区
github的Star数、github上解决issue数以及解决速度、官方的维护者是谁等等
其次从项目团队来说,也需要从人力、项目大小、时间、期望等来考虑。比如前端团队里如果很多是从后端转为前端的,可能Augular更加合适,如果大多都是专业的JS开发人员,那么React可能更加合适。
前端框架有了,还得配合成熟的测试框架才能保证产品质量。
说到单元测试、集成测试,后端已经历史悠久,TDD、BDD等测试理念都是从后端发扬光大的。而现在前端也可以很方便地来编写测试。
如上图,可以选择Karma作为Test Runner,Mocha/Chai作为测试类库(类似后端Junit),Sinon作为Mock类库(类似后端Mockito),结合不同的Karma Launchers来测浏览器的兼容性问题,并且配合CI Job,实时地监控代码问题,从而降低Regresssion,提升编码信心、代码质量。
上面给出的就是我们在The Platform里面的一个前端测试用例,是通过BDD的given/when/then的测试方式
1. given一个Portal组件
2. when这个组件渲染到DOM之后
3. assert该组件的layout
通过该示例大家可以看到,现在编写前端测试可以说是非常方便了。
选好了前端框架、测试框架,下面就得正式进入前端工作流程了。
我们可以看到现在的前端流程其实是复杂的。
在搭建的时候,我们可能需要
1. 根据不同前端框架搭建不同的项目结构,比如MVC的得model/view/actions的结构,react+redux的得components/actions/reducers结构
2. 根据不同的前端、测试框架配置不同的配置文件
3. 如果是前后端同构的,还需要搭建前端服务器
而在开发的时候,我们需要
1. 各种预处理器来处理中间语言,比如CoffeeScript、TypeScript或者Sass、Less
2. JS、CSS代码实时检查
3. 模块化开发
4. 热加载、实时加载
最后在构建的时候,我们需要
1. 编译JS/CSS等中间语言
2. 运行单元测试
3. 资源压缩、合并
4. 资源懒加载
大家可以看到,从搭建到开发再到构建,还是做了很多事情的,一个流畅的工作流程必不可少。
主要分为四大块
1. BoilerPlate或者Yeoman命令行的方式快速搭建项目结构
2. Npm、webpack进行模块化开发
3. 以Sublime插件/Atom插件/webSotrm,进行中间语言的预处理、以及代码Lint
4. Gurnt/Gulp/npm Scripts进行项目构建
最后一点,也是非常重要的一点,就是用户体验了。
可以说,用户体验是成功产品的基石。一些优秀的、成功的产品,往往用户体验也是非常棒的。
要想提升用户体验,首先我们先得从设计做起,上图中的五大层次其实是出自于Ajax之父James Garrett所著的用户体验要素,而对于我们开发人员来讲,尤其要注重于表现层、框架层、结构层,分别从配色、字体、导航、交互等方面进行设计。
其次只有通过不断优化才能提升用户体验。我们可以从内容优化、关键渲染路径优化、渲染性能优化三大方面进行性能优化。
同时借助好的开发工具可以帮助我们进行性能优化。Chrome的开发者工具就是款很好的开发工具,我们可以使用Source可以进行代码调试,通过Network分析页面上的资源请求情况,甚至可以跑一个Profile来定位长耗时方法、内存泄露等问题。
至此,三大要素已经全部讲完了。
下面再来谈谈React风格在我们普元产品The Platform里的实践。
首先是我们The Platform里前端的总体架构图
1. 框架这边
我们使用了React + Redux + React Router作为前端框架。通过React组件化的开发方式,一个页面可以同时拆成几块给不同的团队甚至是异地团队,从而加快开发效率。而Redux单向数据流的方式也降低了复杂页面的开发难度。
使用Karma+Mocha+Chai+Sinon作为测试框架,保证代码质量。
2. 工作流程
FE Template作为我们的BoilerPlate来快速搭建前端项目
NPM webpack进行模块化开发
React/Redux开发工具以及Webpack的热加载来提升我们的开发体验
Webpack进行项目构建,进行资源文件压缩、合并、懒加载等
3. 用户体验
优化设计,减少不必要的菜单。
利用React本身的Virtual DOM提升页面性能,Webpack的懒加载减少资源文件下载,加快加载速度。
以及近期对字体做的异步加载。
最后的总结
转载:EAII企业架构创新研究院。
[转] React风格的企业前端技术的更多相关文章
- 8分钟为你详解React、Angular、Vue三大前端技术
[引言] 当前世界中,技术发展非常迅速并且变化迅速,开发者需要更多的开发工具来解决不同的问题.本文就对于当下主流的前端开发技术React.Vue.Angular这三个框架做个相对详尽的探究,目的是为了 ...
- 解密国内BAT等大厂前端技术体系-腾讯篇(长文建议收藏)
1 引言 为了了解当前前端的发展趋势,让我们从国内各大互联网大厂开始,了解他们的最新动态和未来规划.这是解密大厂前端技术体系的第三篇,前两篇已经讲述了阿里和百度在前端技术这几年的技术发展.这一篇从腾讯 ...
- 记录一次参加D2前端技术论坛的杭州之行
前言 在这里,闰土首先要感谢以下两位大佬提供的门票,分别是来自新浪微博部门的H同学,以及来自小米科技的D同学. 当我周六晚上在青旅写完这篇文章过后,第二天上网发现,已经有大佬提前一步在掘金上发布了高质 ...
- 2019年一半已过,这些大前端技术你都GET了吗?- 下篇
在上一篇文章中已经介绍了大前端关于状态管理.UI组件.小程序.跨平台和框架层的内容.在本文中,我会继续介绍编程语言.工程化.监控.测试和服务端,同时也会对下半年大前端可以关注的部分进行展望. 结合个人 ...
- 解密国内BAT等大厂前端技术体系-百度篇(长文建议收藏)
1 引言 整个业界在前端框架不断迭代中,也寻找到了许多突破方向,例如跨平台中的RN.Flutter,服务端GraphQL.Serverless,前端和客户端的融合越来越紧密,前端在Node和Elect ...
- 一文读懂前端技术演进:盘点Web前端20年的技术变迁史
本文原文由作者“司徒正美”发布于公众号“前端你别闹”,即时通讯网收录时有改动,感谢原作者的分享. 1.引言 1990 年,第一个Web浏览器的诞生:1991 年,WWW诞生,这标志着前端技术的开始. ...
- 解密国内BAT等大厂前端技术体系-美团点评之下篇(长文建议收藏)
引言 在上篇中,我已经介绍了美团点评的业务情况.大前端的技术体系,其中大前端的技术全景图如下: 上篇重点介绍了工程化和代码质量的部分,工程化涵盖了客户端持续集成平台-MCI.全端监控平台-CAT.移动 ...
- js前端技术
一.前端技术 1.HTML HTML(hypertext markup language)超文本标记语言,不同于编程语言. 超文本就是超出纯文本的范畴,描述文本的颜色.大小.字体. HTML由一个个标 ...
- 【转发】网易邮箱前端技术分享之javascript编码规范
网易邮箱前端技术分享之javascript编码规范 发布日期:2013-11-26 10:06 来源:网易邮箱前端技术中心 作者:网易邮箱 点击:533 网易邮箱是国内最早使用ajax技术的邮箱.早在 ...
随机推荐
- python操作三大主流数据库(12)python操作redis的api框架redis-py简单使用
python操作三大主流数据库(12)python操作redis的api框架redis-py简单使用 redispy安装安装及简单使用:https://github.com/andymccurdy/r ...
- [javascript]XMLHttpRequest GET/SET HTTP头与改变HTTP METHOD示例代码
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- [C][代码实例]冒泡排序
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h& ...
- docker的安装及项目部署
Making Docker and Deployment Process Step: set up your docker environment build a image of activeMQ ...
- js设置睡眠N秒后再执行
function sleep(NumMillis) { var nowTime = new Date(); var exitTime = nowTime .getTime() + NumMillis; ...
- response.setContentType()的String参数及对应类型
response.addHeader("Content-Disposition", "attachment;filename="+ filename); res ...
- STM32L476应用开发之六:电池SOC检测
便携式设备由于使用需求而配备了锂电池,但使用过程中需要掌握电源的状态才能保证设备正常运行.而且在电池充放电的过程中,监控电池的充放电状态也是保证设备安全的需要. 1.硬件设计 电池SOC检测是一个难题 ...
- 【VBA】数组定义时,括号内的数值n为最大下标,其长度为n+1
定义数组 dim arr(9) as integer注意这是数组的长度为10,而9指的是最大下标值. 所以在redim和赋值的时候要特别小心,防止错位.
- 【Linux】基本命令操作
一.用户操作 1.新增用户 useradd -u 1101 -g zte -d /home/xhs -m xhs --其中,1101,为用户ID,尽量使用500以上的 zte,为用户组 /home/x ...
- angularjs 监听 文档click 事件
项目 上遇到 innHTML 放入 一大段的html 内容 中带有 click 事件 如onclick="callInMethod("http://www.crm.bmcc.c ...