《程序员》杂志2017年第9期小程序专题封面报道

2024-05-25
来源:网络整理

前言

它是一个使用 Vue.js 开发微信小程序的前端框架。使用该框架,开发者将获得完整的 Vue.js 开发体验,同时提供对 H5 和小程序代码复用的能力。如果你想将 H5 项目改造成小程序,或者想将小程序开发完成后再转为 H5,这将是一个非常合适的解决方案。

目前已经在美团点评多个实际业务项目中得到验证,因此我们决定将其开源,希望更多的技术同行一起开发,应用到更广泛的场景中。项目地址请参见。使用文档请参见。

为了帮助大家更好的理解架构,我们来分析一下框架的设计和实现思路。本文主要内容曾刊登于2017年《程序员》杂志小程序专刊封面报道,内容略有修改。

小程序开发特点

微信小程序推崇极简开发方式,通过多页面聚合完成轻量级的产品功能,以离线包形式下载到本地电脑,通过微信客户端加载启动,开发规范简单,技术封装完整,开发体系完备,与H5类似,但又不完全相同。

小程序定位为简单的逻辑视图层框架,官方不建议用其开发复杂的应用,但业务需求很难简单化。复杂应用对开发方式有很高的要求,比如组件化和模块化、自动构建和集成、代码复用和开发效率等,但小程序开发规范大大限制了这些能力。为了解决以上问题,提供更好的开发体验,我们使用 Vue.js 打造了微信小程序。

什么是

它是一个用于开发小程序的前端开发框架,其核心目标是提高开发效率和提升开发体验。使用这个框架,开发者只需要对小程序开发规范有初步了解,熟悉 Vue.js 的基本语法即可上手。框架提供了完整的 Vue.js 开发体验,开发者编写 Vue.js 代码,解析成小程序并确保其正确运行。此外,框架还通过 vue-cli 工具向开发者提供示例代码,开发者只需要执行简单的命令就可以得到一个可运行的项目。

为什么要这么做

小程序内测之初,我们计划快速迭代一个媲美H5的产品实现,核心诉求是:快速实现、代码复用、低成本、高效率……在经历了多个小程序的搭建后,结合业务场景、技术选型以及小程序开发方式,我们梳理出了开发阶段面临的主要问题:

组件机制:小程序逻辑层与视图层代码分离,公共组件抽取后无法聚合为单一文件入口,需要在视图层与逻辑层分别引入组件,可维护性差;组件无命名空间机制,事件回调必须设置为全局函数,组件设计有命名冲突风险,数据封装性不强。开发者需要友好的代码组织方式,通过ES模块一次性引入;组件数据封装性好。成熟的组件机制对工程化开发至关重要。

多端复用:将已有的H5产品改造成小程序应用或将H5产品改造成小程序应用是两种常见的业务场景。从效率角度考虑,开发者希望通过代码复用的方式完成开发,但小程序开发框架无法做到这一点。我们尝试过通过静态代码分析的方式将H5代码转化为小程序,但只是做了视图层的转换,无法带来更多的好处。多端代码复用需要更成熟的解决方案。

引入 Vue.js:小程序的开发方式和 H5 类似,所以我们考虑和 H5 复用代码。根据团队的技术栈选型,我们确定 Vue.js 作为小程序开发标准。使用 Vue.js 开发小程序将直接带来以下开发效率的提升:

为什么是 Vue.js?这个取决于团队的技术栈选型,引入新的选型与技术栈的统一、开发效率的提升是相悖的,违背了开发工具服务业务的初衷。

进化

解决方案的形成源自业务场景和需求,经过三个阶段确定最终的解决方案。

第一阶段:我们实现了视图层代码转换工具,提升首次代码开发效率。将 H5 视图层代码转换为小程序代码,包括 HTML 标签映射、Vue.js 模板、样式转换等,并在此目标代码上进行二次开发。虽然实现了有限的代码复用,但组件化开发和小程序学习成本并未得到有效改善。

第二阶段:我们重点完善了代码组件化机制,基于 Vue.js 组件规范设计代码组织形式,并通过代码转换工具将代码解析为小程序。转换工具主要解决了组件间数据同步、生命周期关联、命名空间等问题。最终我们实现了 Vue.js 语法的子集,但如果要实现更多功能或者跟进 Vue.js 版本迭代,工作量就变得难以估计,感觉无穷无尽。

第三阶段:我们的目标是支持全套 Vue.js 语法,实现使用 Vue.js 开发小程序的目标。并且通过引入 Vue.js,实现了对 Vue.js 语法的支持,从而避免了手动进行语法适配。至此,我们实现了使用 Vue.js 开发小程序的目标。更好的实现了统一技术栈、组件化开发、多端代码复用、降低学习成本、提高开发效率的目标。

设计思路

Vue.js、小程序都是典型的逻辑视图层框架,逻辑层与视图层之间的工作模式为:数据变化驱动视图更新;视图交互触发事件,事件响应函数修改数据再次触发视图更新,如图1所示。

图1:小程序实现原理

考虑到 Vue.js 与小程序的工作原理一致,我们考虑将小程序的功能托管到 Vue.js 中,并在合适的时机将数据变更同步到小程序中,从而达到开发小程序的目的。这样,我们就可以专注于 Vue.js,参考 Vue.js 编写相应的小程序代码。小程序负责视图层展示,所有业务逻辑都汇聚在 Vue.js 中,Vue.js 将数据变更同步到小程序,如图 2 所示。这样,我们就获得了用 Vue.js 方式开发小程序的能力。为此,我们设计了以下解决方案:

