关于前端服务化的总结

“每18至24个月,前端都会难一倍”(注:2015深JS大会上,赫门在《前端服务化之路》主题演讲中说的一句话)。难,是前端发展史偶然中的必然。但难,也造就着前端当下的繁荣。

Ryan Dah之所以选择用Javascript作为Node.js的基础语言,主要是因为它是单线程的,没有服务器I/O,没有历史包袱,有较低的门槛和比较良好的社区(更多内容可见:Node.js Interview: 4 Questions with Creator Ryan Dahl)。这看似是偶然,但实际上正是Javascript的这些优秀特性必然被历史选择,承担推动Web技术发展的使命。

在Node.js的推动下,前端技术大放异彩,逐渐告别“石器时代”,走向“工业时代”。而通过推动前端迈进”工业时代”的“三化“建设的力量,分别是前端的自动化、实时化与服务化。

前端服务化

所谓服务化,即使用者只需调用,而毋须知道内部的实现,说白了就是标准化(引自2015深JS大会上,赫门主题演讲《前端服务化之路》的内容)。Node.js的出现使前端服务化成为可能。Node.js开发的系统可以作为接入层,调用Java、C++等提供的基础功能,处理数据库,然后将数据吐给浏览器进行渲染。简易言之,就是用Node.js代替业务逻辑这一层。最后造就的成果是,不仅Java,C++可以放弃业务逻辑,更专注于数据处理的基础服务,而且Node.js能更专注于业务逻辑,提供API服务给浏览器端的代码进行调用。

用Node.js作为接入层,让前端涉足“后台”的业务成为可能,而且能提高开发效率,还能更方便地使用最新Web技术,如Big Pipe,WebSocket等对页面进行优化。早前淘宝进行的前后端分离,腾讯AlloyTeam正在进行的玄武框架,都是在推动前端服务化做出努力。

除了Node.js作为接入层提供服务以外,淘宝的赫门还提出了将前端Web Component作为一种服务,提供给后台使用。Javascript的AMD与CommonJS规范的订立使Javascript的模块化开发成为可能,也就自然而然地推动了前端的组件化。但赫门认为组件化的Web Component是散乱的,并没有办法一统江湖(如Angular、React这类框架),而他的理念就是希望帮助Web Component重新定位,也就是将其标准化。他在演讲中举出一个应用场景:使用React开发了一个组件,给前端直接使用React,而给后端用的时候则先用Flipper输出成Web Component再用。赫门的这个Flipper在技术上并没有太大的新意,其创新之处在于,他基于Flipper提出的服务化理念。

AlloyTeam内部其实有类似的更完善的方案—— MVVM框架Q.js及Ques组件方案。赫门的Flipper只管将代码转成标准化Web Component,而Ques组件方案不仅在开发过程中可以用标准化Web Component,而且在基于构建,开发的过程中就已经可以将HTML,CSS及JS模块化,更好地组织代码。而Q.js则是一个类Vue.js的的MVVM框架,它可以使用Ques组件方案,结合MVVM框架的特性,能够轻松驾驭一个项目的开发 Ques。

大型前端工程架构可能面临的问题:

  • css样式覆盖
  • js调用冲突
  • 技术更新快,新旧技术栈冲突

css和js原生没有命名空间的支持, 是在同一个浏览器页面沙箱内的静态资源。css覆盖和js冲突,会造成不同业务之间的技术选型冲突。

如何实现前端服务化

  • 参考后台如何做到服务化:

    - 通过技术中立的网络消息、文件接口经行通信;
    - 服务间的接口采用粗粒度的业务模型,而不是技术实现模型;
    - 服务间约定接口及上面承载的业务含义;
    - 各独立进程、独立部署机器、独立升级演进;
    - 服务间接口可以被监控和追踪,用于故障定位;
    
  • 前端类似机制服务化:

    1. 将一个页面划分若干可集成的业务单元=======>对应后端应用/服务;
    2. 业务单元各自独立,不暴露细节,也不影响其他单元的技术选型;
    3. 业务单元只通过有限的消息进行通信实现协作;
    4. 各个业务单元可以部署在不同服务器,甚至域名上,独立升级;
    5. 各个业务单元之间消息传递以中间件middleware或者钩子Hook监控跟踪;
    6. 将业务单元可以挂载PIU(Page Integratable Unit)全局命名空间之上;
    
  • 面向集成的前端元框架Prelude

    1. 提供PIU之间协作和通信的基础能力;
    2. 管理全局冲突
       - 浏览器特性检测和Pollyfill
       - 全局JS注册、注入
       - 拉起全局样式,hash片段
       - 全局页面元素
       - 消息通信(发布/订阅模式)
       - 集成接口:国际化、皮肤、会话管理(登陆、注销、身份)等
    3. 不越界管理提供
       - 组件、控件、路由管理、公共或具体业务
       - 业务接口等除集成所需的任何接口
    

前端服务化之路借鉴后台的服务化,类似于后台开发的独立进程,彼此互相解耦,只通过消息接口通信,业务单元彼此解耦、互相相对独立、技术选择互不影响、新旧技术栈可以迭代更新,可以很好适合前端大型工程架构的实现。