随着外卖业务的高速发展,大量的业务开拓需求相继而来。
像人手紧缺、重复开拓、沟通效率拙劣等问题,暴露得愈发明显。
于是,我们有了这么一个想法:能否基于现有大量业务系统的构造固定、需求紧急、交互样式哀求不高档特点,搭建一个平台,它把已经成型的组件像乐高玩具的零件一样,利用拖拽的办法组装成终极的页面,同时能够让各个业务快速的接入。

在美团点评一次黑客马拉松中,我们将这一想法付诸实践。
在参赛的四十多支团队中,得到了第二名。
这给了我们坚持下去的信心,也明确了后续努力的方向。
经由一段韶光的迭代,目前乐高形成了较完善的开拓和生产流程:

基于平台供应的标准,开拓出独立的组件。

外卖html5模板美团外卖前端可视化界面组装平台乐高 Node.js
(图片来自网络侵删)

组件经由不同形式的排列组合,形成终极的产品界面。

2 用户利用

乐高平台的运用可分为三大部分:面向用户的组装工厂、面向开拓者的开拓视图以及面向后端做事化的暴露接口。

2.1 组装工厂

2.1.1 视图布局

页面组装如图一所示,紧张包含五部分:

组件树

组件树是页面的骨架(①所示区域)部分,由内置的各个组件组装而成。
乐高为组件树供应了丰富的操作(②右键弹框)选项。
除了添加、拷贝粘贴、预览、删除等功能,还可以通过拖动组件在组件树中的位置(③区域),即时的在预览区域展示出效果。

预览页面

预览区块(④所示区域)霸占了页面的右半边部分。
在组件树中,每个组件都可以单独预览。
组件的预览,显示的是这个组件及其子组件共同浸染的效果。
预览根组件,能看到完全的页面。
也可以通过 “页面预览” 按钮进行完全页面的预览。

右侧模块属性

每个组件,都有可配置的属性(3.2.1节提到的模块示例代码中的Model字段),打开⑤区域的面板可以对左侧选中的组件进行配置。
如,配置按钮组件的颜色、大小等,都取决于组件开拓者对该组件的预留项。

顶部页面操作

⑥区域部分,包含对当前视图的操作。
视图可以理解为一个独立的页面,包含了打开、发布、重命名等等功能。

左侧导航

⑦区域部分,包含了三个可选标签。

第一个是下图所选的组装工厂。

第二个是组件的开拓工厂。

第三个为全体系统的康健、QPS等等运营数据的实时监控。

(图一)

2.1.2 视图脚本

一个终极完成的页面中的脚本,按照来源分为了三块。

图二所示的脚本编辑区域。

当前页面所利用的UI库(下文中会提到)中,乐高平台默认利用的是外卖自己封装的袋鼠UI。

其余一部分来自每个组件中自己编程接口的实现(即3.2.1节模块示例代码中的Script字段)。

(图二)

2.1.3 同步数据

乐高系统中供应了数据源的观点。
用于仿照、校验模板页面中的数据。
有时,后端须要乐高输出FreeMarker或者EJS模板,而非HTML页面。
为了保障页面在乐高中的正常开拓和预览,我们须要Mock一部分同步(可理解为后台写入ModelView的)数据。

将JSON格式的数据写入数据源,即可实现Mock数据。
此外,在后端调用乐高接口时,数据源还会校验传入数据的合法性。

(图三)

2.2 开拓视图

乐高是一个平台。
开拓者可以在乐高中按照自己的喜好、想法、思路开拓自己的模块。

(图四)

组件的编辑

①区域为组件供应了编辑的功能。
当前编辑的组件的开拓者、修正韶光、创建韶光等信息,会显示在④区域部分。

组件分类管理

在平台中存在了大量的组件的时候。
我们须要对组件进行分类管理(③所示区域)。

组件版本管理

每个组件都有自己的版本号管理(②区域所示)。
开拓者点击“组件保存”后,会在版本列表中增加0.username的临时版本,用于保存当前修正的信息。

2.3 系统接入

乐高目前供应了Java和Node.js两种SDK的接入办法。

2.3.1 Java

