阅读更多
前端框架不断推新,众多IT企业都面临着“如何选择框架”,“是否需要再造轮子”的抉择。去哪儿网前端架构师司徒正美分析了各主流行框架优劣点、适用场景,并针对不同规模的公司、项目给出了相应的前端技术选择方案。

最近几年,前端技术迅猛发展,差不多每年都会冒出一款主流的框架。 每次新开业务线或启动新项目时,首先第一件事就是纠结:使用什么框架,重造什么轮子?我很高兴应CSDN的邀请谈我的看法。

RequireJS,前端技术发展分水岭

在五六年前,移动端还没有兴起,我们没有什么选择,就是jQuery。有人会说,jQuery只是类库,不是框架;但那时前端业务还没有像今天这么繁重,原本是后端干的事,全部挪到前端来,因为光是jQuery就可以包打天下。jQuery不够用,还有成千上万的jQuery的插件呢。于是问题就是这样一一衍生出来了,一个页面太多jQuery插件了,请求数太多了,于是我们得打包。打包需要我们对插件有规划。于是这一需求在社区上逐渐形成了某些规则,其中最出名的是AMD规范,体现上RequireJS这个加载库上。

RequireJS是前端技术发展上的一个分水岭。JavaScript在ES6之前一直没有自己的加载机制,RequireJS的出现意味着前端可以向更大规模发展。以后我说的技术选型,一个非常重要的甄选点, 即是否存在加载器机制或符合某个模块规范。

选择前端框架应综合考虑框架本身与团队情况

回到原来的话题,选择框架要从两面看,一是看该框架的本领,二是看你们团队的能耐。

从框架的角度来看, 它的功能丰富不丰富、社区活跃度如何、国内社区活跃度如何(有的在国外流行,但国内只有初创公司或一些大公司的边缘项目在试水)、文档齐全与否、是否及时更新、测试覆盖率如何、上手难易度如何,都是我们考量点。不过能进我们视野内的外国框架,基本是身经百战,在造轮子兴盛的世界闯出来的领头羊。jQuery、Angular、KnockOut、Emberjs、Polymer、React、Backbone、Zepto,我们基本是围绕在这几个上面转了。当然还有更大型的东西,如EXT、 YUI、Dojo、EasyUI、Bootstrap,这是UI库层面的。

下面是2012年外国对当时流行12个JavasScript MVC框架的纯技术评估:



显然,我们第一步就是圈定时下最流行的框架与库作为评估对象,然后再根据自家公司的情况进行筛选。贵公司是建站公司,还是有自己产品的公司呢?如果是建站公司,页面不会复杂到哪里去,基本上jQuery+Bootstrap搞定,不要想得太多,就是它们。如果有自己产品, 要维护一大堆客户数据,要与客户打交道,不难想象存在非常复杂的CRM系统,按照中国人的特性,这东西只会越来越复杂,这就要慎重考虑了。这往往是持续十年的维护升级,我们需要看一下某框架是否有你们的产品那么长寿,这框架的升级更新是否频繁平缓。

大工程应尽量避开谷歌产品

如果你的项目是一个跨度三年以上的大工程,用《人月神话》的术语来说,90%就是个焦油坑。我们需要使用更稳健成熟的技术方案,我们需要重点避开谷歌的产品,它的许多产品都是玩票性质,GWT、Closure、Darty就是前车之鉴。Polymer基于许多新技术构建,其中Object.observe()、 Custom Elements、HTML Imports、Shadow DOM、Model-Driven Views还远远没被标准化, 许多还是独家的,变数太大,因此才出现下图所示的悲剧。 Angular不是我黑它,这东西也喜欢断崖式升级,它在1.08时兼容IE6-8,1.2时需要打补丁兼容旧式IE,1.3摒弃了对旧式IE的兼容,直接在源码中删除了所有兼容代码,因此所有补丁方案都无力回天,并且不支持全局Ctrl函数,许多模块需要独立引用,1.4不向下支持动画模块,2.0由at改成ts构建,由于使用Object.observe(),因此不支持IE6-11,Chrome30……



