
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
前后端分离的好处并不仅仅是开发效率,而是节省服务器资源和充分利用客户端资源。更进一步来说,前后端分离的页面是纯HTML(加JS)页面,可以放在CDN上来提升加载速度。后端的JSON接口可被PC端和移动端复用,降低重复劳动。
前后端分离使得浏览器端更符合它的本质,GUI应用就应该写成GUI应用的样子。前端也不仅仅是浏览器,还有PC和移动端。当浏览器端开发流程和移动端、PC端差不多的时候,各个前端之间的换岗和协同也会变得容易。
前后端分离不是摆弄框架,也不是SPA,而是用Ajax加载所有数据,并刷新局部页面。这个过程需要Ajax和DOM API的配合,和框架不框架没有关系。Web 2.0的多数应用在增删改三个操作上是Ajax,唯独查询是直接用模板刷页面,不信你可以随便找几个网页,查看源码来看看。混用这两种方式真的不别扭嘛?反正我是别扭。
我从来不反对前后端分离,反对的是框架鼓吹论。程序员为此付出了学习成本和迁移成本,却没有得到相应的开发效率。这个就叫“智商税”。jQuery也能写前后端分离的东西。甚至一些早期的MVC框架还不如jQuery,比如ng1。
ng1
ng1(AngularJS 1) 是个彻头彻尾失败的产物。至少我的同学中,没有人使用ng1写页面比我用jQuery还快。另外不要拿其它人跟我比,它们的快只是经验问题,不是ng1本身造成的提升。
使用ng1的HTML中,随处可见模板的大花括号,这个是从服务端的ninja风格模板学到的。然而,前端和后端不同的是,前端必须把HTML当成“组件”而不是“文档”来对待,模板是典型用于处理文档的方式,这么看来,ng1与组件化背道而驰。
ng1的数据绑定比起jQuery没有什么提升,它还是需要手动绑定。
在jQuery中,获得组件只需要选择器:
$('#name-text') = someName;
而ng1中,需要三个名称,一个是app,一个是controller,另一个是组件名称:
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
$scope.name = someName;
});
显然,三个名称比起一个名称更不容易解耦和复用,因为只有三个名称都匹配的时候才能完全复用,否则就得需要改代码。
然后让我们看看后端是如何渲染模板的:
render(template, context)
是的,就这一条命令,生成渲染后的文本,之后可以用于刷给输出流。
ng1如果想要做到同样的简洁,需要这样:
$scope.render(urlString, followingAction);
在浏览器中,上下文是远程资源,需要远程IO,不过本地资源远程资源都是IO不是吗?程序员还需要手写Ajax请求,手动刷给$scope,不觉得麻烦?
还有种观点认为,ng1的for标签比起jQuery纯手动操作效率要高。谁跟你比手动操作,你知道jQuery家族中有个东西叫做jQueryUI吗?它提供成套的组件,里面的表格组件使用一条语句就能插入数据。ng1跟它比组件,还嫩了点。
不知道你们说的jQuery包括不包括jQueryUI。jQueryUI强大、便利到超乎你们的想象。这才叫真正的组件化。
ng2比ng1好得多,也看不到什么模板了。但它算是完全不同的框架,要想迁移,还得“从学会到重学”。(手动笑cry)
组件化和模块化
组件化和模块化是个好东西,甚至缺少模块化是所有开发者的障碍。模块化提供了JS文件的包含或导入机制,使得JS文件中的对象可以相互依赖。在ES6之前,JS文件不能互相包含,只能被HTML包含而实现互相访问,这个非常别扭。ES6出来之后,部分用户的浏览器没能升级而支持ES6,浏览器端还得用babel这类东西。
然而除了浏览器中的任何领域,模块化都是天生的特性。可以说少了模块化就少了基本的抽象机制。
组件化,以安卓为例,小的组件可以组成组件组,组件组可以写到一个分离的xml中,可以静态包含,也可以动态使用inflate方法加载。甚至它还可以由Java类封装成自定义控件,包含或者加载的时候只写自定义名称就行了。毫无疑问这种机制在浏览器中需要HTML包含机制和解析机制的配合,在最新的HTML 5中,还是没能看到这种东西。
于是,“标准不足架构补”,劳动人民的智慧是无穷的,它们编写了一堆框架用于解决这个问题。浏览器端之前太缺组件化和模块化了,所以近几年呼声很高。
展望
可以看出,浏览器端正在走PC和移动端的老路,它的最终发展形态应该是移动端那样。然而现在正处于发展过程中,W3C好像也不关注这个事,各大流派都出来造框架,混乱是必然的。
但这是发展的必经之路。迷茫的浏览器端开发者可以去写写ios或安卓,看看成熟的GUI机制是什么样子。期待浏览器端有个更加美好的明天。