在工程中引入JAR包。
可通过调用SDK接口,从乐高系统获取页面或者模板。

获取的类型有两种:渲染完成的HTML代码和模板代码(目前支持FreeMarker模板)。

/

2.3.2 Node.js

安装完乐高依赖的模块后,可参照下述示例调用:

'use strict';var lego = require('lego');/3 事理

3.1 理念

在AMD、CMD、CommonJS等模块化标准开始盛行后,模块化的思维办法,给社区的前端开拓者们造成了比较深刻的影响。

前端开拓有了比较强烈的意识,对原来混沌的JavaScript代码按照标准模式进行组织和分类。
据此来构建出的Web App,不仅提高了系统的可掩护性,并且便于和其他开拓者进行沟通,从而形成一个巨大的开拓链条。
借助其他开拓者供应的一批模块,使我们能够专注于业务逻辑,同时降落代码冗余、开拓本钱和潜在风险。

基于模块化开拓的大体思路。
我们在对一堆看似凌乱无章的DOM构造进行归纳、总结、提炼,使之成为一个个独立的组件。
数个组件的协同事情,呈现出一个完全的页面。
乐高系统设计理念,正是源于如下所示的一个等式:

这里的 节点描述、数据、功能逻辑 便是下文中要提出的模块部分。

更为直不雅观的表述,如下图所示的一个基本构造,可以组成一个大略的页面。
组件粒度的划分,有比较充裕的灵巧性,可以由组件设计者自己定制。

3.2 组件

组件是组成任何一个视图的最根本元素,是全体平台的基石。
组件之间的耦合度、通信、可扩展性、易用性是否足够强大,很大一部分程度上决定了全体系统的质量。

3.2.1 形态

乐高的组件是对其背后弘大的样式/交互资源库的抽取(默认为袋鼠UI系列,也可以是其他的前端资源库),倚重于对组件HTML构造,交互调用的描述。
每个组件卖力拼装自己的HTML构造,和利用组件库中预存的交互。
因此,推举的组件的开拓办法中,不包含对CSS的描述,但是大概可通过Hack的办法增加每个组件的CSS。

每个独立组件供应了8个须要实现的接口:

/

3.2.2 功能

乐高的组件作为一个界面系统的元素部分,在设计之初须要考虑到以下的五个方面。
通过这几部分,逐渐的形成了一套比较完善的模块化方案:

组件的通信

业务组件之间的数据通报,是一个比较常见的的场景。

我们给每个组件实现的编程(Script)接口中通报了三个参数mvid、evtMgr、modalData。
个中,evtMgr便是乐高系统中的事宜中央。
通过绑定或者触发相应的事宜,在实现模块间通信的同时,较好的解耦了模块。
示例代码:

// 事宜的触发

数据给组件的交付

部分业务组件会有自己的数据。
数据从来源划分,可以分为系统数据、配置数据。
系统数据又可以被划分为同步数据和异步数据:

配置数据来自利用乐高配置的职员,在开拓模块的预留接口中配置信息。

系统数据中的异步数据可以通过AJAX的办法从后端拉取。

同步的数据,装置时可以配置在数据源中,方便预览效果。
利用时可以直接在模块的Render接口中调用。

