做者 | Chameleon 团队编辑 | 张之栋、Yonie滴滴在 GitHub 上开源的跨端解决方案 Chameleon(简写 CML)正式发布 1.0 版本,中文名卡梅龙;中文意思变色龙,意味着就像变色龙同样能适应不一样环境的企业级跨端总体解决方案,具备易用、轻量、面向将来等特色。下文将详细介绍 Chameleon 项目的研发背景和性能特色。css
世界上最快乐的事,莫过于为理想而奋斗。—— 苏格拉底html
历时 3 年的研发和实践,数十名团队成员的努力,数百名业界参与者的共建,数千次的改进优化,终于迎来了跨端解决方案 CML1.0 正式版。前端
Chameleon(简写 CML )是一款真正专一于让一套代码运行多端的跨端框架,拥有业内先进的工程化设计,丰富的基础库,首创多态协议,提供标准的 MVVM 架构开发模式统一各种终端。
vue
一经开源,CML 备受业界关注,长期占领 github tending 榜单,开发理念和框架设计获得了普遍开发者的承认。webpack
小程序 setData 优化。git
即将发布更丰富的组件库:c-design、light-ui、chameleon-ui-miniapp。github
关于被吐槽“通用性”牺牲了“丰富性”:CML 被反馈最多的问题是小程序组件丰富度不够,虽然提供跨全部端的组件和 API 功能,但没有封装部分小程序特有定制化能力,因此,咱们即将发布chameleon-ui-miniapp和chameleon-api-miniapp,只为各种小程序服务,全面支持各种小程序组件和接口,同时用户能够基于多态协议的重载能力定制其余端(例如 web 和 weex)的功能实现,指望能兼顾组件丰富度和统一性。web
事实上,CML 已在滴滴众多业务产品中实践验证 (青桔单车、滴滴代驾、泊车、滴滴统一登陆 passport、收银台、司机端、企业级、国际化),愈来愈多的外部团队开始基于 CML 开发跨端项目 (百度视频小程序、百度独创新房通、滴滴青桔单车、芒果 TV 视频、老爸评测商城)。感谢全部开发者对 CML 的信任,在 beta 版本时使用。npm
CML 基于对跨端工做的积累,规范了一套跨端标准,称之为 MVVM+ 协议。小程序
基于 MVVM+ 跨端标准协议,你能够自由扩展新端,快速支持任意 MVVM 架构模式的终端,如淘宝小程序、React Native 等等,具体参考: https://cmljs.org/doc/extend/extend.html。
你只须要基于 CML 开发项目,就可让已有项目无缝运行新端,不再用学习新平台框架啦!
以不变(项目代码)应万变(多端),从“各自为政”到真正大统一。
得益于多态协议中对各层代码进行了接口的定义,CML 可以实现标准化的扩展新端.
多态实现协议(Interface):定义容许用户使用差别化能力标准。
CML1.0 支持了业内全部小程序平台 ( 微信、支付宝、百度、头条、qq )、H5和客户端,而且,快应用官方研发团队 也正基于 MVVM+ 跨端标准协议扩展快应用程序,进度 100%,开发完成,如今测试中。
特别强调的是,CML 扩展头条小程序(阿里和芒果 TV)和快应用端(快应用官方团队)彻底由开源社区优秀的开发者贡献实现。
细节:跨端一致性与定制性CML1.0 实现了一套代码运行多端,而且高度一致。
一致性一致性和差别化一直是跨端里面的难题,CML 在这方面作了许多努力,包括生命周期的统1、事件系统、尺寸单位、布局外观一致、组件化方案、数据管理等等。特别强调的是,组件化和界面一致性是最容易忽视,也是最影响开发体验的很是重要的点。
CML 的组件化方案,依托于各端原有的组件化能力,尽量减小因为框架带来的性能问题。
以微信和支付宝小程序为例,Exparser 是微信小程序底层的组件组织框架,内置在小程序基础库中,为内置组件和自定义组件提供能力支持,是基于 WebComponent 的 ShadowDOM 模型实现的,高效轻量,性能很好。
各个小程序的组件化模型不一致,例如支付宝小程序组件化基于 React Web,使用上有诸多限制,包括组件无样式做用域、数据传递、事件通讯等问题,CML 基于支付宝原有组件化能力,抹平与微信间的各类差别,在保证原有运行性能的状况下,实现多端一致性和提升易用性。
另外一方面,经过引入了统一各端的一致性基础样式,解决各端呈现效果不一的问题。 同时,CM L1.0 增强了跨端样式校验规范,在开发模式下,会严格检查 CMSS 语法,只容许书写通用的 CMSS 规则(跨 H五、各种小程序、客户端)。 定制性CML 既有统一性又能够定制差别化,提供了针对工程级别、项目、组件、方法、样式等各类类型的定制化能力。工程、项目定制化:
https://cmljs.org/doc/framework/settings.html
组件定制化:
https://cmljs.org/doc/example/poly.html
方法定制化:
https://cmljs.org/doc/example/chameleon-api.html
样式定制化:
https://cmljs.org/doc/view/cmss/css_diff.html
CML 首创的多态协议标准,能够直接使用任意端的第三方组件和方法库,同时保证多端业务逻辑充分隔离,维护性很高。
特别强调的是 1.0 版本还支持了多态协议重载能力,能够重载某一个端的实现,基于这样的能力咱们将会推出面向各种小程序特有的组件库,解决小程序开发者吐槽最多的小程序组件不够丰富的问题。好比,利用多态协议重载能力,重载<share>组件在 web 端用户的实现,提示用户右上角分享。
我开发微信小程序时官方库<picker>组件不够灵活?好说,重载在微信小程序端的实现便可!
性能:极致体验CML 很是重视框架的性能,在性能优化方向上作了许多工做, 包括包大小、各端加载速度、执行效率等等,提供了很是好的性能体验。
包体积优化代码包大小直接影响到下载速度,从而影响用户的首次打开体验。CML 一套代码运行 N+ 端,可能让人以为框架很大,影响性能问题,CML 首创的多态协议,贯穿整个框架,包括 Language、Framework、Library , 不只具备很好的可维护性,并且在工程构建阶段只保留一端代码,保障代码产出包足够单纯足够小。
不只如此,在包体积大小的优化方面,也作了许多其余工做工做,包括:微信小程序提供分包加载方案, 以页面为入口进行分包。能够优化小程序首次启动的下载时间,以及在多团队共同开发时能够更好的解耦协做。
CML1.0 支持小程序分包加载,你只须要经过很是简单的配置,就能够在编译时精准查找资源、输出主包、分包。具体参考:https://cmljs.org/doc/example/subpage.html?h=%E5%88%86%E5%8C%85
小程序端性能优化小程序端的渲染性能也是咱们重要优化方向之一。
CML 经过接管小程序更新数据的 setData 接口,实现了一套数据响应系统,让开发者可以使用类 Vue 的数据响应特性,如 watch 和 computed,而且提供更便捷的方式更新数据:直接赋值,而非经过原生 setData 接口更新视图。
事实上, setData 是小程序开发中使用最频繁的接口,也是最容易引起性能问题的接口。
小程序是使用 WebView 做为视图层的渲染载体,JavascriptCore 做为逻辑层的独立运行环境。经过数据Diff 减小二者间传输的数据量,能够优化性能。
在 CML 运行时框架,会对每一个组件实例追踪数据、收集依赖,在数据发生变动后,与上一次的缓存数据做数据 Diff,计算出最小更新数据,再调用 setData 接口传输最小必要的数据量。
这样,你能够对组件数据自由赋值,无需关心原平生台接口的调用优化,框架会在提高开发体验的同时,最大限度保证应用程序的性能。
CML 的生态无论组件库、接口库,仍是编辑器插件、调试工具 DebugKit、Xeditor 都在疯狂迭代,持续更新。
值得强调的是组件生态圈,开源 6 个月来,开发者吐槽最多的 CML 组件不够丰富的问题,现在,由 CML 官方团队开发维护的 chameleon-ui-builtin、cml-ui、light-ui、chameleon-ui-miniapp 组件库已经超过 60+ 组件,并且还在持续新增迭代。另外,由普惠出行前端团队主导合做共建的 c-design 组件库也包含了 20+ 组件。
c-design 组件库C-Design 是一套基于 Chameleon 框架开发的多端 UI 组件库, 目前已经集成了多列选择器、索引选择器、消息提示等 12 个组件
特性基于 CML 生态 开发的 UI 组件,提高用户研发效率。
使用简单,配置灵活。
目前已经完成 12 个组件的开发,计划于 8 月优化已完成的组件,精细打磨。
后续工做:适配需求较多的组件以及自定义主题。
如下是组件库部分组件的简单演示: light-ui 组件库Light-ui 目标是成为一个开箱即用、多样化配置、多端高度一致的组件库。目前 light-ui 已提供十余个跨端组件, 可支持开发者快速完成跨端需求的开发。
特性通用基础组件库。
灵活配置、多端效果统一。
目前已完成一期共十六个组件的开发。
后续工做:计划于九月中旬前完成二期组件开发,同时不断与设计师合做,打磨细节、完善交互体验、提高组件易用性。
如下是组件库部分组件的简单演示:
chameleon-ui-miniapp 提供自由能力丰富的小程序端特有组件和 api 库。用户能够直接使用各种小程序统一版本的登陆组件库,同时基于多态组件的重载能力扩展实现,这样既能在各种小程序使用统一登陆,又能定制化 web 端等登陆能力。
特性基于小程序开发的 ui 组件库。
易于扩展至其余小程序。
目前已初步完成既定组件的开发。
后续工做:完成组件文档更新,进一步优化及测试组件。
如下是组件库部分组件的简单演示:
将 CML 社区用户群体具象分为如下等级开发者:
一级开发:普通使用某端组件库的开发者。
对“一级开发”开放组件导出能力,“二级开发”独立开放各端框架入口,以及 CML “贡献者” 开放新端扩展标准入口。基于必定的激励机制,共建 CML 生态,持续转化输出。
得益于团队在工程化设计上的尝试与实践,CML 拥有先进的工程化理念,总体开发、打包构建等流程很是高效。CML 解决了本地开发时的各类痛点,包括提供 dev 服务、mock 数据、热更新、自动刷新、调试窗口、线上资源代理等能力,大大提升本地开发效率。你能够自由引入各类 npm 依赖包,组件化开发,模块化复用,使用 ES6 特性以及 CSS 样式预处理等等。
同时,CML 很是重视框架的稳定性,从 代码质量、测试可靠度、语法检查、生产环境等环节出发,提供稳定可靠的跨端解决方案。
现代化"连接"管理CML 从工程化角度统一管理起来项目中用到的全部用于外部通讯的”连接“,包括数据请求连接(apiPrefix)、静态文件请求连接 (publicPath)、页面路由连接 ( router )、跨端统一连接 ( Chameleon URL),不只能够统一化管理”连接“数据,更能够高效使用数据模拟(mock)、线上数据代理(proxy)、CDN 跨端重用和更新、跨端页面统一下发等功能。
下载完 JSBundle 后 Chameleon SDK 会缓存此 JSBundle,下次渲染时,若是此 JSBundle 没有更新则不会下载新的,达到节省时间和流量提高渲染速度的目的。
具体参考: https://cmljs.org/doc/chameleon_client/js_cache.html
另外一方面,计划 CML 底层支持 Flutter,敬请期待。
MVVM+ 协议:Model:1. 直接用 dart 编写 CML 逻辑层框架(用户须要用 dart 写业务代码),dart 能够转 JS。2. 实现 flutter 版本的 MVVM+ 接口协议 chameleon-api 。
为了下降”开发一次调试多端“的诟病,将问题提早暴露在”编辑时“,CML 发布了多款编辑器插件,包括 Visual Studio Code、Atom、Webstorm 等。VScode 扩展应用商店中搜索“cml”安装便可。编辑器插件: https://cmljs.org/doc/framework/edit-plugin.html
目前该插件支持了如下能力:文件 format。
CML 实现了全面的语法检查功能,且在持续增强。
跨端很美好,最大风险是可维护性问题。多态协议是 CML 业务层代码和各端底层组件和接口的分界点,CML 会严格“管制”输入输出值的类型和结构,同时会严格检查业务层 JS 代码,避免直接使用某端特有的接口,不容许在公共代码处使用某个端特定的方法,即便这段代码不会执行,例如禁止使用 window、wx、my、swan、weex 等方法。
分为:
目录规范检查。
逻辑规范检查。
DevTool:快速开启 CML DevTool 的扫码入口。
以下图所示:
为下降原有项目迁移 CML 框架的成本,CML1.0 提供了如下两种优雅简洁的渐进式接入方案。
CML 组件导入与导出CML1.0 可以将 CML 组件导出成各端组件,让你更自由地使用 CML 。
也就是说,你能够在任意端原有项目中使用 CML 开发的组件:https://cmljs.org/doc/terminal/io.html。
以 web 和小程序为例,在正常开发模式下,你须要维护 4 套代码 (web、wx、alipay、baidu)。经过渐进式方案接入 CML 框架,开发 cml 通用组件,再导出各端给原有项目使用,只须要维护一套组件代码,彻底利用了 CML 的跨端优点,大大下降了代码开发维护成本。
同时,CML1.0 借助多态协议规范导入各端第三方组件库,你能够自由定制。
原有项目集成 CML 跨端方案CML 已发布一款 webpack plugin:easy-chameleon,可直接在原有项目中集成 CML 。
接入方式很是简单,你只须要安装 easy-chameleon,按照指引简单配置,就能使用 CML 强大的语法和编译能力,以及使用和开发 CML 组件。具体接入文档参考: https://cmljs.org/doc/example/webpack_plugin.html
蓝图:将来规划 端品类扩展基于 CML SDK 能够:扩展更多 MVVM 标准终端(Flutter、React Native)。
完整视频如上,简易视图以下:
从跨端到中台,打造统一云服务平台。面向中小企业,开放 CML 云开发平台,提供多端统一云服务接口,如分享、支付、消息推送。
CML1.0 活动参与 CML1.0 活动,赢取 CML 限量 T 恤 和 滴滴开源贡献奖状
你能够经过如下两种途径参与活动,活动截止 9 月 8 日:向 CML pulls 提交 Pull Request:
https://github.com/didi/chameleon/pulls
点
赞 star 数 *0.3 + 回复数 *0.7
,总分排序前 20 位,得到 CML 限量 T 恤一件(后 n 位排序同样时由主办方评委判断内容价值)。活动最终解释权归 CML 团队全部。
很是感谢滴滴开源团队为本次活动提供的奖品,以及对开源的大力支持~
特别感谢对开源的贡献CML 团队受邀参加各大公司的技术分享 (58 同城、快手、深圳腾讯、快应用、百度、w3c 标准会议、Oscar 开源峰会),收到许多优秀工程师的有效建议,包括来自芒果 TV、阿里影业、快应用官方的工程师共建 CML 生态。芒果 TV 和阿里影业以及公司内普惠出行小伙伴独立扩展了头条小程序,快应用官方研发团队独立为 CML 扩展了快应用。同时,很是优秀的普惠技术泛前端团队,正在孵化 c-design 组件库 (一期进度 70%),以及 CML DoKit、滴滴云 for XEditor 等等。在此感谢他们~
注:排名不分前后团队 | 备注 |
---|---|
RIDEA 团队 | 贡献 CML 官网设计 |
普惠技术泛前端 | 贡献 CML for Dokit、CML for Nativejs、c-design 组件库、ts 扩展,参与扩展头条、快应用 |
快应用官方团队 | 贡献 CML for 快应用 |
芒果 TV | 参与贡献 CML for 头条小程序 api |
阿里影业 | 参与贡献 CML for 头条小程序 runtime、ui |
此次,CML 官网全新改版升级 1.0,为开发者带来更多使人期待的新特性,敬请关注:https://cmljs.org/ 。
活动推荐09 月 07 日(周六 13:00-17:30),由腾讯云主办 K8s & 云原生技术开放日深圳站将和你们见面,本次沙龙围绕 K8s、harbor、GPU 虚拟化等云原生相关技术,由技术专家讲解 AI 场景下的技术选型、企业级最佳实践以及技术发展趋势,与深圳的开发者共同探讨云原生的技术实践与思考。
这次沙龙活动免费,点击「阅读原文」或者识别图中二维码进行报名,有任何问题欢迎联系沙龙小助手 SherryWX:sherryia01