前端如何快速实现跨平台开发?

2019-10-18 1

  

如今前端比较流行的 React Native、Weex、Flutter 等跨平台开发框架,对于开发来说属于技术方案的选择,比如,我们会考虑用这个技术开发,性能会不会超过 h5,开发效率会不会超过原生开发等等。

但是从 2017 年微信推出小程序,到至今各大厂商都推出自己的小程序,跨端开发就不仅仅是技术的问题了,其已经成了必争的流量入口。

现在的小程序大战像极了当前的浏览器大战,大战中受苦的是我们一线开发者,同样的应用要开发 N 次,面对了前所未有的挑战,所以跨端框架的产生是大趋势下的必然产物。基于此,本文中将技术性地解读一套开源的跨端标准chameleon,开发者只需要按照标准扩展流程,即可快速扩展任意 MVVM 架构模式的终端,并让已有项目无缝运行新端。所以如果你希望让其快速支持淘宝小程序、React Native?只需按标准实现即可扩展。

跨端原理

跨端框架最核心的工作是统一,chameleon 定义了标准的跨端协议,通过编译时+运行时的手段去实现各端的代码和功能,其实现原理如下图所示。

图片2.jpg

其中运行时和基础库部分利用多态协议实现各端的独立性与框架的统一性。chameleon 目前支持的端都是采用这种方式,我们定义了扩展一个新端所需要实现的所有标准,用户只需要按照这些标准实现即可完成一个新端的扩展。

跨端标准协议

我们再来看一张 chameleon 的设计图,能够实现标准化的扩展新端,得益于多态协议中对各层代码进行了接口的定义,各端代码按照接口定义进行实现,向用户代码提供统一调用,同时还提供”多态协议“让用户代码保障可维护性的前提下,直接触达各端原生能力的方式。

图片3.jpg

·   API 接口协议:定义基础接口能力标准;

·   内置组件协议:定义基础 UI 组件标准;

·   框架协议:定义生命周期、路由等框架标准;

·   DSL 协议:定义视图和逻辑层的语法标准;

·   多态实现协议:定义允许用户使用差异化能力标准。

图片4.jpg

如何扩展新端?

简单来说只需要实现 6 个 npm 包。

图片5.jpg

实现 API 接口协议

chameleon-api提供了网络请求、数据存储、获取系统信息、交互反馈等方法,用户需要创建一个npm包,结构参考cml-demo-api (https://github.com/chameleon-team/cml-extplatform-demo/tree/master/packages/cml-demo-api)。将chameleon-api中提供的每个方法利用多态接口扩展(https://cml.js.org/doc/framework/polymorphism/api_extend.html) 语法扩展新端的实现。 以扩展一个alert方法为例,chameleon-api中alert方法的接口定义文件为chameleon-api/src/interfaces/alert.interface,其中的接口定义内容如下:

image.png





用户实现的interface文件中采用<include></include>语法引入chameleon-api中alert方法的 interface 文件, 实现uiInterface。

image.png

实现内置组件协议

组件分为内置组件chameleon-ui-builtin (https://github.com/chameleon-team/chameleon-ui-builtin) 和扩展组件cml-ui (https://github.com/chameleon-team/chameleon-ui-builtin)。所以用户需要创建两个 npm 包分别实现这两个组件库,结构参考cml-demo-ui-builtin (https://github.com/chameleon-team/cml-extplatform-demo/tree/master/packages/cml-demo-ui-builtin) 和cml-demo-ui

 (https://github.com/chameleon-team/cml-extplatform-demo/tree/master/packages/cml-demo-ui)。利用多态组件扩展(https://cml.js.org/doc/framework/polymorphism/component_extend.html) 语法,对原有组件库中的每一个组件进行新端的实现。

原有组件库中的组件也分为两种,一种为各端都有分别实现的多态组件,例如chameleon-ui-builtin中的button组件。实现起来新端基本上也是要单独实现。另一种例如chameleon-ui-builtin中的radio组件,各端的实现都是用的chameleon-ui-builtin/components/radio/radio.cml。所以新端基本也可以复用这个实现,还需要测试情况确实是否可以复用。

新端独立实现

例如:

编写 my-ui-builtin/components/button/button.interface

image.png

编写 my-ui-builtin/components/button/button.demo.cml

image.png




独立实现的my-ui-builtin/components/button/button.demo.cml文件属于多态组件(https://cml.js.org/doc/framework/polymorphism/component.html) 的灰度层,可以调用各端底层组件和 api,具体例子参见button (https://github.com/chameleon-team/chameleon-ui-builtin/tree/master/src/components/button) 和scroller(https://github.com/chameleon-team/chameleon-ui-builtin/tree/master/src/components/scroller) 的实现。


新端复用现有组件

编写 my-ui-builtin/components/radio/button.interface

image.png

实现 DSL 协议(编译时插件)

chameleon 内部会将整个项目文件编译为如下编译图结构,节点中的内容经过了标准编译,比如script节点的babel处理,style节点的less与stylus处理等等。

图片6.jpg

节点的数据结构如下:

image.png

用户只需要实现一个编译插件类 (https://github.com/chameleon-team/cml-extplatform-demo/blob/master/packages/cml-demo-plugin/index.js),利用钩子方法实现对节点的编译,所有节点编译完后再进行文件的组织。编译类如下:

image.png

实现框架协议

运行时主要是对 cml 文件的逻辑对象进行适配,chameleon 内部将 cml 文件的逻辑对象分为三类 App、Page、Component。对应会调用用户运行时 npm 包的createApp、createPage、createComponent方法,所以对外只需要实现这三个方法。

例如一个 Page 的逻辑对象如下:

image.png

编译时就会自动插入cml-demo-runtime处理逻辑对象的方法:

image.png

createApp、createPage、createComponent方法,参考cml-demo-runtime(https://github.com/chameleon-team/cml-extplatform-demo/tree/master/packages/cml-demo-runtime) 的结构进行实现,需要include chameleon-runtime中相应的接口进行实现,才能够实现对chameleon-runtime的扩展。用户的工作量主要在于对逻辑对象的处理,可以参考chameleon-runtime(https://github.com/chameleon-team/chameleon-runtime/tree/master/src/interfaces) 中的实现方式,一般需要大量的适配工作,比如输入Options对象的适配、跨端运行时能力注入等等。

例如: createPage 方法的实现

image.png

扩展新端 demo 示例仓库:https://github.com/chameleon-team/cml-extplatform-demo。实现了微信端的基本扩展,用户可以以此为模板进行开发,也期待更多的人加入开源。

注:本文涉及的示例代码均是伪代码。


banner.jpg

公司简介

   中城投丝路核心团队为打造互联网、数字城市优质平台汇聚全球行业精英,孵化创建了福建鹏枫智能科技(关注数字城市细分行业应用,如:交通、水利环保等)、181科技(物联网传感平台),为促进数字文化交流还成立了鑫智会联盟中心(在数字六年经验以上的行业先驱组成的智库)。我们为每一位合作伙伴、更为加入团队的每位人才精英提供更为广阔的施展舞台、职业能力锻炼机遇。

查看更多

联系我们

  •  福州大学城闽江学院
  •  北京市庙城镇293号院2号(总部)
  •  福清市福建师范大学
  •  联系电话:0591-8786-1210
  •  手机:18050166663
  •  3058661698@qq.com
  •  http://www.chinazspeed.com