2017年1月9日,微信官方在2017微信公开课Pro上发布的小程序正式上线,开创了小程序开发的时代。咱们的美团外卖的业务也逐步加入到小程序开发的队伍中。小程序有着无需安装、触手可及、用完即走、无须卸载的特色,属于“轻”量级的应用。前端
可是这样的“轻”量级应用却承载咱们很是复杂的外卖业务,对于咱们外卖团队来讲,也面临着不少新的机遇和挑战。本文将详细介绍咱们外卖小程序的解决方案与经验,但愿可以对你们有所启发。本次分享主要由如下四个部分展开:vue
小程序发布时,其定位主要是功能比较简单的轻应用,因此原生框架设计相对比较简单,而对于业务相对复杂的中大型互联网企业,小程序产品支持还不够完善,项目较难进行管理和维护。npm
针对业务场景的多样性,咱们采用了较开放的框架策略:项目既支持原生框架开发,又支持自由引入第三方框架,以知足各业务场景的需求。gulp
原生框架开发:对主流程等相对独立且稳定性要求高的业务采用了原生框架进行开发。小程序
支持mpvue(第三方框架):营销业务须要支持Web页、小程序页等多种渠道,经过引入mpvue,可使各渠道复用Vue组件,进而提高开发效率。后端
针对咱们面对的业务场景,咱们将各业务通用的基础功能进行了梳理,抽离成一些组件来进行统一管理和维护。高复用性组件可以有效提高开发效率,并且研发质量也能够获得很好的保障。微信小程序
多团队合做开发小程序的模式下,咱们将核心的主流程业务放在主包,其余各业务都存放在各自子包当中。这样作的目的,是确保每一个包中的业务相关性较强,避免了用户使用中会有频繁的子包模块加载过程,也能保证各业务团队之间的隔离,避免出现业务冲突。缓存
咱们的通用组件和各业务子包都托管在npm上,而后进行模块化的管理。并经过对构建脚本的改造,将npm引入到小程序主包中,进一步保证各业务间的隔离性,以下图所示:服务器
同时咱们在小程序开发周期中,制定了版本管理、准入流程、发布流程等,规范化小程序各环境版本的使用,进一步确保各团队间的顺畅合做。总体架构图以下图所示: 微信
咱们的系统架构,最底层是微信小程序的原生API,中层是各业务通用的核心组件,如登录、WebView封装组件、监控、数据上报等,均由统一的团队建设和维护。对编译构建工具进行插件化改造,能够自由引入第三方框架进行开发。最上层是各业务方经过拆包将业务隔离开来。
在本地开发过程的整个构建流程以下图所示。开发者在本地工做目录执行操做,经过gulp构建目标文件到本地工做目录中,再经过微信开发者工具对生成的代码进行调试和发布。同时咱们的构建支持Mock服务,模拟后端服务器接口,提升联调效率。
咱们的发布规范过程以下图所示。和通常的前端发布过程相似,差别点在于必须通过微信开发工具才能上传代码进行微信方的审核与发布。
而咱们的指望和后期规划是将整个CI构建和发布过程一体化。以下图所示:
近期微信开发者工具提供了命令行工具和HTTP方式来支持小程序的预览和上传,咱们正在将整个流程进行整合与改造。经过在服务器中安装微信开发者工具,将整个过程使用CI链接起来,减小人工操做的过程,来提高发布流程的效率和质量。
不过在实现彻底自动化发布的道路上依然面临着一些问题:
小程序原生框架对于模块和组件的支持也处在不断完善的过程当中。最先小程序框架支持CommonJS规范,可使用require、module关键词定义和引入js模块,支持经过@import来引入样式文件,支持在布局文件wxml中支持定义template模板,能够经过include、import和wxs等标签引用外部文件。
而实现一个组件,经常wxs逻辑,wxss样式和wxml布局三个文件都须要进行定义,这就意味着引用一个组件时,须要在三个文件中同时引入。组件独立性差,与页面文件高耦合,不利于开发和维护,使用起来很是不便。
所以在基础库1.6.3版本中,小程序开始支持自定义组件,只须要经过标签就能够很方便的引入本身开发的组件。但早期的自定义组件版本,只容许绑定JSON兼容格式的数据,并不支持回调函数,在使用上存在很大局限性。直到2.0.9版本才开始支持函数传入。
近期,小程序原生支持了npm,但基础版本库要求在2.2.1及以上,而且须要经过微信开发者工具进行一遍构建。整体来讲,小程序框架在不断完善对组件的支持,但若是考虑低版本用户的兼容性,开发者开始有较多工做要作。
咱们将组件划分为三种类型,页面组件、UI组件、功能组件。
咱们基于微信组件的演化也在扩充和完善咱们的通用组件过程当中,同时也相同存在着一些局限性,以后针对通用组件的关注方向主要在如下两方面:
大小约100k随机对象读写清空缓存各100次,小程序Storage与Web LocalStorage 耗时比较以下图所示:
可见小程序的性能远低于Webview的LocalStorage,因此针对这样的现状,咱们Storage组件的封装与设计必须重点考虑性能问题的解决与规避。
针对小程序Storage的读写性能差,且存储量有限的状况下,咱们Storage的设计有如下特色:
整个流程以下图所示:
防止误调用底层API致使数据不一样步:
目前小程序开发工具也在不断完善中,最近增长了不少诸如npm 支持、命令行调用、HTTP调用、Git版本管理、云开发、体验评分等功能,工具的完善为开发者带来了必定便利。
小程序的特殊性致使小程序开发人员与微信提供的开发工具的强粘黏性,能够感知到微信小程序开发工具的设计是指望实现一个小程序开发的闭环。
但这样的一个“黑盒”工具也存在着必定问题——没法知足不一样团队和业务的一些需求。因此咱们也但愿,将来小程序开发工具能提供一些工具开放功能的API,咱们能够对开放功能进行改造实现,最终知足各个团队不一样的需求。
同时小程序在最初的定位(功能比较简单的轻应用)和设计下,性能不会过高。若是承载较大型复杂的业务,势必会遇到一些性能问题,因此性能问题的关注是比较重要的。官方对于性能问题在开发上的建议是控制setData 的数据体积大小、控制setData的频率。但真实的业务场景中有不少是没法避免频繁setData的,如对滑动操做(较高频的动做)后的一些特殊需求、复杂页面点击快速响应等。
美团外卖在基于这些问题的规划包括:
此外,与性能并存的一个问题是小程序体积的限制(不超过2M,包含子包的主包,总包不超过8M)。这样的限制有必定道理,由于小程序渲染前,须要通过下载整个小程序的包体、后端请求数据、对数据进行渲染这样相对较长的周期,包体过大必然影响用户感知渲染的时间,影响用户体验。
减少体积的规划采起方案包括:
这两大重点问题在咱们的业务场景和当前架构设计下,都是将来长期须要关注和解决的问题。
咱们复杂的业务在开发小程序时虽然面临着这样一些问题:“轻”量应用的小程序对于较大型的应用和较复杂的业务场景存在着必定的局限性,“轻”量理念的原生框架稍简单,不足以完美支撑咱们较大型和复杂的业务;多团队合做如何保证高效性;如何更友好地知足不一样的业务场景。
最终咱们经过在技术框架层面优化设计和规避一些小程序局限性问题,制定更合理的流程和建设更强大的工具来提升工做效率,基于微信小程序组件化演进建设咱们的组件化生态,来解决咱们所面临的问题。同时也对微信小程序工具、性能、体积等方面进行展望和规划咱们的后续进程,保持咱们的深度探索和实践。