滴滴云跨端框架 Chameleon 快应用原理与实战详解
0.目录
点击进入chameleon项目页(github)
1. 背景
快应用技术方案 快应用平台服务架构 快应用技术架构 对比小程序
4. 前端拓展快应用——原理篇
新端扩展配置化实现 实现cml-quickapp-plugin 实现cml-quickapp-runtime 实现cml-quickapp-api 实现cml-quickapp-store 实现cml-quickapp-ui-builtin和实现cml-quickapp-ui
5. 接入和使用
接入快应用 全局安装最新的 chameleon-tool 工具 启动快应用服务 安装和更新 package 修改 app.cml 修改 chameleon.config.js 配置文件 修改项目代码 快应用启动命令
6. Bug & Tips
1. 背景
计算机技术历史发展告诉我们,每一种新技术出现都会经历 "各自为政" 的阶段,小程序技术也不例外。微信小程序作为首创者,虽然其他小程序都在技术实现原理、接口设计刻意模仿,但是作为一线开发者面对同样的应用实现往往需要重复开发、测试,从前 1 单位的工作量变成了 N 单位的工作量。
除此之外,自跨平台兴起以来,各种各样的框架层出不穷,从一开始的 Hybrid App ( PhoneGap / Cordova / Ionic ),到前两年热门的 React-Native 和 Weex,再到目前风头正盛的 Flutter,这期间还兴起了 Web App 的热潮 (PWA 和各种小程序),这还不包括 watch、TV、车载 APP 等其他 “端”。
Chameleon(简写 CML )是一款真正专注于让一套代码运行多端的跨端框架。Chameleon 团队秉承 "一套代码运行多端,一端所见即多端所见" 的初心,拥有业内先进的工程化设计、丰富的基础以及独创多态协议,提供标准的 MVVM 架构开发模式统一各类终端。在最初支持 web、weex、wx (微信小程序) 三端之后,凭借其多态协议的优秀设计思想、灵活的工程化配置以及跨端标准协议,CML 工具可以迅速扩展新端,目前已经成功扩展支持全平台小程序(微信、支付宝、百度、qq、头条)。
快应用也沿用着 MVVM 的架构开发模式,因此,基于CML的跨端标准协议扩展快应用后,可以快速实现一套代码运行web、native、全平台小程序、快应用。
当前阶段在开源社区存在多种跨端解决方案,除了滴滴的 Chameleon 跨端框架,诸如京东的 Taro 、去哪网的 Nanachi 、美团的 mpvue、腾讯的 WePY、Dcloud 的 uni-app 等跨端框架也都有各自的生态和使用场景。在选型方面,我们对这些框架的生态进行了较为细致的比较和探究,对比结果如下:
得益于chameleon的灵活的工程化配置,chameleon可以灵活的支持微信小程序的云开发,具体参考 chameleon支持云开发
3.快应用介绍
▍快应用简介
快应用是基于手机硬件平台的新型应用形态,覆盖 10 亿安卓设备; 快应用标准是由主流手机厂商组成的快应用联盟联合制定; 快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放; 快应用具备传统 APP 完整的应用体验,无需安装、即点即用;
快应用目前使用如下技术方案: 使⽤前端主流的模版+数据绑定框架编写代码(Vue.js); 平台提供大量扩展能力,包括系统能力和服务集成能力; 默认使用原生JS-Native 渲染,达到原生应用的性能和体验;
▍快应用平台服务架构
Platform Service: 平台服务,提供如何存储,场景接口,分发下载,数据统计 —————— Developer Service: 开发者服务,提供开发者文档及相关工具(IDE,Sign等) —————— Application Platform: 小程序运行平台,包含运行时,沙箱运行环境,小程序管理等 —————— EntranceApp: 接入小程序平台sdk的应用,如商店等 —————— Application: 具体小程序
App: 具体小程序,采用vue.js框架语法 ———————————— JS Framework: JS框架 ———————————— JS Engine: JS引擎,目前采用Google V8 ———————————— JS-Native Bridge: JS Native通信,目前采用开源J2V8方案
▍参与方
@whuhenrylee @TingKun
滴滴团队 @jimwmg @chen28683 @eraychen1984 @wanglikun7342
开源贡献者 @MicroConan
▍参与方
配置如下:
entry: {
mvvm-cml-loader 源码参考以下链接(请点击此处)
以上就是 CML 脚手架产生的树状结构图,递归传递给 cml-quickapp-plugin 来转义目标语法。
▍实现cml-quickapp-plugin
根据上面生成的构建图,编译插件 cml-quickapp-plugin 中可以对构建图中所有节点(包括 template 节点、 style节点、script 节点 、json 节点等)编译成符合快应用端的语法,然后在 pack 任务中打包输出成符合快应用端的结构。
module.exports = class DemoPlugin {
更为详细的开发编译插件的教程请参考这个链接(请点击此处)
▍实现cml-quickapp-runtime
运行时的主要作用是抹平各端的生命周期差异性,进行响应式数据绑定等,参考链接(请点击此处)
CML 和快应用的生命周期都包含 App、Page、Component 三个级别,映射关系如下。具体可以参考(请点击此处)
// 左侧的 key 为 CML 生命周期函数,右侧的 value 为快应用对应的生命周期函数
以上两行代码是在 mvvm-cml-loader 中插入的,具体实现参考源码中对于 script 节点的处理(请点击此处)
我们只需要实现对应端的以下几个方法:
以 cml-quickapp-runtime 中的 createPage 实现为例(请点击此处)
cml-quickapp-runtime/index.js
import { createApp } from './src/interfaces/createApp/index.js'; cml-quickapp-runtime/src/interfaces/createPage/index.js
import createPgInterface from './index.interface'; cml-quickapp-runtime/src/interfaces/createPage/index.interface //这里要将 chameleon-runtime中的 createPage接口 include 进来
▍实现cml-quickapp-api
目标:基于跨端协议,实现快应用对应的 API 引入 Chameleon 官方的标准 interface 文件 扩展实现新端,实现对应端的方法
具体实现如下:
// 引入官方标准interface文件 // 扩展实现新端
▍实现cml-quickapp-store
目标:基于 mobx 实现一套响应式数据系统 引入 Chameleon 官方的标准 interface 文件 扩展实现新端,实现对应端的方法
具体实现请参考(请点击此处)
▍实现cml-quickapp-ui-builtin
目标:实现 CML 组件在快应用中的一致表现,可以参考(请点击此处) 用新端自有的组件和语法呈现 CML 组件即可
ontouchend="touchend">
{{text}}
▍实现cml-quickapp-ui-builtin和实现cml-quickapp-ui
目标:扩展新端本身没有的复合交互组件,如 pop-up、action-sheet、picker 等交互组件。
实现过程和 cml-quickapp-ui-builtin 如出一辙,以 c-popup 组件的实现为例,参考(请点击此处)
// c-popup.interface
▍体验快应用
Chameleon 官方的体验 demo 项目源仓库如下: cml-flexbox : Flex 布局案例集合 cml-yanxuan : 仿网易严选 APP cml-todomvc : Todo-List
以上四个项目编译打包后的快应用 .rpk 文件地址如下 flexbox 布局案例集合 Todo-List
对于普通用户或开发者来说,如果想要在快应用端进行体验,需要满足以下条件: 在移动设备上下载并安装最新版 快应用预览版 APP ,当前最新版本为1050.10 将以上 demo 项目编译打包生成的 .rpk 文件放入移动设备的 /sdcard/rpks 文件夹,再次打开预览版即可体验
在快应用端的预览效果如下:
▍接入快应用
首先要求具备一整套快应用开发工具链,参考链接(请点击此处),这其中包括快应用调试器、快应用预览版、hap-toolkit 构建工具等;运行 快应用示例代码 可以检验环境是否就绪;快应用的开发环境就绪之后才开始进行 chameleon 项目的引入和部署。
• 全局安装最新的 chameleon-tool 工具
• 启动快应用服务
• 安装和更新package
cd ~/quickapp-demo
修改app.cml
• 修改 chameleon.config.js 配置文件
1. 引入path模块
2. 增加 builtinNpmName、extPlatform 和 babelPath 配置
以上配置解释
3. 导入基础样式
• 修改项目代码
1. 修改项目中相关包的引用
store 和 api 的引用:
import cml from "chameleon-api";
2. 多态组件在端的实现
如果存在某多态组件,以 poly-comp 为例
poly-comp.interface
3. 多态接口在端的实现
如果存在某多态接口,以 poly-api.interface 为例
需要增加在快应用端的实现
快应用支持的命令有 cml quickapp dev cml quickapp build
cd ~/cml-flexbox
当前阶段的适配工作虽然已覆盖几乎所有 Chameleon 的功能特性,但受制于快应用和 Chameleon 之间存在的少许差异性,仍然存在一些尚未解决的问题,这些问题我们会在后续持续跟进和优化完善。
这些尚未完成的 feature 包括:
1. 动画相关。Chameleon 的动画调用方式和快应用差异颇大,当前未进行适配;
2. CSS 特性。受制于部分快应用的特性,诸如 box-sizing、box-shadow、white-space 等属性暂未支持;
3. watch 能力。当前可以进行 cml-quickapp-store 作用域内的属性 watch,对普通属性则未生效。
快应用后续会持续强化和完善基础能力,力求在体验上趋近原生 App,加速快应用商业变现,实现头部快应用开发者可盈利,并布局海外,初步实现在印度和东南亚地区业务落地。 |
有话要说