热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Chameleon开放跨端扩展标准协议

新框架太多?学不动啦?有这一套跨端标准,今后再也不用学习新框架了。各个小程序按自己喜好“各自为政”?有了这套标准,再也不用重复开发各种新平台啦。如今前端比较流行的ReactNative、Weex、Flutter等跨平台开发框架,对于开发来说属于技术方案的选择,比如,我们会考虑用这个技术开发,性能会不会超过h5,开发效率会不会超过原生开发等等。

新框架太多?学不动啦?有这一套跨端标准,今后再也不用学习新框架了。

各个小程序按自己喜好“各自为政”?有了这套标准,再也不用重复开发各种新平台啦。

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

但是从 2017 年微信推出小程序,到至今各大厂商都推出自己的小程序,跨端开发就不仅仅是技术的问题了。已经变成了必争的流量入口。现在的小程序大战像极了当前的浏览器大战。大战中受苦的是我们一线开发者,同样的应用要开发 N 次,面对了前所未有的挑战,所以跨端框架的产生是大趋势下的必然产物。

chameleon 基于对跨端工作的积累, 规范了一套跨端标准,称之为 MVVM+协议;开发者只需要按照标准扩展流程,即可快速扩展任意 MVVM 架构模式的终端。并让已有项目无缝运行新端。所以如果你希望让 chameleon 快速支持淘宝小程序、React Native?只需按标准实现即可扩展。

最终让开发者只需要用 chameleon 开发,就可以在任意端运行,再也不用学习新平台框架啦。

新端接入情况

滴滴、芒果 TV、阿里的同学合作,正在按照跨端协议流程进行 字节跳动小程序 的共建开发。

  • 分工排期如下: github.com/didi/chamel…
  • 仓库地址: github.com/chameleon-t…

快应用官方研发团队 也正在接入中

  • 分工排期如下: github.com/didi/chamel…
  • 仓库地址: github.com/quickappcn/…

跨端原理

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

Chameleon 开放跨端扩展标准协议

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

跨端标准协议

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

Chameleon 开放跨端扩展标准协议

  • API 接口协议:定义基础接口能力标准。
  • 内置组件协议:定义基础 UI 组件标准。
  • 框架协议:定义生命周期、路由等框架标准。
  • DSL 协议:定义视图和逻辑层的语法标准。
  • 多态实现协议:定义允许用户使用差异化能力标准。

Chameleon 开放跨端扩展标准协议

如何扩展新端?

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

Chameleon 开放跨端扩展标准协议

实现 API 接口协议

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

 
 

用户实现的 interface 文件中采用 语法引入 chameleon-apialert 方法的 interface 文件, 实现 uiInterface

// 引入官方标准interface文件

// 扩展实现新端(以头条小程序为例,假设端扩展标识为:tt)

实现内置组件协议

组件分为内置组件 chameleon-ui-builtin 和扩展组件 cml-ui 。所以用户需要创建两个 npm 包分别实现这两个组件库,结构参考 cml-demo-ui-builtin 和 cml-demo-ui 。利用多态组件扩展语法,对原有组件库中的每一个组件进行新端的实现。

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

新端独立实现

例如:

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

// 引入官方标准interface文件

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





独立实现的 my-ui-builtin/components/button/button.demo.cml 文件属于多态组件的灰度层,可以调用各端底层组件和 api,具体例子参见 button 和 scroller 的实现。

新端复用现有组件

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

// 引入官方标准interface文件

// 复用官方的实现

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

chameleon 内部会将整个项目文件编译为如下编译图结构,节点中的内容经过了标准编译,比如 script 节点的 babel 处理, style 节点的 lessstylus 处理等等。  Chameleon 开放跨端扩展标准协议

节点的数据结构如下:

class CMLNode {
  constructor(optiOns= {}) {
    this.realPath; // 文件物理地址  会带参数
    this.moduleType; // template/style/script/json/asset
    this.dependencies = []; // 该节点的直接依赖       app.cml依赖pages.cml pages.cml依赖components.cml js依赖js
    this.childrens = []; // 子模块 cml文件才有子模块
    this.source; // 模块源代码
    this.output; // 模块输出  各种过程操作该字段
    ......
  }
}

用户只需要实现一个 编译插件类 ,利用钩子方法实现对节点的编译,所有节点编译完后再进行文件的组织。编译类如下:

