关于react和Angular的思考

最近react在github上大有赶超 angular的趋势,不得不说前端技术真是日新月异,比起 java c# php等老牌后端语言来说,javascript库的生命周期正在不断的被缩短和别挑战,距离angular发布至今也不过几年的时间,着实让人感叹。

  网上一直有人试图拿react与angular作比较,就好比拿facebook和google作比较,两者虽然同样知名,不过显然不是一回事。

  就我个人的感触而言,react无疑是一种ui组件化的解决方案,从设计思路上react和目前还是草案的webComponent显然并不相同,说起webComponent就得提大改特改的angular2.0,虽然angular团队声称,angular2 使用typescript并不是必须的,但从官网上的迅速上手看,并非如此,估计angular2.0未能获得如angular那样极大的反响,和不能直接使用javascript有相当的关系。尤其是typescript的模块系统,虽说语法和es6一样,但实际上却必须使用ts自家的包管理库,微软的东西就是这么蛋疼。相较于react,webCp显然还不能算是一种解决方案,至少在封装ui组件上还远远不够,无论是shadowdom 还是import template 以及自定义标签,元素有了,但是却没有一套将其整合的方案。虽然fb的flux并不那么让人接受,这不是单向数据流的错,而是相比mvc的思想而言 flux显然蛋疼的紧。不过react却着实是个好东西,它关于细粒度的组件理念,是真正把ui当成积木来玩了,react出来之前,我就有想法开发一个库,能够让ui跟玩积木一样还取了个名字叫toy,不过咳显然事实证明这并非易事。

  对比angular,我觉得react正如官方所言的是一个 viewControl 而不是单纯的view,对比时下热门的vm或许我们该称之为vc,加上state,抛开数据源的话,react构造的每个组件都是一个,我们姑且称为scv,state-control-view,通过状态来控制视图的变化,而数据源则只负责更新状态,避免了view和modal之间的数据流动。react将每一个组件都作为Component类的子类来看待,通过简单的组合就能保持多样的变化,从本质上讲,state和angular的scope并没有啥不同,都是一种状态管理的对象,不过react区分了props和state 而scope显然是一个混合体不仅是props还是state有时候甚至是modal。这导致了指令系统的一个根本性缺陷,那就是随着开发的推进,越来越不能被分离,angular另外一个大问题就是依赖注入,ioc本身应该是个不错的好东西,这也是angular出来时的一大特色,不过因为javascript本身缺少模块功能,这种依赖注入反而成了问题,对于一个大型应用,因为进度等问题,开发完成后,往往会产生庞大的js文件群,而指令,控制器,服务的相互依赖导致了项目的可拆封性就变得很差,想要重用一个指令,最后发现会引入一大堆的服务和控制器,当然最主要的是,指令显然是angular的bootstrap启动之后才能用的玩意。angular剥夺了指令的渲染权,也导致了指令的使用远不如react组件的灵活。所以angular更适合开发具有一定标准性的应用,譬如管理系统,各种管理系统,后台,前台等等。最后被人诟病的自然是angular的双向绑定了,这玩意就是个双刃剑,现在开来,对于react来说仅仅是省了一句setState,同样是组件的更新权,在react中你通过this.state来改变其属性的值并不会出发ui的重新渲染,只有调用setState方法才行,而angular的scope动一动就变一变,两者对比,react释放了组件更新的权利,而angular则是将其自动化,目前看来前者的做法显然更有益。