exports.render = function (node) { var _modelData = node._modelData; var _children = node._children; var content = '';

组件编程接口的暴露

在“3.2.1 形态”章节中所示的8个编程接口,对模块的开拓者开放。

组件的版本掌握

为了在修正、发布组件时,不对线上页面造成影响,也为了知足多人协同开拓的需求,我们实现了大略的版本掌握功能。

每个组件预留了开拓者版本。
开拓完毕后,须要单独的发布该组件。
在视图中进行组装时,可以选择所须要的版本,如果新版本有问题,能够及时做到单独模块的线上回滚。

组件的渲染

乐高中比较核心的功能。
是实现了一个页面的解析引擎。
输入为在工厂中形成的页面描述的数据构造,逐步添加外部资源(数据源、界面资源库、模块)进行组合,进而天生终极的HTML或者模板。

外卖的系统,大多利用freemarker.jar作为页面渲染引擎。
因此,乐高中也包含了一个freemarker.jar的模板引擎。
整体事情流程如下图所示:

来自于视图组装工厂产出的页面信息的数据构造,经由解析引擎调用了其他资源(数据源、框架、模块描述)渲染后。
形成了终极的HTML或者模板,返回给后台的做事中转给终极的用户。

3.3 流程

乐高利用了Node.js Express框架搭建,作为前端做事化的办法存在。

同时这个做事也供应了内部用户(页面组装者)访问的界面。
整体事情流程如下所示:

3.4 视图构造

上文先容了组装工厂。
我们知道在页面组建完毕之后,系统中终极形成的是一个扁平的页面数据构造,用于对页面的描述。

这个数据构造中,除了对每个节点的描述之外,利用了_children、_parent等来描述该节点在当前视图的树状构造中所处的位置和层级。
详细的构造如下所示:

{

随着页面的创建和发布,页面的存储构造,会被持久化到乐高数据库的字段中,以便后续的调用修正。

4 结语

4.1 现状

至截稿前,乐高拥有了55个框架组件和77个业务组件,共132个。
覆盖了外卖奇迹部的6个项目,包含了108个可访问的线上页面(视图)。
数目还在不断的迅速增加中。

举个例子,一个比较范例的场景,业务系统中常用的列表查询页面和编辑表单页面,之前开拓页面须要半天韶光,而乐高半小时内即可组装一个页面。
开拓效率上的提升效果比较明显。

4.2 生态

在外卖的前端开拓实践中,乐高系统已经成为大量业务系统开拓的轴心一环。
在对袋鼠UI资源库中的组件进行提取,形成终极的用户可见页面过程中,不仅推动了外卖整体视觉和交互规范的逐渐完善,也使其在前端技能中得到落实——袋鼠UI资源库。

视觉规范、袋鼠UI和乐高形成了一个完全和不断循环的开拓生态。

4.3 上风

平台化的规范了交互办法、页面及组件样式。
非常适宜交互样式比较固定的业务系统。

大略单纯高效的界面搭建,节省了大量的开拓韶光和精力。

利用了可视化的编辑模式,所见即所得。
极大的降落了前端开拓的学习本钱和门槛。
团队中其他角色的成员,也能够轻松大略单纯的上手。

当前市情上存在着比较多的前端组件化框架,大多门槛较高。
乐高供应更低廉、简洁的利用办法组装大量重复存在而交互样式较为单一的业务系统,实现了自己的模块管理机制。

作为一种新开拓模式的考试测验,乐高在不断地完善。
利用乐高平台,在前端自动化埋点、性能优化等等方向,会有很多有趣的创新和打破。
我们将会持续给大家分享。

乐高也在积极的方案开源,我们会尽最大的努力,希望早日能够与大家见面。
末了,附上一条硬广,美团外卖长期诚聘高等前端工程师/前端技能专家,欢迎发送简历至:xukai#meituan.com。

作者简介

本文作者均来自美团点评外卖奇迹部。

徐楷,外卖奇迹部Web前端组卖力人。
2013年作为第一名前端工程师加入美团外卖。
见证了美团外卖从每天10多单到900多万单极速发展的过程。
卖力了早期美团外卖前端团队的组建、梯队的培植和职员的培养。
搭建了外卖整体前端根本举动步伐,目前卖力to B、to C以及运营干系的前端项目。

冰冰,资深前端研发工程师,外卖奇迹部前端业务增长组卖力人。
2010年北理硕士毕业后,曾就职MTK、IBM,后作为联合创始人创建微秘科技。
2016年加入美团点评,作为技能卖力人主导了多个活动及商家券红包等项目的上线。

东亮,美团外卖高等前端研发工程师。
2012年大连理工毕业,曾就职多米音乐,大家网,先后从事游戏开拓及Web前端开拓,2015年加入美团点评,目前致力于外卖面向用户以及运营等方向的前端研发事情。

不想错过技能博客更新?想给文章评论、和作者互动?第一韶光获取技能沙龙信息?

请关注我们的官方微信公众年夜众号“美团点评技能团队”。