当前位置: 首页 > 编程日记 > 正文

Chameleon跨端框架——壹个理想主义团队的开源作品

文章较长,信息量很大,请耐心阅读,必然有收获。下面正文开始~

  • 背景
  • 解决方案
  • 原理
  • 久经考验
  • 生产应用举例
  • 易用性好
  • 多态协议
  • 学习成本低
  • 渐进式接入
  • 业内对比
  • 后期规划
  • 理想主义

历经近20个月打磨,滴滴跨端方案chameleon终于开源了github.com/didi/chamel…, 真正专注于一套代码运行多端。

背景

微信月活10亿月活(超过网民数量,用户多个账号?)、支付宝4亿月活、百度3.3亿月活;2018 Q3中国Android手机占智能手机市场超过80%;无论BAT还是Android快应用都是中国互联网用户的真正用户入口,作为小型互联网公司都希望能搭上小程序的风口,从而蹭一波流量。

计算机技术历史发展告诉我们,每一种新技术出现都会经历"各自为政"的阶段,小程序技术也不例外。微信小程序作为首创者,虽然其他小程序都在技术实现原理、接口设计刻意模仿,但是作为一线开发者面对同样的应用实现往往需要重复开发、测试,从前1单位的工作量变成了N单位的工作量。

滴滴的研发工程师是其中最显著的"受害者"之一,滴滴出行在微信钱包、支付宝、Android快应用都有相关入口,用户流量占比不低。

各类小程序已经能覆盖中国所有网民,从Facebook在2013年开源react,这个项目本身越滚越大。从最早的WebUI引擎衍生的ReactNative项目,目标更是宏伟。

Vue.js于2014年左右发布,逆流而上占据了大量用户群体,2016年阿里巴巴也基于vue发布了weex项目,可以用vue编写NativeAPP。

Google在2018年末正式发布了面向未来的跨Andoid、IOS端Flutter1.0.0,作为面向未来的跨端框架,前景一片光明。

解决方案

虽然不同各端框架环境千变万化,无论各类小程序、Weex、React-Native、Flutter、快应用,它们万变不离其宗的是MVVM架构设计思想。Chameleon希望既能用一套代码完成所有端需求,将相同的业务逻辑完成收敛到同一层系统里面,又不会因为项目的抽象一致导致可维护性变差。

让MVVM跨端环境大统一:以各个跨端技术(Weex、React-Native、WebView浏览器、Flutter)和产品业务(微信小程序、快应用、支付宝小程序、百度智能小程序、今日头条小程序、其他各类小程序)的共同技术特点——MVVM架构设计, 以统一MVVM跨端架构平台为目标的程序语言框架Chameleon(任意使用MVVM架构设计的终端,都能以Chameleon开发并运行)。

View:

ChameleonSDK包括各类小程序、web端、客户端(React-Native、Weex、Flutter),目前支持微信小程序、Web、Weex三类,后续支持更多MVVM为标准的端。

View Model:

CML(Chameleon MarkupLanguage)是框架设计的一套标签语言,结合基础组件、事件系统、数据绑定,可以构建出页面的结构。同时为了降低学习成本支持类VueTemplate。

原理

久经考验

2017年时微信小程序发布,滴滴作为白名单用户首先开始尝试接入。这时候我们专门成立了一个1、2人的小项目组,完成一个名为MPV的项目,一期目标是“不影响用户发挥,不依赖框架方的原则性实现一套代码运行web和微信小程序”。MPV研发完成后,在多个项目实践中,确实完成了超过90%代码重用,总体上开发效率和测试效率都有了明显提升,同时暴露出更多问题:

  • 可维护性问题,没有隔离公用代码和各端差异代码。
  • 方向选择错误,MPV使用了小程序语法标准(小程序的生命周期、API接口等),导致用户使用上无法清晰理解使用规范。
  • 各端周边小型差异点太多。
  • 模板DSL语法不规范。
  • 两端界面效果不一致。
  • 多端调试成本高。
  • 工程化建设落后。
  • 不能直接使用各端已有生态组件,即缺乏标准规范接入某个端已有开源组件。

