好无聊,过来练习下写作和表达能力。
首先,我觉得不要扯性能方面的问题,性能对于绝大多数非首页场景都不会是瓶颈。真要追求极致性能,就像淘宝首页一样,写成静态 html好了。
解决前后端分离的问题,目前大概有以下几种方案:
1. 前端写后端模板
1)前端和后端的模板是不一致的,比如前端可能用 Hanldebars,后端 java 经常用velocity,php 用 smarty,都由前端一起维护。比较恶心的问题在于,公司大了,部门多了,业务线多起来了,可能技术选型都不一样,比如有的业务线用 php,有的用 java,还有的用 python,他们的模板引擎可能都不一致,一是碎片语言实在太多了,更严重的是阻碍组件的复用,比如淘宝的通用吊顶和吊尾以及登录框是可以全站复用的,但之前用 java 写的,如果有的业务线用 php 咋办?于是他们对这些组件进行前端组件的静态化处理,即这些组件变成了 html+css+js的片段给其他业务线去用,数据请求通过 ajax 去做;但这些组件的一个特点是,依赖后端的动态数据较少,比如吊顶只是简单的一个登录信息请求即可,不适合需要大规模的后端查询页面。
因为1)的问题,于是有了下面的 2)
2.1) 前后端统一模板,模板语言嘛,用不同的语言都写个引擎就好了嘛,比如后端 nodejs 用 jade,咱前端也用 jade,嫌慢,咱先编译好。这个我还没找到比较大型的案例,我自己做着玩玩的时候用过。
2.2)有人觉得每个语言都要为一个模板语法写一个引擎,维护成本也大,模板语法一更新,所有引擎都要更新,真是去你大爷的- -! 于是呢,linkedin的做法是前后端统一模板为dust(你猜对了,js的模板引擎), 后端在渲染模板的阶段,起个线程跑v8引擎,去做模板渲染。于是成功解决了web组件(前后端都有)复用的问题。
1方案的普及需要有好用的工具提供给前端做开发调试mock等,比如淘宝曾经出了个 vmarket,据说难用所以没然后了。然后,fis 也有针对这个专门做了工具,具体去 fis 主页看好了,最近我在试用他的 java 解决方案,感觉还是比较容易上手的。
2. 前端 mvc(webapp)
感觉不用太多介绍吧,这几年比较火的架构,模板在浏览器渲染(尼玛,你说后端返回渲染好的 html 字符串,艹,这还能叫前后端分离- -!!!!)。
很多人这个方案问题在于seo 和性能。就 seo 来说不是太大问题,比如我从组里同学那获知的用个 phantomjs 渲染出页面丢给 robot 就好了,以及 google 是有针对 ajax 页面做索引的。
再说说性能,linkein 不用前端 mvc 的一个很重要原因就是性能,不过人家是因为页面要兼容到 ie7,ie7没有原生的 JSON 提供,解析起来确实是巨慢无比,所以放弃了。我觉得吧,如果你的项目仅需要支持ie9+等现代浏览器,基本可以考虑采用这个方案试试,当然 seo 这块我也没涉及到,不好扯淡,有朋友去试了可以教教我~
2方案对前端的要求会比1更高些,大规模项目的路由设置,模块切分,mvc 的职责,代码规范,目录结构的组织,都需要有一定功底,否则会玩脱。
这个玩法比较多,框架也很多,angularjs,ext,然后是我们这的一系列组合:
https://github.com/ecomfe/erhttps://github.com/ecomfe/esuihttps://github.com/ecomfe/oohttps://github.com/ecomfe/uioc打广告就是爽,呵呵呵呵。
3. 加一层中间层
比较火的,淘宝中途岛,比较低调的, fis 的 yogurt。 线上案例,百度音乐移动版,淘宝的对外项目不是太清楚,麻烦知道的同学告知下,内部项目主要是之前的数据平台部门的一些产品:在云端等。
我曾经是这个方案的拥护者,在经历了北京velocity大会的 fis 和淘宝的前后端分离实践分享,前不久d2的支付宝前后端分离实践分享,以及最近自己在搞一个业务线前后端分离的实践后,我现在成为这个方案的反对者。至少我觉得这个方案不适合大多数场景。
我们看看这个方案想要解决的问题:
1) 前端依赖服务端开发环境
2)在服务端View层高度耦合
3)沟通成本高
4)职责不清晰
对于1),可以通过开发优秀的工具去解决,至少 fis 的 jello 还不错。
对于2),不明白这耦合在哪里?
对于3),阿里的场景是前端写html Demo,再丢给后端套,敢问有几个公司这样做?
对于4),我觉得和2)一样,说的太虚了。你要说职责清晰,学学腾讯把 html css 也分出去得了
- -。。
关于 ppt 中说前端 mvc的问题,限于篇幅和精力,我懒得吐槽- -!,@otakustay 可以来试试- -!
再看看这个方案会遇到的问题:
1)学习成本实质是最高的。
天真的以为仅仅是语言没有学习成本? 后端的各种技术,安全,日志,监控,并发,事务,分布式 session,数据库读写分离,确定一般的前端能搞定?阿里经历了多少年,java 发展了多少年才成就了现有这么成熟的体系。 bat 或许能用 nodejs 去玩玩,因为技术的服务化和平台化比较成熟,都会提供服务化的api来用, 比如分布式的 session 访问,你只需要去调接口,不用自己去用 nodejs 实现一套了,再说用户信息,订单信息也是提供接口给你,至于他们怎么做性能调优,安全处理,数据库设计你都不用管。 但是一般的公司能做到这么高度的服务化么?
2)现阶段绝大多数前端水平还跟不上
即便很多前端号称自己会 node,也只是停留在写工具层面。
在 velocity 上,淘宝的分享者(p7)说,他们请了后端的同学帮他们实现 nodejs 的 session 读取框架,我就跪了好嘛,整个淘宝 ued 都找不出一个前端能写这个,你确定有几个前端有这个技术能力去 hold 这种技术?
在阿里也就那些数据平台部的人在这方面比较牛逼了,但是别人一直都是以后端为主,前端为顺手写,起点和一般前端完全不同,现在最多就是挂个前端的 title 在上面。
3)想要解决的问题都可以有更快捷简单的方式去解决
对大多数场景来说,我更推荐1的解决方案,简单快捷,没有太多成本。比较成熟的公司想要做组件化的复用可以参考 linkedin 的方案。 中间层可能只是一个舍近求远的方案。
最后,中间层这个方案给我感觉最多会成为一个,由 nodejs 渲染的模板引擎方案。
当然,我个人倒是蛮希望这个方案能够将前端的总体水平提高一个档次,能够将前端工程师变为工程师。