后台系统可考虑EXT、EasyUI,avalon等国内优秀框架也值得考虑

如果你们的产品是后台系统,那么就有两个选择,使用EXT、EasyUI这些重大的UI库方案,其中EXT具有严重的排它性,它很难与其他前端解决方案并用。什么模块组织、打包、数据可视化,它都已经能全部帮你搞定。它文档齐备漂亮,入门难度中等,但它要求你的团队非常稳定,现在招一个专职EXT的前端是很难的。EasyUI是国内比较大牌的UI框架,虽然闭源,不过想扩展它不是难事。

此外,国内的淘宝Kissy, 网易Nej也不错。还有更轻量的方案:MVVM。MVVM最擅长做这些重交互的产品。举例说,为了对应复杂交互的Gird,jQuery社区开发出各种庞大巨物DataGrid、jqGrid、FlexiGrid,还不如MVVM几个循环绑定来得干脆利落,扩展性又好。目前,KnockOut、Emberjs、Angular与我写的avalon就是这一类框架。Angular虽然有点坑,但如果你是从1.3用起,并且不鸟IE,它还是一个不错的选择,其活跃的社区为它带来无限的可能。KnockOut在.Net人群中非常流行,微软出品,前端MVVM框架的鼻祖,不过它需要对后端数据进行过多的加工,因为它本身是不支持对套嵌对象的绑定。Emberjs没有一个好干爹,但有一个好亲爹,作者Yehuda Katz是jQuery, Rails、SprouteCore、Merb、Handlebars这些著名框架的核心成员,虎父无犬子,Emberjs现在还是国外的第二大MVVM框架。avalon是比较适合国情的MVVM,有它专门兼容IE6的版本,易上手,性能高,视频教程多,出了问题可以抓得着作者,是它的几大卖点。

重SEO产品,可考虑jQuery+Bootstrap+RequireJS组合

如果你们的产品是商场这样重演示类的产品,就对SEO有要求,MVVM就不适合了。目前也就Angular与avalon在搞后端渲染机制,但还不上了台面。这时jQuery+Bootstrap+RequireJS就非常好用。RequireJS的作用不单单是提供了一个按需加载机制,它还能让我们组织起更为庞大的代码。如果不用RequireJS,国内另一个选择是SeaJS,它的规范是CMD。此外还有CommonJS规范,但这无法直接运行于前端,需要借助fekit、FIS、Webpack这样的构建工具进行合并了。不管怎么说,你这时选用的框架必须存在AMD、CMD或CommonJS任一种加载规范,这方便你以后的横向扩展。至于插件,目前小插件们都趋向用UMD,它可以让AMD、CMD、CommonJS任一种加载器加载。

移动端技术较混乱,需多管齐下

如果你们的产品是移动端,基本上是SPA架构了,因为这会减少等待,整页刷新与请求数。目前该领域非常混乱,不同于PC端,要兼容的浏览器多出N倍,并且为了性能,浏览器商乱砍功能或改变一些浏览器特性的行为,往往引发一些奇怪的BUG,目前社区正在整理这些坑与解药。但目前没有一个框架能够摆平所有问题,都需要多管齐下。我的见解是:

RequireJS(按需加载,移动端上可以不打包,善用304缓存,腾讯搞出一个更牛叉的增量更新加载器MT,也可以试试)+Backbone(组织代码与路由管理)+Zepto(轻量DOM操作) + fastclick.js(点击穿透与延迟处理)+Hammer.js(各种触屏事件)+iScroll5.js(滚动条处理)+Animate.css(CSS3动画)+Enquire.js(处理响应式布局)。