2018年4月我们把跨端项目规模进一步扩大,跨N端的解决方案命名为Chameleon/kmiln/,简写CML,中文名卡梅龙;中文意思变色龙,意味着就像变 色龙一样能适应不同环境的跨端整体解决方案。

Chameleon在MPV的实践积累下,不仅解决了遇到的各种可维护性问题,后续的规划更加明确,目标真正专注于让一套代码运行多端,提供标准的MVV M模式统一各类终端。

经过一年数十位前端开发人员在上百页面中的实践经验积累,在本周正式开源:github.com/didi/chamel…。。

生产应用举例

易用性好

一套代码运行多端理念,被人挑战最多的如何保证易用性。

  • 开发快,整体开发流程要高效。
  • 简洁性,各端开发定制化空间大,且公用代码不会混杂某端代码。
  • 性能好,不能增加产出文件包大小。
  • 一致性,多端实现效果一致。
开发快
关键词工程化开发项目级统一组件级统一
描述收集最优秀的工程化功能:
多种数据Mock、资源定位、代理调试、LivereLoad等, CML不用仅仅是跨端,更能帮助开发者高效开发单个端。
当多个端整个业务高度一致时,能用一套项目代码运行多端已经用原生小程序开发代码,已经用vue开发的web页面,2者有重复开发组件如登录
  1. 导出成小程序原生代码/vue组件,放在各个项目里面使用
  2. 安装webpack插件,在普通项目中直接安装该Chameleon组件并使用
简洁性(各端开发定制化空间大)性能好一致性
关键词多态协议产出资源包大小,只保留单端代码语法检查多端一致性还原
描述多态协议可用于多级,用户自由切换,由上至下:方法级、组件级、页面级、应用级编译阶段将会只保留要导出的部分代码,内置组件和API按需打包为了保障各个端实现效果一致,不用挨个调试各端,保存时做语法检查,暴露潜在问题。在编译、runtime层大量工作保障实现效果一致

多态协议

多端合并后各端差异化实现在所难免,一开始是差异化代码和业务逻辑混杂在一起。这就尴尬了,如果你觉得以上不复杂,假设有4、5个端呢,业务逻辑掺杂跨端逻辑,产品逻辑别打断,可读性差,需求变更,牵一发动全身,每个端都要测试,跨端代码效率变得适得其反。

下图各端差异化代码也和逻辑混合在一起

多态协议设计的灵感来自于Apache Thrift - 可伸缩的跨语言服务开发框架,本质上跨端也属于跨语言。 它能让Chameleon开发者快速接入各个客户端底层功能或者差异化业务实现,避免可读性差、可维护性差的问题。

多态协议通过定义标准接口(interface),各端模块各自独立实现,编译时和运行时对实现的接口输入输出做检查。

主要2个目标:

  • 保障多端可维护性
  • 编译时拆分多端代码

当用户按照标准规范扩展个别产品效果多端不一致或特定底层能力多端不一致的的功能时,多态协议可以有效隔离公用代码和各端差异代码,保证”河水不犯井水“。

举例:当你像开发一个图表功能组件时,可能用到 echarts :

  1. 在项目中分别按照web版本 npm install echarts 和微信版本下载相关文件
  2. 然后定义一个多态组件 charts
  3. 在 charts/charts.interface 定义该组件的输入和输出
  4. 分别在 charts/charts.wx.cml 和 charts/charts.web.cml 里面调用微信版本(可使用微信小程序组件文件夹)和web版本(可调用.vue后缀文件)
  5. 最后就能在项目中使用该组件

产出包里面只包含该组件其中一端的代码;因输入输出的限制,该组件调用上完全一致,不用根据某端做特殊逻辑处理。你可以将该echart多态组件单独放置在一个仓库里面单独维护并发布;其他人无需关系内部细节,直接npm install echart即可使用。

学习成本低