module.exports = class DemoPlugin {
  constructor(options) {
    ......
  }
  /**
   * @description 注册插件
   * @param {compiler} 编译对象
   * */
  register(compiler) {
    // 编译script节点,比如做模块化
    compiler.hook('compile-script', function(currentNode, parentNodeType) {
    })
    // 编译template节点 语法转义
    compiler.hook('compile-template', function(currentNode, parentNodeType) {
    })
    // 编译style节点  比如尺寸单位转义
    compiler.hook('compile-style', function(currentNode, parentNodeType) {
    })
    // 编译结束进入打包阶段
    compiler.hook('pack', function(projectGraph) {
      // 遍历编译图的节点,进行各项目的拼接
      // 调用writeFile方法写入文件
      // compiler.writeFile()
    })
    ......
  }
}

实现框架协议

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

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

class PageIndex {
  data = {
    name: 'chameleon'
  }
  computed = {
    sayName () {
      return 'Hello' + this.name;
    }
  }
  mounted() {
  }
}
export default new PageIndex();

编译时就会自动插入用户的运行时方法处理逻辑对象,例如 cml-demo-runtime

class PageIndex {
  ......
}
export default new PageIndex();

// 编译时自动插入用户配置的运行时方法
import {createPage} from 'cml-demo-runtime';
createPage(exports.default);

createApp、createPage、createComponent 方法,参考 cml-demo-runtime 的结构进行实现,需要 include chameleon-runtime 中相应的接口进行实现,才能够实现对 chameleon-runtime 的扩展。用户的工作量主要在于对逻辑对象的处理,可以参考 chameleon-runtime 中的实现方式,一般需要如下方面的适配工作。

从宏观来看,运行时处理可分为:

  • 输入Options对象的适配, 参考
  • 跨端运行时能力注入, 参考

从微观来看,有以下处理:

  • 生命周期: 映射表参考 和 实现参考
  • 组件 props 属性: 适配参考 和 变化监听参考
  • 数据响应: 数据响应实现参考
  • computed 计算能力: 实现参考
  • watch 监听能力: 适配参考 和 实现参考
  • methods 方法属性: 适配参考
  • mixins 能力: 适配参考 和 合并参考
  • 生命周期多态

例如: createPage 方法的实现



实现框架数据管理

chameleon-store 提供了类似 Vuex 的数据管理解决方案,具体标准参见数据管理。同样利用多态协议实现其功能。

更多

  • 扩展新端 demo 示例仓库: github.com/chameleon-t… 。实现了微信端的基本扩展,用户可以以此为模板进行开发。

  • 更详细的教程参见扩展新端操作教程。

期待更多的人加入开源。想了解更多 chameleon 信息请访问官网cmljs.org

预告:chameleon 1.0正式版即将到来


以上所述就是小编给大家介绍的《Chameleon 开放跨端扩展标准协议》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 我们 的支持!


推荐阅读
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • PHP反射API的功能和用途详解
    本文详细介绍了PHP反射API的功能和用途,包括动态获取信息和调用对象方法的功能,以及自动加载插件、生成文档、扩充PHP语言等用途。通过反射API,可以获取类的元数据,创建类的实例,调用方法,传递参数,动态调用类的静态方法等。PHP反射API是一种内建的OOP技术扩展,通过使用Reflection、ReflectionClass和ReflectionMethod等类,可以帮助我们分析其他类、接口、方法、属性和扩展。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • Question该提问来源于开源项目:react-native-device-info/react-native-device-info ... [详细]
  • mysqldinitializeconsole失败_mysql03误删除了所有用户解决办法
    误删除了所有用户解决办法第一种方法(企业常用)1.将数据库down掉[rootdb03mysql]#etcinit.dmysqldstopShuttingdownMySQL..SU ... [详细]
  • 工作经验谈之-让百度地图API调用数据库内容 及详解
    这段时间,所在项目中要用到的一个模块,就是让数据库中的内容在百度地图上展现出来,如经纬度。主要实现以下几点功能:1.读取数据库中的经纬度值在百度上标注出来。2.点击标注弹出对应信息。3 ... [详细]
  • 寻求更强大的身份和访问管理(IAM)平台的企业正在转向云,并接受身份即服务(IDaaS)的灵活性。要为IAM选择正确的场外解决方案,业务管理人员和IT专业人员必须在实施之前评估安全 ... [详细]
author-avatar
gjfeh46999
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有