ele.me 是如何运行的

2016-12-07  本文已影响42人  Sophie12138

ele.me 是如何运行的

写这篇文章的时候,整个 APP 已经发生了不少变化,甚至已移除 Grunt 转用 Webpack。然而初衷未变,架构方式未变,半夜下笔。虽如此,本篇也不打算详述每个技术细节,更想做的是说清楚下面几点。

前端即业务

前后端分离:不要停留在「中途岛」

把每个页面都变成组件

当手工作坊进入工业自动化年代

难道你还没用 ES6 和 CSS Next?

编译加发布到所有机器只需 200 秒是一种什么样的体验?

机器与流量:APP 最大可承受多少并发?

题外:团队工作流

一、前端即业务

没毕业那会,鬼哥写了一篇文章说到「当有一份不错的工作只需要写 CSS」,就在腾讯。当年在《重构》的影响下,这个叫「重构」的职位应运而生,这是一个切图仔工作。直至今天,前端在携程仍是「重构」而 JS 工程师被称为「开发」。在很长一段时间内,甚至时至今日这个职位仍可能只负责把 PSD 转成 HTML,而数据输出是由后端工程师做的,市场上很多写「至少精通一门后端语言」也是从这点产生的。那时大家都在喊,前端是最接近用户的,最了解设计的,没错,可前端却不可能在一个公司中充当 CTO 的。

当 Ajax 成为日常,SPA 成为标配,甚至数据已都双向绑定,而 BaaS(Backend As A Service)慢慢被接受,后端 MVC 只保留了 M。iOS、Android、浏览器开发已经统称前端,Client-side MV* 驱动,前端即业务 —— 负责路由、响应用户操作和做数据通讯。如果今天你还在还原 PSD,我只能跟你说,辞职来我这。

二、前后端分离:不要停留在「中途岛」

大概 13 个月前,我加入饿了么,第一个项目是彻底改版 m.ele.me,说到前端后端要分离。有天 CTO 问「中途岛」研究过么?我当时说,那不叫前后端分离,不知道他心里有没有在问「你究竟懂不懂前端?」。要是我也写了一个 Node 层来负责与 PHP / Python 层对接,这样前端负责 Node + 浏览器端开发,可能会被升职加薪,因为最终变忙,把事情变复杂,而且有好多 bug 要修,像是劳苦而功高。可是我选择了 MV* 的 Angular.js 把用户业务接管到浏览器端,而后端作为 API 提供商,时间很快,熟悉业务加开发一个月把整个移动网站都开放出来给大家用,机智地避过了升职加薪的机会。

因为当时整个网站都运行在一个 PHP 框架上,Template 层使用了 Twig,既然已经想让浏览器接管一切,那么让 PHP 只需要处理 M 层就可以了。

无论是 Twig 还是 HTML,我们遇到一个问题:HTTP 请求太多了。解决这个问题其实可以使用script作为 Template,当然也可以直接把模板编译成 ng 的 Template Cache。前者写在 html 里太丑了,而且不能重用(你丫也可以写成单独一个文件啊),变成 js 文件吧,然后一起扔到 CDN 上去。情况就是这样:

Twig -> HTML -> Template Cache(js) -> (CDN)

结果整个网站变成了 Nginx + index.html + BaaS,呃,Node 给了很多机会,可是这会还有人想停留在「中途岛」吗?考虑一下下面的问题:

把 View 的渲染交给服务器,还是切分交给每个用户的浏览器?

是否需要重启 Nginx 、重启 PHP、重启 Node?

Cache API 后并发可以提高多少?

不需要复杂的 HTML 缓存机制/机器,CDN + 静态 html 可以搞多少并发?

我只想说一句,你选吧。

三、把每个页面都变成组件

把业务接管到浏览器同样会遇到一个问题:MV*。把目录分成lib/、model/、controller/、view/,太多这种做法了。比如 angular-seed 之前的分法就类似,把所有 controller、directive、filter、service 都放在不同文件。这样做是不是最佳实践呢?

上一篇下一篇

猜你喜欢

热点阅读