VM层的CML语法是关联视图层和逻辑层的抽象DSL,其有学习成本问题是被热心很多帮助我们的同学提的最多建议,本身其CML学习成本已经非常低,无非是数据双向绑定、事件绑定、组件树、条件语句、循环遍历等等。一开始我们是拒绝的,后来综合考虑之下,还是妥协支持了类vue语法,让开发者更快上手CML。

渐进式接入

很多人已经开发小程序了,又不愿意大多阔斧重新改造,也希望使用CML?当然可以,2种方式使用CML:

说明/类型整个项目使用CML公用组件使用CML
关系图
说明业务层需求在各端环境高度类似,
原本需要针对不同端重复开发、重复测试,
那么使用Chameleon将整个项目”从上至下“都用一套代码运行。
原本公用组件需要重复开发、重复测试,
使用一套代码开发公用组件,
各个端可以直接使用公用组件
举例首页、详情页、订单分享组件、支付组件、地图组件、picker组件

业内对比

业内其他框架和我们的目标不一样,我们是希望真正一套代码运行多端,而其他框架无非是“某个小程序语法增强”或者“推广某个框架写小程序 ”,但却是有重合点,列举一下功能对比:

后期规划

方向子方向执行项目
易用性加强
  • 语法检查
  • 速度
  • 前端工程化
  • A、检查能力加强:潜在错误阻断在编辑时
  • B、编辑器插件语法检查:Sublime text、Visual Studio Code、Webstorm
  • C、Chameleon playground:Debug工具加强
  • D、编辑器插件:代码提示
  • E、图形化界面创建和管理项目
框架优化
  • 包大小
  • 运行性能
  • web前端模块服务化
  • A、包大小:优化各包大小到70%(uglily后当前weex 136k wx 99.3k web 143k)
  • B、多端界面一致性加强:组件创建Web Component化
  • C、统一内置能力加强:Canvas、地图、音频等
  • D、静态资源关系依赖:服务端按依赖自动加载资源包
端品类扩展
  • 各类小程序
  • React-Native
  • Flutter
  • A、支付宝小程序:能力支持(测试中)
  • B、百度小程序:能力支持(测试中)
  • C、快应用:能力支持
  • D、端扩展协议标准化:用户自由扩展新端
组件扩展
  • c-design
  • 内置组件加强
  • A、c-design:“开箱即食”的组件库 c-design ,任意端用户直接安装可用
  • B、垂直类组件库:金融、电商类型组件库
端能力扩展
  • Native能力
  • 内置组件加强
  • A、Native API:Chameleon Native SDK能力向小程序靠齐
流程优化
  • XEditor
  • ChameleonShow
  • A、ChameleonShow:开源Chameleon后台管理平台,解决移动端页面碎片化问题
  • B、XEditor:让非研发直接发布任意终端的简单页面,无需重复开发
服务扩展
  • 多端服务能力统一
  • A、统一云服务:统一后端服务接口能力,如分享、支付、消息推送

理想主义

  1. 我们忍受不了自己的时间浪费在重复劳动上。
  2. 要么不做要做就到极致,一套代码运行多端本来就是理想主义,这条路很艰苦,我们却偏执的坚信一定要尽最大努力做出来,作为一个不那么自信的人,不做到好用是不敢发布出来的。
  3. CML框架各个细节都要做到极致,我们不能容忍有设计上的缺陷,所以常常CML周会上团队成员讨论6个小时直到深夜。

快速开始:cmljs.org/doc/quick_s…

常见问题: cmljs.org/doc/framewo…

欢迎加入贡献代码: didi/chameleon

转载于:https://juejin.im/post/5c52b4f0f265da2dc8493a46

相关文章:

尺度空间理论与图像金字塔(二)

SIFT简介 整理一下方便阅读,作者写的东西摘自论文,在此感谢xiaowei等的贡献 DoG尺度空间构造(Scale-space extrema detection)http://blog.csdn.net/xiaowei_cqu/article/details/8067881关键点搜索与定位(Keypoint l…

