本文主要介绍了如何使用Vue.js开发微信小程序开源框架,具有一定的参考价值,有兴趣的朋友可以参考一下,希望大家看完本文后能够收获颇丰,下面就让小编带大家一起来了解一下吧。
前言
它是一个使用 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 开发小程序将直接带来以下开发效率的提升:
只需极少修改,即可将 H5 代码复用到小程序中
使用Vue.js组件机制开发小程序,可实现小程序与H5组件的复用
技术栈统一之后,学习小程序的成本降低,开发者从H5转到小程序时不需要再进行更多的学习。
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 方式开发小程序的能力。
Vue 代码
- 编写小程序页面为Vue.js实现
- 基于Vue.js开发规范实现父子组件关联
小程序码
- 根据小程序开发规范编写视图层模板
- 配置生命周期函数并调用相关的数据更新
- 将 Vue.js 数据映射到小程序数据模型
在此基础上,增加了以下机制
- 建立Vue.js实例与小程序Page实例的关联
- 建立小程序与Vue.js生命周期的映射关系,在小程序生命周期中触发Vue.js生命周期
- 建立小程序事件的代理机制,在事件代理函数中触发对应的Vue.js组件事件响应
这个机制总结起来很简单,但实现起来却相当复杂。在揭晓具体实现之前,读者可能会有以下疑问:
为了同时维护 Vue.js 和小程序,需要写两个版本的代码吗?
小程序负责视图层的展示,Vue.js的视图层还需要吗?如果不需要,该如何处理?
如何串联生命周期并实现数据同步和更新?
以上几个问题包含了框架的核心内容,下面会详细讲解。首先它是为了提高效率而设计的,提供了自动生成小程序代码的能力,小程序代码是基于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 ‘bitbucket:xxx.meituan. com:hfe/mpvue-quickstart' --clone 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部分,除此之外不需要做明显改动。改造主要分为以下几个部分:
将小程序平台的Vue.js框架替换为标准Vue.js
将小程序平台的vue-替换为标准的vue-
适配改造小程序与H5底层API差异
将H5转为小程序:现在我们已经使用Vue.js开发好了H5,接下来我们需要做以下几点:
使用小程序平台的 Vue.js 框架替换标准 Vue.js
将标准 vue- 替换为小程序平台的 vue-
适配改造小程序与H5底层API差异
基于小程序开发平台提供的能力,我们最大程度的支持了Vue.js的语法特性,但现阶段还有些功能尚未实现。
表 1:当前不支持的语法功能
项目转换注意事项:框架的目标是通过 Vue.js 打通小程序与 H5 的开发方式,实现代码最大程度的复用。但由于平台差异的客观存在(主要集中在实现机制和底层 API 能力差异),我们无法实现 100% 的代码复用,平台差异的改造成本不可避免。针对代码复用的场景,开发者需要重点关注以下问题并做好准备:
尽量使用平台上没有的、不需要转换和适配成本的语法特性。
避免使用不支持的语法特性,如slot等,以降低转换成本
如果使用特定平台API,可以考虑抽象出适配层接口,通过切换底层实现来完成平台转换。
最佳实践
表2中,我们对微信小程序、WePY三个开发框架的主要能力和特性做了一个横向对比,帮助大家了解不同框架的侧重点,并根据业务场景和开发习惯确定技术方案,总结了一些如何更好地使用它们进行小程序开发的最佳实践。
使用vue-cli命令行工具创建项目,使用Vue2.x的语法规范进行开发
避免使用框架不支持的语法特性。部分 Vue.js 语法无法在小程序中使用。尽量使用与 Vue.js 共享的特性。
合理设计数据模型,对数据更新和操作进行细粒度的控制,避免性能问题
合理利用组件化开发小程序,提高代码复用率
表2:框架使用特点比较
结论
该框架已经在业务项目中得到实践和验证,目前在美团点评内部正在大规模使用。我们来自开源社区,也希望为开源社区做贡献,为广大小程序开发者提供一套技术解决方案。初衷是让 Vue.js 开发者能够低成本接入小程序开发,实现低成本的代码迁移和复用。未来我们会继续扩展现有的能力,解决开发者的诉求,优化用户体验,完善周边的生态建设,帮助更多的开发者。
最后我们基于Vue.js源码进行了二次开发,增加了小程序平台的实现,保留了跟随Vue.js版本升级的能力,真心感谢Vue.js框架和微信小程序给行业带来的便利。
感谢大家仔细阅读本文,希望小编分享的《如何使用Vue.js开发微信小程序开源框架》这篇文章对大家有所帮助,同时也希望大家多多支持易速云,关注易速云的行业资讯频道,更多相关知识等你来学习!