(window.webpackJsonp=window.webpackJsonp||[]).push([[9],{186:function(t,a,s){t.exports=s.p+"assets/img/architecture_hierarchy.35f5f61d.png"},476:function(t,a,s){t.exports=s.p+"assets/img/yuanli.21aa152a.png"},477:function(t,a,s){t.exports=s.p+"assets/img/interface.e1ccc440.png"},478:function(t,a,s){t.exports=s.p+"assets/img/extend1.4fa52fc8.png"},479:function(t,a,s){t.exports=s.p+"assets/img/projectgraph.a52d4757.png"},480:function(t,a,s){t.exports=s.p+"assets/img/new_compiler.e0d18d8a.png"},491:function(t,a,s){"use strict";s.r(a);var e=s(17),n=Object(e.a)({},(function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"定制扩展端"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#定制扩展端"}},[t._v("#")]),t._v(" 定制扩展端")]),t._v(" "),e("p",[t._v("基于 "),e("strong",[e("code",[t._v("chameleon-tool@1.0.3")])])]),t._v(" "),e("p",[t._v("新框架太多?学不动啦?有这一套跨端标准,今后再也不用学习新框架了。")]),t._v(" "),e("p",[t._v("如今前端比较流行的 React Native、Weex、Flutter 等跨平台开发框架,对于开发来说属于技术方案的选择,比如,我们会考虑用这个技术开发,性能会不会超过 h5,开发效率会不会超过原生开发等等。")]),t._v(" "),e("p",[t._v("但是从 2017 年微信推出小程序,到至今各大厂商都推出自己的小程序,跨端开发就不仅仅是技术的问题了。已经变成了必争的流量入口。现在的小程序大战像极了当前的浏览器大战。大战中受苦的是我们一线开发者,同样的应用要开发 N 次,面对了前所未有的挑战,所以跨端框架的产生是大趋势下的必然产物。")]),t._v(" "),e("h2",{attrs:{id:"mvvm-协议"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#mvvm-协议"}},[t._v("#")]),t._v(" MVVM+ 协议")]),t._v(" "),e("p",[t._v("chameleon 基于对跨端工作的积累, 规范了一套跨端标准,称之为 MVVM+ 协议;开发者只需要按照标准扩展流程,即可快速扩展任意 MVVM 架构模式的终端。并让已有项目无缝运行新端。所以如果你希望让 CML 快速支持淘宝小程序、React Native?只需按标准实现即可扩展。")]),t._v(" "),e("p",[t._v("最终让开发者只需要用 CML 开发,就可以在任意端运行,再也不用学习新平台框架啦。")]),t._v(" "),e("h3",{attrs:{id:"新端接入情况"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#新端接入情况"}},[t._v("#")]),t._v(" 新端接入情况")]),t._v(" "),e("p",[t._v("滴滴、芒果 TV、阿里的同学合作,按照跨端协议流程,目前已完成"),e("strong",[t._v("字节跳动小程序")]),t._v("的共建开发")]),t._v(" "),e("ul",[e("li",[t._v("分工排期如下:https://github.com/didi/chameleon/issues/157")]),t._v(" "),e("li",[t._v("仓库地址: https://github.com/chameleon-team/cml-tt-sets")])]),t._v(" "),e("p",[e("strong",[t._v("快应用官方研发团队")]),t._v("目前也接入完成")]),t._v(" "),e("ul",[e("li",[t._v("分工排期如下:https://github.com/didi/chameleon/issues/185")]),t._v(" "),e("li",[t._v("仓库地址: https://github.com/quickappcn/cml-extplatform-quickapp")])]),t._v(" "),e("h3",{attrs:{id:"跨端原理"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#跨端原理"}},[t._v("#")]),t._v(" 跨端原理")]),t._v(" "),e("p",[t._v("跨端框架最核心的工作是统一,chameleon 定义了标准的跨端协议,通过编译时+运行时的手段去实现各端的代码和功能,其实现原理如下图所示。")]),t._v(" "),e("p",[e("img",{attrs:{src:s(186),alt:""}})]),t._v(" "),e("p",[t._v("其中运行时和基础库部分利用多态协议实现各端的独立性与框架的统一性。chameleon 目前支持的端都是采用这种方式,我们定义了扩展一个新端所需要实现的所有标准,用户只需要按照这些标准实现即可完成一个新端的扩展。")]),t._v(" "),e("h3",{attrs:{id:"跨端标准协议"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#跨端标准协议"}},[t._v("#")]),t._v(" 跨端标准协议")]),t._v(" "),e("p",[t._v("我们再来看一张 CML 的设计图,能够实现标准化的扩展新端,得益于多态协议中对各层代码进行了接口的定义,各端代码按照接口定义进行实现,向用户代码提供统一调用,同时还提供”多态协议“让用户代码保障可维护性的前提下,直接触达各端原生能力的方式。")]),t._v(" "),e("img",{attrs:{src:s(476),width:"300px"}}),t._v(" "),e("ul",[e("li",[t._v("API 接口协议:定义基础接口能力标准。")]),t._v(" "),e("li",[t._v("内置组件协议:定义基础 UI 组件标准。")]),t._v(" "),e("li",[t._v("框架协议:定义生命周期、路由等框架标准。")]),t._v(" "),e("li",[t._v("DSL 协议:定义视图和逻辑层的语法标准。")]),t._v(" "),e("li",[t._v("多态实现协议:定义允许用户使用差异化能力标准。")])]),t._v(" "),e("p",[e("img",{attrs:{src:s(477),alt:""}})]),t._v(" "),e("h3",{attrs:{id:"如何扩展新端?"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#如何扩展新端?"}},[t._v("#")]),t._v(" 如何扩展新端?")]),t._v(" "),e("p",[t._v("简单来说只需要实现 6 个 npm 包。")]),t._v(" "),e("p",[e("img",{attrs:{src:s(478),alt:""}})]),t._v(" "),e("h4",{attrs:{id:"实现-api-接口协议"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#实现-api-接口协议"}},[t._v("#")]),t._v(" 实现 API 接口协议")]),t._v(" "),e("p",[e("code",[t._v("chameleon-api")]),t._v("提供了网络请求,数据存储,获取系统信息,交互反馈等方法,用户需要创建一个 npm 包,结构参考"),e("a",{attrs:{href:"https://github.com/chameleon-team/cml-extplatform-demo/tree/master/packages/cml-demo-api",target:"_blank",rel:"noopener noreferrer"}},[t._v("cml-demo-api"),e("OutboundLink")],1),t._v("。将 "),e("code",[t._v("chameleon-api")]),t._v(" 中提供的每个方法利用多态接口扩展语法扩展新端的实现。\n以扩展一个"),e("code",[t._v("alert")]),t._v("方法为例,"),e("code",[t._v("chameleon-api")]),t._v("中"),e("code",[t._v("alert")]),t._v("方法的接口定义文件为"),e("code",[t._v("chameleon-api/src/interfaces/alert.interface")]),t._v(",其中的接口定义内容如下:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('