仿桌面通知pnotify插件

在做网站的时候&#xff0c;alert弹出框是非常常见的情形。但是&#xff0c;有些情况下&#xff0c;弹框对用户来说是并不友好的。调研了几个其他的提示插件了&#xff0c;发现pnotify比较好用&#xff0c;可配置性也高。 使用示例&#xff1a; <!DOCTYPE html> <html…

【HDU】1305 Immediate Decodability(字典树:结构体数组,二维数组,链表/指针)

一、用的二维数组 #include <iostream> #include <cstring> #include <algorithm> using namespace std;const int maxn 100; int tr[maxn][2]; int mk[maxn]; int tot;void insert(string s) {int u 0;for(int i0;i<s.length();i){int x s[i]-0;if(tr…

Hyperledger Grid:一个用于分布式供应链解决方案的框架

Hyperledger在最近的一篇博文中发布了一个名为Hyperledger Grid的新项目。Grid是一个用于集成分布式账本技术&#xff08;DLT&#xff09;解决方案与供应链行业企业业务系统的框架。该项目提供了一个参考架构、通用数据模型和智能合约&#xff0c;所有这些都是基于开放标准和行…

尺度不变特征变换匹配算法详解

尺度不变特征变换匹配算法详解Scale Invariant Feature Transform(SIFT)Just For Fun对于初学者&#xff0c;从David G.Lowe的论文到实现&#xff0c;有许多鸿沟&#xff0c;本文帮你跨越。1、SIFT综述 尺度不变特征转换(Scale-invariant feature transform或SIFT)是一种电脑视…

【POJ】2503 Babelfish(字典树,map,指针)

一、map 输入时候的格式有点难想&#xff0c;还有一种想法是用gets读取&#xff0c;然后用sscanf分开&#xff0c;分别存到两个数组中去&#xff0c;再加入map中&#xff0c;但是这一种方法目前还没有实现。。 #include <iostream> #include <cstring> #include …

ndk-build: CreateProcess error=193

为什么80%的码农都做不了架构师&#xff1f;>>> 问题&#xff1a;ndk-build": CreateProcess error193 解决&#xff1a;该问题表明&#xff0c;调用了非windows程序&#xff0c;在build.xml中将ndk-build修改为ndk-build.cmd即可ant编译 转载于:https://my.o…

AI芯片初创公司单纯卖芯片还是捆绑算法的商业模式更好?...

雷锋网在《资本寒冬&#xff0c;这样的AI芯片公司2019年危矣》一文中已经提到&#xff0c;2019年的资本寒冬以及整个半导体行业的低迷&#xff0c;将会让那些没有技术独特性以及缺乏商业落地能力&#xff0c;且现金流控制不好的AI芯片公司面临巨大的挑战&#xff0c;甚至大概率…

VS2017配置OpenCV3.2+contrib3.2

VS2017配置OpenCV3.2contrib3.2前言opecv3.2opencv_contrib3.2模块都编译配置了在配置contrib之前&#xff0c;尝试直接配置OpeCV3.2-vc14&#xff0c;发现可以正常使用&#xff0c;也就是说官方包虽然只有vc14,但vs2017(vc15)也支持的很好。操作环境&#xff1a;WIN10 64bit &…

【ACM】二叉搜索树(Binary Search Tree /BS Tree) 小结

动态管理集合的数据结构——二叉搜索树 搜索树是一种可以进行插入&#xff0c;搜索&#xff0c;删除等操作的数据结构&#xff0c;可以用字典或者优先队列。 二叉排序树又称为二叉查找树&#xff0c;他或者为空树&#xff0c;或者是满足如下性质的二叉树。 &#xff08;1&…

android安卓动态设置控件宽高

LayoutParams layoutParamsp_w_picpathView.getLayoutParams();layoutParams.width100;layoutParams.height200;p_w_picpathView.setLayoutParams(layoutParams);转载于:https://blog.51cto.com/11020803/1860242