图2:实现原理

Vue 代码

小程序码

微信开发基本重点_乌海微信小程序开发常用解决方案_微信开发示例

在此基础上,增加了以下机制

这个机制总结起来很简单,但实现起来却相当复杂。在揭晓具体实现之前,读者可能会有以下疑问:

以上几个问题包含了框架的核心内容,下面会详细讲解。首先它是为了提高效率而设计的,提供了自动生成小程序代码的能力,小程序代码是基于Vue.js代码构建的,不需要同时开发两套代码。

Vue.js 视图层渲染是通过方法完成的,在内存中维护一个虚拟 DOM,没有必要使用 Vue.js 来完成视图层渲染,所以我们修改了该方法,禁止视图层渲染。熟悉源码的读者都知道,Vue 有多个平台实现,除了我们常见的 Web 平台,还有 Weex。从此我们又增加了一个新平台。

生命周期关联:生命周期与数据同步是框架的灵魂。Vue.js与小程序的数据是相互隔离的,各自有不同的更新机制。从生命周期与事件回调函数入手,在Vue.js触发数据更新时实现数据同步。小程序通过视图层呈现给用户,通过事件响应用户交互,Vue.js将数据变化与逻辑维护在后台。可以看出,数据更新源自小程序,由Vue.js处理,Vue.js数据改变后,再同步到小程序。为了实现数据同步,修改了Vue.js的实现,将更新小程序数据的逻辑加入到Vue.js的生命周期中。

事件代理机制:用户交互触发的数据更新都是通过事件代理机制完成的。在 Vue.js 代码中,事件响应函数对应到组件,Vue.js 会自动维护上下文环境。而在小程序中并没有类似的机制。因为 Vue.js 执行环境中会维护一个实时的虚拟 DOM,完全对应到小程序的视图层,所以我们认为在小程序组件节点上触发事件后,只要找到虚拟 DOM 上对应的节点,就完成了对应事件的触发;另一方面,如果 Vue.js 事件响应触发了数据更新,则会自动触发其生命周期函数更新,并在此函数上同步更新小程序数据,实现数据同步。

如何使用

框架本身由多个npm模块组成,入口模块已经处理好了依赖,开发者只需要执行如下代码即可完成本地项目的创建。

# 安装 vue-cli $ npm install --global vue-cli # 根据模板项目创建本地项目,目前为内网地址 $ vue init mpvue/mpvue-quickstart my-project # 安装依赖和启动自动构建 $ cd my-project $ npm install $ npm run dev

执行上述命令后,小程序目标代码会构建在当前项目的 dist 子目录中。使用小程序开发者工具加载 dist 目录即可开始本地调试和预览。示例项目遵循 Vue.js 模板项目规范,使用 Vue.js 命令行工具 vue-cli 创建,代码组织方式与官方 Vue.js 示例一致。我们为小程序定制了 Vue.js 和 ,这部分依赖也已经构建到项目中。

该框架针对小程序开发中两种常见的代码复用场景,为开发者提供了解决方案和技术支持,开发者只需要在此指导下进行项目配置和改造即可。我们已实现一个将H5转换为小程序的项目,下图是使用该框架的转换效果:

图3:H5及小程序转化效果

小程序转H5:直接使用Vue.js规范开发小程序,代码本身和H5没什么区别,具体代码差异集中在平台API部分,除此之外不需要做明显改动。改造主要分为以下几个部分:

将H5转为小程序:现在我们已经使用Vue.js开发好了H5,接下来我们需要做以下几点:

基于小程序开发平台提供的能力,我们最大程度的支持了Vue.js的语法特性,但现阶段还有些功能尚未实现。

表 1:当前不支持的语法功能

项目转换注意事项:框架的目标是通过 Vue.js 打通小程序与 H5 的开发方式,实现代码最大程度的复用。但由于平台差异的客观存在(主要集中在实现机制和底层 API 能力差异),我们无法实现 100% 的代码复用,平台差异的改造成本不可避免。针对代码复用的场景,开发者需要重点关注以下问题并做好准备:

最佳实践

表2中我们对比了微信小程序、WePY三个开发框架的主要能力和特点,帮助大家了解不同框架的侧重点,并根据业务场景和开发习惯确定技术方案,并总结了一些如何更好地使用它们进行小程序开发的最佳实践。

表 2:框架使用特性比较结论

该框架已经在业务项目中得到实践和验证,目前在美团点评内部正在大规模使用。我们来自开源社区,也希望为开源社区做贡献,为广大小程序开发者提供一套技术解决方案。初衷是让 Vue.js 开发者能够低成本接入小程序开发,实现低成本的代码迁移和复用。未来我们会继续扩展现有的能力,解决开发者的诉求,优化用户体验,完善周边的生态建设,帮助更多的开发者。

最后我们基于Vue.js源码进行了二次开发,增加了小程序平台的实现,保留了跟随Vue.js版本升级的能力,真心感谢Vue.js框架和微信小程序给行业带来的便利。

关于作者

程权,美团点评酒店旅游事业群高级前端工程师,目前主要从事移动端及小程序技术工作,致力于小程序的工程化开发和业务级应用。

招聘时间~美团点评酒店及旅游业务研发中心招聘中高级前端工程师及技术专家,欢迎将简历投递至#。

分享