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

【重磅】Chameleon开放跨端扩大规范协定

新框架太多?学不动啦?有这一套跨端范例,以后再也不必进修新框架了。各个小顺序按本身喜欢“各不相谋”?有了这套范例,再也不必反复开辟种种新平台啦。如今前端比较盛行的ReactNati

新框架太多?学不动啦?有这一套跨端范例,以后再也不必进修新框架了。

各个小顺序按本身喜欢“各不相谋”?有了这套范例,再也不必反复开辟种种新平台啦。

如今前端比较盛行的 React Native、Weex、Flutter 等跨平台开辟框架,关于开辟来讲属于手艺计划的挑选,比方,我们会斟酌用这个手艺开辟,机能会不会凌驾 h5,开辟效力会不会凌驾原生开辟等等。

然则从 2017 年微信推出小顺序,到至今各大厂商都推出本身的小顺序,跨端开辟就不仅仅是手艺的问题了。已变成了必争的流量进口。如今的小顺序大战像极了当前的浏览器大战。大战中刻苦的是我们一线开辟者,一样的运用要开辟 N 次,面对了亘古未有的应战,所以跨端框架的发生是大趋势下的必定产品。

chameleon 基于对跨端事情的积聚, 范例了一套跨端范例,称之为 MVVM+协定;开辟者只须要依据范例扩大流程,即可疾速扩大恣意 MVVM 架构形式的终端。并让已有项目无缝运转新端。所以假如你愿望让 chameleon 疾速支撑淘宝小顺序、React Native?只需按范例完成即可扩大。

终究让开辟者只须要用 chameleon 开辟,就能够在恣意端运转,再也不必进修新平台框架啦。

新端接入状况

滴滴、芒果 TV、阿里的同砚协作,正在依据跨端协定流程举行字节跳动小顺序的共建开辟。

  • 分工排期以下:https://github.com/didi/chame…
  • 堆栈地点: https://github.com/chameleon-…

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

  • 分工排期以下:https://github.com/didi/chame…
  • 堆栈地点: https://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 示例堆栈: https://github.com/chameleon-…。 完成了微信端的基础扩大,用户能够以此为模板举行开辟。
  • 更细致的教程拜见扩大新端操纵教程。

期待更多人的到场开源。想相识更多 chameleon 信息请接见官网 cmljs.org

预报:chameleon 1.0正式版行将到来


推荐阅读
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 本文详细介绍了 Java 网站开发的相关资源和步骤,包括常用网站、开发环境和框架选择。 ... [详细]
  • 本文详细介绍了 com.apollographql.apollo.api.internal.Optional 类中的 orNull() 方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 本文将介绍如何在混合开发(Hybrid)应用中实现Native与HTML5的交互,包括基本概念、学习目标以及具体的实现步骤。 ... [详细]
  • javax.mail.search.BodyTerm.matchPart()方法的使用及代码示例 ... [详细]
  • WinMain 函数详解及示例
    本文详细介绍了 WinMain 函数的参数及其用途,并提供了一个具体的示例代码来解析 WinMain 函数的实现。 ... [详细]
  • com.sun.javadoc.PackageDoc.exceptions()方法的使用及代码示例 ... [详细]
  • 本文探讨了资源访问的学习路径与方法,旨在帮助学习者更高效地获取和利用各类资源。通过分析不同资源的特点和应用场景,提出了多种实用的学习策略和技术手段,为学习者提供了系统的指导和建议。 ... [详细]
  • 在处理遗留数据库的映射时,反向工程是一个重要的初始步骤。由于实体模式已经在数据库系统中存在,Hibernate 提供了自动化工具来简化这一过程,帮助开发人员快速生成持久化类和映射文件。通过反向工程,可以显著提高开发效率并减少手动配置的错误。此外,该工具还支持对现有数据库结构进行分析,自动生成符合 Hibernate 规范的配置文件,从而加速项目的启动和开发周期。 ... [详细]
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • 本文详细介绍了 Pentaho Kettle 中 RowMetaInterface.writeMeta 方法的使用,并提供了多个代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 深入解析Java虚拟机的内存分区与管理机制
    Java虚拟机的内存分区与管理机制复杂且精细。其中,某些内存区域在虚拟机启动时即创建并持续存在,而另一些则随用户线程的生命周期动态创建和销毁。例如,每个线程都拥有一个独立的程序计数器,确保线程切换后能够准确恢复到之前的执行位置。这种设计不仅提高了多线程环境下的执行效率,还增强了系统的稳定性和可靠性。 ... [详细]
  • Hadoop平台警告解决:无法加载本机Hadoop库的全面应对方案
    本文探讨了在Hadoop平台上遇到“无法加载本机Hadoop库”警告的多种解决方案。首先,通过修改日志配置文件来忽略该警告,这一方法被证明是有效的。其次,尝试指定本地库的路径,但未能解决问题。接着,尝试不使用Hadoop本地库,同样没有效果。然后,通过替换现有的Hadoop本地库,成功解决了问题。最后,根据Hadoop的源代码自行编译本地库,也达到了预期的效果。以上方法适用于macOS系统。 ... [详细]
  • Dense Matrix Inversion Results in Segmentation Fault: Causes and Solutions ... [详细]
author-avatar
宁波南诚装饰_886
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有