《深入java虚拟机》读书笔记类加载

概述 类加载机制是指虚拟机将描述类的数据从Class文件中加载到内存&#xff0c;并进行数据验证、解析、初始化等过程&#xff0c;最后形成可以直接被虚拟机使用的java类型。在java语言中类的加载、链接、初始化等过程并不是在编译时期完成&#xff0c;而是在运行时期才进行的&a…

SLAM之特征匹配(一)————RANSAC-------OpenCV中findFundamentalMat函数使用的模型

目录 1.RANSAC原理 2. RANSAC算法步骤&#xff1a; 3. RANSAC源码解析 step one niters最初的值为2000&#xff0c;这就是初始时的RANSAC算法的循环次数&#xff0c;getSubset&#xff08;&#xff09;函数是从一组对应的序列中随机的选出4组&#xff08;因为要想计算出一…

I hope so 2016-Oct-10

2019独角兽企业重金招聘Python工程师标准>>> <I hope so> - A joke A: Do you think your son will forget all he learned at college? B: I hopse so. He certainly cant make a living by kissing girls! 转载于:https://my.oschina.net/u/553266/blog/75…

【Codeforces】158B-Taxi(贪心,怎么贪咧)

贪心 emmmm http://codeforces.com/contest/158/problem/B 题目大意&#xff1a;有四种旅客&#xff0c;四人一组&#xff0c;三人一组&#xff0c;两人一组&#xff0c;一人一组&#xff0c;一辆出租车最多可以坐四个人&#xff0c;并且一组里的人必须坐一辆车&#xff0c…

90 后 CTO 创业 6 年,做了一件改变互联网的“小事”

TGO 鲲鹏会在武汉举行了一场线下分享活动 —— 冲破壁垒&#xff0c;打造精英的技术团队 。来自极验的 90 后 CTO 黄胜蓝分享了他的团队故事&#xff0c;以及在他看来一个创新团队应该具备的特征。极验 CTO \u0026 TGO 鲲鹏会会员黄胜蓝在现场进行分享 1. 创新&#xff1a;非典…

ORB特征(二)

为了满足实时性的要求&#xff0c;前面文章中介绍过&#xff08;具体链接如下&#xff09;快速提取特征点算法Fast,以及特征描述子Brief。本篇文章介绍的ORB算法结合了Fast和Brief的速度优势&#xff0c;并做了改进&#xff0c;且ORB是免费Ethan Rublee等人2011年在《ORB&#…

【POJ】2377 Bad Cowtractors(最大生成树)

简单题&#xff0c;模板题 求解最大生成树&#xff0c;提交一直WA&#xff0c;感觉没有什么问题啊&#xff0c;就是在求解最小生成树的模板基础上稍加修改即可&#xff0c;后来发现在输出a&#xff0c;b&#xff0c;c给map二维数组的时候还必须有判断条件&#xff0c;略为有点…

使用let替换var实现块级作用域的小发现

在讲述javascript没有块级作用域的时候都会提到一个非常经典的例子&#xff1a; var obj{name:helo,age:15 }; var arr[];for(var i0;i<5;i){arr[i]i;console.log(i);} console.log(arr); console.log(i);因为javascript没有块级作用域&#xff0c;所以控制台打印出来的结果…

windows系统下node、npm的安装和卸载

Greta有话说&#xff1a;我是在有道云笔记只弄个记录的笔记&#xff0c;粘贴过来之后&#xff0c;没有图片&#xff0c;我的笔记地址为&#xff1a; 有道云笔记&#xff0c;请点我   一、卸载 1、node.js、nvm、 npm &#xff08;1&#xff09;在cmd中输入where node找到node…

OpenCV4Android开发实录(2): 使用OpenCV3.4.1库实现人脸检测

OpenCV4Android开发实录(2)&#xff1a; 使用OpenCV3.3.0库实现人脸检测 转载请声明出处&#xff1a;http://write.blog.csdn.net/postedit/78992490OpenCV4Android系列&#xff1a; 1. OpenCV4Android开发实录(1)&#xff1a;移植OpenCV3.3.0库到Android Studio 2.OpenCV4Andr…