可见移动端每个部件都烂到蕊了,每个部件都需要专门的工具进行修复。移动端是非常注重体验的,每一个小角落都存在着各种动画,但浏览器或自带的WebView都很差劲,于是Native与Hybird的话题才一直这么火。有的人说,既然DOM最吃性能,那么就干脆用Canvas来代替吧(请见:http://zhuanlan.zhihu.com/FrontendMagazine/19967854 与http://www.ruanyifeng.com/blog/2015/02/future-of-dom.html )。Facebook也推出了自己类似的方案React Native,自己实现了一套GUI,不过编写语言是JavaScript。它是使用自己原来的超高性能轮子React实现的。这或者是一条道路。但优缺点也明显,正如Angular浓浓的Java风,React是在逻辑中插入大段标签语言(JSX)。同时React的排它性也非常强,很难与其它库搭配使用。同时,我们可以看到,出自jQuery名门的jQuery Mobile并没有入围,那个性能太糟了,连Sencha Touch也不及。上面说的只是核心库, 还没有搬出UI库呢。号称Mobile First的UI库不在少数,由于无视IE,可以大胆使用CSS3。目前比较出彩的有Foundation、Semantic,Refill、Ratchet。如果只是想运行在平板上,性能问题就不会那么拮据了,我们还可以试试inoic、Sencha Touch, Kendo UI Mobile……

没有最好,选择最适合自己的

基本上,针对每个平台,我都列出一些主流框架,但不意味着你们都能驾驭得住。小马过马,老牛没过膝,松鼠淹个半死,就是这么回事。创业公司喜欢新框架,这与他们拿得起高薪招一两个前端牛人所致,基本上所有页面就是他们干的,因此用Angular或Ember都没区别。小公司则小心,人员流失大,jQuery+RequireJS是万金油。大公司则基本上有自己的技术沉淀,换言之,应该有自己的前端框架,除非那东西很陈旧,不建议再造轮子。对大公司的建议是搞自己的技术委员会,根据自己的人员配置来挑选的框架。有句话说得好,不求最好,但求最合适。有些框架就属于牛逼人手里牛逼闪闪,二逼人手里一团乱麻。对于某些成长特别快的中等公司来说,这点最需防范,牛人是有的,但作战的主体70%都是刚培训出来的实习生,难上手,中文文档不全的框架就必须过滤掉。我也不排除造轮子的可能性,毕竟有些公司就是人才济济,能推出一些靠谱的开源产品来造福社区。

但无论我们选择什么框架或决定自己动手造轮子,都勿忘初心,技术必须让我们工作生活更为轻松愉快——我们只选择我们能驾驭住的框架,我们不能保证它在一年后是否会过时落后,但至少不会变成绊脚石。套用亚当·斯密的话(税收是一种必要的恶)来说,框架是一种必要的恶,它是强约束的,因此必须慎重选择。
  • 大小: 45.2 KB
  • 大小: 122.8 KB
来自: CSDN
16
1
评论 共 9 条 请登录后发表评论
9 楼 g21121 2015-06-23 14:57
去过去哪网面试,极其没素质的说
8 楼 deng520159 2015-06-08 09:15
Bootstrap 有部分功能ie8下不兼容需要扩展包
7 楼 happysoul 2015-05-21 14:37
曾经 经典论坛 里的司徒正美的UI看的实在无语 功能可以借鉴 但是样式实在不好说什么
6 楼 bellstar 2015-05-20 16:03
我看了一个星期avalon就是没敢下决心用,看了两天vue后觉得有自信用了
5 楼 eric_hwp 2015-05-20 09:28
司徒正美 ,你的avalon坑太多了,bug又多又不更新,资料又少,用起来就是个天坑,你就不要在吹嘘你的avalon了
4 楼 tiandeyu188 2015-05-19 13:44
如果有自己产品, 要维护一大堆客户数据,要与客户打交道,不难想象存在非常复杂的CRM系统,按照中国人的特性,这东西只会越来越复杂,这就要慎重考虑了

这段话说的太好了。。。国内做自己产品就是这样
3 楼 zjumty 2015-05-19 11:27
没有提及React?
2 楼 diferent 2015-05-19 10:19
一心想着兼容IE6-8, 这样的架构师真是无力吐槽.大家都不支持,瞬间就消失了
1 楼 jd2bs 2015-05-19 08:21
jQuery+Bootstrap+RequireJS 飘过

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • [转载] Java 性能优化技巧集锦 (6)

    http://tech.ccidnet.com/pub/article/c1077_a199225_p6.html5. 延迟重画操作对于图形用户界面的应用来说,性能低下的主要原因往往可以归结为重画屏幕的效率低下。当用户改变窗口大小或者滚动一个窗口时,这一点通常可以很明显地观察到。改变窗口大小或者滚动屏幕之类的操作导致重画屏幕事件大量地、快速地生成,甚至超过了相关代码的执行速度。对付这个问题最好的办

  • java实现大文件并发高效下载

    这是针对多个大文件并发下载的Java程序。它利用了OkHttp库来进行网络请求,并使用线程池来同时下载多个文件,从而提高下载效率。程序通过遍历预设的文件URL和本地保存路径,创建下载任务并提交给线程池执行。每个下载任务负责下载文件的一部分,通过设置HTTP请求头的Range实现断点续传。下载完成后,程序会对下载文件进行完整性校验,以确保文件没有损坏。这个程序具备高度的扩展性,可以轻松添加更多的文件URL和本地保存路径。

  • 解决Java ImageIO.write处理PNG图片太慢的问题

    在JDK7、8版本中用 ImageIO.write进行图片输出时,如果输出PNG格式图片非常的缓慢 Poor performances of imwrite, especially for png extension. 上代码-解决前: @Test public void testWirte() throws Exception { String dir = "/Users/user/Downloads/testimg/"; final MockMultipar..

  • 优化技术专题 - 性能优化系列 - 针对 Java 对象压缩及序列化技术的探索之路

    无论是哪家公司,都很重视Spring框架技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,好了希望这篇文章对大家有帮助!《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!” />无论是哪家公司,都很重视Spring框架技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。

  • Java 中 10 大简单的性能优化

    如果这是一个全局配置映射(即只有一个实例),增加的访问速度将帮助EnumMap大大超过HashMap,它可能使用更少的堆内存,但必须在每个键上运行hashCode()和equals()。一个好的hashCode()方法是必要的,因为它将防止进一步调用开销大得多的equals(),因为它将为每个实例集生成更多不同的散列桶。如果你不能降低复杂性,如果你在真正重要的地方调整你的算法,如果你能找到正确的位置,你仍然可以获得很多性能。在我们的N.O.P.E.分支示例中,我们在叶子中没有这样的方法,但您可能有一个。

  • 提高性能技巧

    在开发iOS应用程序时,让程序具有良好的性能是非常关键的。这也是用户所期望的,如果你的程序运行迟钝或缓慢,会招致用户的差评。然而由于iOS设备的局限性,有时候要想获得良好的性能,是很困难的。在开发过程中,有许多事项需要记住,并且关于性能影响很容易就忘记。   本文收集了25个关于可以提升程序性能的提示和技巧,把性能优化技巧分为3个不同的等级:初级、中级和高级   初级 在开发过程中,下面

  • 如何训练GAN?训练GAN的技巧和方法

    https://github.com/soumith/ganhacks 1.输入归一化 把信号归一化到-1 到1 generator的最后一层输出用Tanh 2.使用修饰过后的损失函数 在GAN的文章中,generator的损失函数是min(log 1-D) 但是在实际中会用max(log D) 因为前一个式子在早期会有梯度消失的问题 Goodfellow et. al (2014) 在实际中的好方法: 训练生成器时翻转标签:real = fake, fake = real 3.使用球体Z

  • java实现高效文件下载

    java实现高效文件下载 本文我们介绍几种方法下载文件。从基本JAVA IO 到 NIO包,也介绍第三方库的一些方法,如Async Http Client 和 Apache Commons IO. 最后我们还讨论在连接断开后如何恢复下载。 使用java IO 下载文件最基本的方法是java IO,使用URL类打开待下载文件的连接。为有效读取文件,我们使用openStream() 方法获取 ...

  • Java服务中的大文件上传和下载优化技巧分享

    参考文章:http://blog.ncmem.com/wordpress/2023/11/04/java%e6%9c%8d%e5%8a%a1%e4%b8%ad%e7%9a%84%e5%a4%a7%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e5%92%8c%e4%b8%8b%e8%bd%bd%e4%bc%98%e5%8c%96%e6%8a%80%e5%b7%a7%e5%88%86%e4%ba%ab/以上这些策略和技术可以帮助开发者有效优化Java服务中的大文件上传和下载。

  • 数据库设计指南

    数据库设计指南------------------如果把企业的数据比做生命所必需的血液,那么数据库的设计就是应用中最重要的一部分。有关数据库设计的材料汗牛充栋,大学学位课程里也有专门的讲述。不过,就如我们反复强调的那样,再好的老师也比不过经验的教诲。所以我们最近找了些对数据库设计颇有造诣的专业人士给大家传授一些设计数据库的技巧和经验。我们的编辑从收到的130 个反馈中精选了其中的60 个最佳技巧,

  • Java之BufferedImage简谈

    转载地址:http://blog.163.com/yuhua_kui/blog/static/9679964420139118203818/ 1. 创建一个BufferedImage对象import java.awt.Frame;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Grap

  • BufferedImage修改图片大小

    /** * 调整bufferedimage大小 * @param source BufferedImage 原始image * @param targetW int 目标宽 * @param targetH int 目标高 * @param flag boolean 是否同比例调整 * @return BufferedImage 返回新image */ pri...

  • JDK使用VolatileImage可以有效改进刷屏

      上文得出结论,JAVA刷屏性能太差。在不分析JDK的情况下,有没有办法改善性能?   吾在网上搜索了一下,除了BufferedImage,还有一个叫VolatileImage。吾马上试之,发现效果很好,刷屏快了一倍(对吾来说还是不够)。   随后吾发现了问题,第二次使用的时候画面乱了。这个好办,用之前先清理一下。 ...

  • Java2D: 硬件加速 - 第一部分 - 非恒定图像类:Volatile Image

    原文地址:[b][url=http://www.javalobby.org/java/forums/m91823967.html#91823967]Java2D: Hareware Accelerating - Part1 - Volatile Images[/url][/b] Java 1.4在Java 2D的功能方面引入了对硬件加速的支持。毫无疑问,硬件加速非常有用——不过有效的使用[u...

  • Java 学习笔记--------------做背景图片

    1. java.awt 类 Image java.lang.Object java.awt.Image 直接已知子类: BufferedImage, VolatileImage public abstract class Imageextends Object 抽象类 Image 是表示图形图像的所有类的超类。必须以特定于平台的方式获取图像。 

  • JAVA的内存处理也太慢了

    8000多行数据要处理15分钟左右的时间。。。擦。

  • java缓冲区

    1 缓冲区的分类 ByteBuffer CharBuffer ShortBuffer IntBuffer LongBuffer FloatBuffer DoubleBuffer 2 ByteBuffer读取数据的操作 容量(capacity):表示Buffer最大数据容量,缓冲区容量不能为负,并且建立后不能修改。 限制(limit): 位于limit后的数据不可以读写。缓冲区的限制不能为...

  • 10条有效提高网站易用性的代码技巧分享

    WebAIM团队博客的一篇关于网站易用性的文章,比较基础,简单翻译一下: 1. 给你的logo添加替代文本 这样有两个好处:屏幕阅读器能识别logo图片代表的含义,图片未加载到时,也能告诉非视障用户那里是你的logo。 几种方法: 或者,你用背景图来实现logo的话,也可以添加title属性来实现:   当然,链接+背景图的方式是最好的,但最好也加上title属

Global site tag (gtag.js) - Google Analytics