活动|跟着微软一起,拥抱开源吧!

由开源社主办的中国开源年会2016 (COSCon16 - China Open Source Conference 2016) 即将于今年10月15日-16日在北京举办。微软大咖将为您呈现区块链&#xff0c;容器&#xff0c;大数据&#xff0c;Xamarin等时下热点技术&#xff0c;参会者还可获取价值1,500 元 Azure 服务使用…

【HDU/算法】最短路问题 杭电OJ 2544 (Dijkstra,Dijkstra+priority_queue,Floyd,Bellman_ford,SPFA)

最短路径问题是图论中很重要的问题。 解决最短路径几个经典的算法 1、Dijkstra算法 单源最短路径&#xff08;贪心&#xff09;&#xff0c;还有用 priority_queue 进行优化的 Dijkstra 算法。 2、bellman-ford算法 例题&#xff1a;【ACM】POJ 3259 Wormholes 允许负权边…

javaSE基础知识 1.5整数类型

整数的四种声明类型它们分别是&#xff0c;byte&#xff0c;short&#xff0c;int&#xff0c;long&#xff0c;这四种类型所占用的空间是不同的byte是占用1个字节&#xff0c;它的取值范围是 -128~127&#xff0c;short是占用2个字节&#xff0c;他的取值范围是-32768~32767&a…

源码分析-GLSurfaceView的内部实现

GLSurfaceView类是继承自SurfaceView的&#xff0c;并且实现了SurfaceHolder.Callback2接口。GLSurfaceView内部管理着一个surface&#xff0c;专门负责OpenGL渲染。GLSurfaceView内部通过GLThread和EGLHelper为我们完成了EGL环境渲染和渲染线程的创建及管理&#xff0c;使我们…

【POJ/算法】 3259 Wormholes(Bellman-Ford算法, SPFA ,FLoyd算法)

Bellman-Ford算法 Bellman-Ford算法的优点是可以发现负圈&#xff0c;缺点是时间复杂度比Dijkstra算法高。而SPFA算法是使用队列优化的Bellman-Ford版本&#xff0c;其在时间复杂度和编程难度上都比其他算法有优势。 Bellman-Ford算法流程分为三个阶段&#xff1a; 第一步&am…

进程控制概念简介 多线程上篇(三)

进程控制 进程的基本数据信息是操作系统控制管理进程的数据集合&#xff0c;这些信息就是用来控制进程的&#xff0c;此处我们说的进程控制就是进程的管理。比如进程有状态&#xff0c;那么进程的创建、终止&#xff0c;状态的切换&#xff0c;这都不是进程自主进行的&#xff…

Android OpenGL使用GLSurfaceView预览视频

Android OpenGL使用GLSurfaceView预览视频第一章 相关知识介绍在介绍具体的功能之前&#xff0c;先对一些主要的类和方法进行一些介绍&#xff0c;这样可以更好的理解整个程序1.1 GLSurfaceView在谷歌的官方文档中是这样解释GLSurfaceView的&#xff1a;An implementation of S…

【Android 基础】Animation 动画介绍和实现

转载自&#xff1a;http://www.cnblogs.com/yc-755909659/p/4290114.html1.Animation 动画类型Android的animation由四种类型组成&#xff1a;XML中alph渐变透明度动画效果scale渐变尺寸伸缩动画效果translate画面转换位置移动动画效果rotate画面转移旋转动画效果JavaCode中Alp…

【Codeforces】1111B - Average Superhero Gang Power

http://codeforces.com/problemset/problem/1111/B n 表示要输入的数据的个数 k 最每一个数据最多可以进行多少次操作 m 一共可以进行多少次操作 一次操作&#xff1a;删除这个数&#xff0c;或者给这个数加1 如果n为1的话&#xff0c;那么只要找出m和k的最小值加到那个数…