写点什么

Chameleon 跨端框架源码剖析系列 (一):框架概览

  • 2020-04-18
  • 本文字数:2947 字

    阅读完需:约 10 分钟

Chameleon跨端框架源码剖析系列(一):框架概览

1 前言

近几年随着移动互联网的发展,尤其各个端平台推出了小程序入口,比如微信、支付宝、头条等,不同端平台之间的语法规范不统一,代码组织结构复杂,开发者早期应对同样的业务需求,需要在各端平台上各自维护一套代码,开发成本高,难以满足高效快速的日常维护。对于开发效率上的极致追求,使得"一次编写,到处运行"的跨端融合述求在前端领域里进一步提高。从本质上讲,跨端融合就是统一多端开发模式,增加代码复用,降低开发成本、保证多端一致性的体验。


目前前端领域已发展出多种不同的跨端解决方案,比如 Chameleon、Taro、Mpvue 等,这些跨端解决方案的核心解决思路是一致的,基本上都是编译+runtime 运行时的解决模式。编译指的是利用 Babel 的编译能力和 WebPack 提供的 loader、plugin 等构建能力,对源代码进行一系列分析流程之后,对原始代码进行优化并根据不同的端平台转换,最终得到目标代码。



runtime 指的是各个解决方案转换成各目标代码所需要的运行时依赖。不同跨端解决方案在 runtime 的实现细节和具体功能上存在一定的差异性,这里不一一列举。


在各个跨端解决方案中,Chameleon(简写 CML )是一款真正专注于让一套代码运行多端的跨端框架,始终秉承 “一套代码运行多端,一端所见即多端所见” 的初心,多端高度一致,无需关注各端的文档。目前 CML 已经成功扩展支持全平台小程序(微信、支付宝、百度、qq、头条),未来更会扩展到更多的端平台应用。本系列教程主要介绍 Chameleon 跨端框架背后的实现机制,针对源码进行深度剖析,系统分析了整个跨端框架背后的基本原理,包括:CML 的命令行注册运行、WebPack 配置、路由实现、模板解析能力、工程化配置方案、核心编译加载器 loader 和插件 plugin、分包实现等。整个系列教程最好和 CML 的源码配合,读者需要先了解整个的 CML 的整体架构和断点开发调试。

2 整体架构

CML 基于底层的打包构建工具,配合 chamleon-runtime 运行时和统一的多端接口 chammeleon-api, 将通过统一的语言框架 + 统一的多态协议组合成的多端业务代码转换成多端目标代码。



整个 CML 源码主要可分为三个部分:打包构建、核心运行时、统一 API。

打包构建

仓库地址:https://github.com/didi/chameleo


打包构建仓库的 packages 文件夹中主要包含了构建 CML 项目时所依赖的 npm 模块,比如:chameleon-tool 脚手架、webpack 构建时所需要的 loader 和 plugin、数据 mock 服务等。CML 通过 webpack 构建工具,对统一的语言.cml 文件解析,对解析后 template、script、style 部分分别引入不同的依赖模块和特殊的端处理模块,最终将原始的 cml 代码转换成目标各端代码。



每个构架依赖包在 CML 项目构建环节中都充当不同的作用,这里先整理了构建仓库中比较核心的 npm 模块包作用,后续的系列教程也会对涉及到的依赖包进行详细剖析。



构建依赖包众多,每个依赖包可能会互相引用,使用 npm link 将每个依赖包放到全局 node_modules 中使用,将会整个仓库维护起来特别繁琐。所以构建仓库使用了基于 lerna 的基本工作流,解决 packages 中不同包相互依赖的问题。


学习 lerna 可以查阅如下资料:lerna 管理前端 packages 的最佳实践(https://juejin.im/post/5a989fb451882555731b88c2)

核心运行时

仓库地址:https://github.com/chameleon-team/chameleon-runtime


核心运行时仓库是 CML 转换后目标各端代码在各端运行时所需要相关代码,独立于打包构建仓库。开发者在使用如下命令初始化项目时,整个业务项目会依赖 chameleon-runtime 提供的运行时的能力


cml init
复制代码


chameleon-runtime 对外导出以外方法,供构建仓库中的 chameleon-tool 使用:


  • bootstrap 启动应用

  • createApp 创建 App

  • createPage 创建页面

  • createComponent 创建组件


后续的系列教程也会涉及到整个运行时进行详细剖析。

统一 API

仓库地址:https://github.com/chameleon-team/chameleon-api


本仓库为 chameleon 的 api 的相关代码,chameleon 支持大量基础 API,对外提供统一的接口,以模块的方式引入 chameleon-api 进行使用。查阅接口及扩展文档:https://cmljs.org/doc/api/api.html

3 断点开发调试

阅读源码无法避免进行断点开发调试。断点调试方案主要使用如下两种方案:利用 v8 自带的检查器连接 chrome 进行调试和利用 IDE(VsCode)工具进行调试

利用 v8 自带的检查器连接 chrome 进行调试

整体脚手架调试都是基于 Node 层面进行调试,Node 的 V8 检查器集成允许将 Chrome 开发者工具附加到 Node.js 实例以进行调试和性能分析。如果开发者已经在全局安装了 chameleon-tool 构建工具,开发者即可在终端输入 cml -v 命令查看 CML 在全局环境的安装路由:


current running chameleon(/Users/didi/.nvm/versions/node/v10.16.3/lib/node_modules/chameleon-tool/)
复制代码


在当前项目下找到 chameleon.js 入口文件,将入口文件的如下内容取消注释,即可开始调试:


#! /usr/bin/env node// --inspect-brk
复制代码


更多的有关于 v8 自带的检查器连接 chrome 进行调试方案见 debugger Nodejs API 文档:http://nodejs.cn/api/debugger.html


优点: 便于基于已有的项目快速进行调试 chameleon-tool


缺点: 对于 chameleon-tool 所依赖的模块包无法快速切换调试;容易对已有正确的 chameleon-tool 构建工具造成污染

利用 IDE(VsCode)自带的工具进行调试

1. 从远程仓库克隆到本地


git clone https://github.com/didi/chameleon.git
复制代码


2. 使用 VsCode 项目打开此项目,然后按照下图的步骤创建 launch.json



launch.json 的内容如下:


{  // 使用 IntelliSense 了解相关属性。  // 悬停以查看现有属性的描述。  // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387  "version": "0.2.0",  "configurations": [    {      "type": "node",      "request": "launch",      "name": "CML测试",      "program": "${workspaceFolder}/packages/chameleon-tool/chameleon.js",      "args": ["wx", "dev"],      "cwd": "/Users/didi/WorkSpace/hummer-dsl-cml-test"    }  ]}
复制代码


上面的 launch.json 中配置解析如下:


  • program 表示当前构建仓库的 chameleon-tool 的入口文件

  • args 表示要运行命令,读者可以改成其他运行命令

  • cwd 表示构建好的项目仓库地址,读者可以改成自己构建好的项目仓库地址


launch.json 配置好后,读者可以在克隆下来的本地构建仓库项目中随意增加断点,然后点击运行和调试按钮,即可进入调试。更多有关通过 VsCode 进行调试见 Debugging in Visual Studio Code(https://code.visualstudio.com/Docs/editor/debugging)

参考文献

github 地址

https://github.com/didi/chameleon

官网

https://cml.js.org/


作者介绍


阮榕城,滴滴高级软件开发工程师


我是阮榕城,热爱前端,热爱技术,不搞花里胡哨,踏踏实实敲代码。平时喜欢看看漫画,到处走走,吃不了辣的吃货。


本文转载自公众号普惠出行产品技术(ID:pzcxtech)。


原文链接


https://mp.weixin.qq.com/s/BJl54Hn2H2AoRyHH-jafmg


2020-04-18 14:033017

评论

发布
暂无评论
发现更多内容

ICT架构体系详细说明【3】

爱好编程进阶

程序员 后端开发

Swoole 定时器能实现毫秒级任务调度,你敢相信吗?

CRMEB

云图说|DDS读写两步走,带您领略只读节点的风采

华为云开发者联盟

数据库 华为云 读写分离 DDS

Hadoop05【命令操作】

爱好编程进阶

Java 程序员 后端开发

直播预告丨Hello HarmonyOS进阶课程第二课——计算机视觉

HarmonyOS开发者

HarmonyOS 图形图像 视觉开发

【IT运维】运维告警方式有哪些?哪个工具好用?

行云管家

服务器 IT运维 服务器运维

Connection reset

领创集团Advance Intelligence Group

Connection reset

RGB色彩空间

Loken

音视频 5月月更

【Linux深潜】详解Linux系统自身安全调优配置

沃趣科技

Linux

OpenHarmony 3GPP协议开发深度剖析——一文读懂RIL

OpenHarmony开发者

OpenHarmony RIL

大数据培训HBase读写性能优化的详解

@零度

大数据 HBase

跨端跨框架 UI 自动化测试方案 Flybirds

liang chen

AI驱动音乐创新,网易数帆X云音乐刷新MIREX世界纪录

网易数帆

人工智能 AI 语音识别 歌词识别 预练习

大咖说 X 智篆商业|未来五年:消费增长的“两大来源”与“四个方面”

大咖说

阿里云 存量时代 智篆商业

Hadoop 3

爱好编程进阶

Java 程序员 后端开发

如何开发 LAXCUS 分布式应用软件(二):基本构成

LAXCUS分布式操作系统

集群架构 并行计算 分布式操作系统 分布式应用

时序数据库为万物互联打下坚实的基石

华为云开发者联盟

数据仓库 物联网 时序数据库 GaussDB 时序数据

web前端培训React性能优化总结

@零度

前端开发 React

案例分享|一键式自动监测,跨境电商平台的业务转型模板

博睿数据

博睿数据 数据链DNA

我是如何做到百万数据跑批半小时结束

skow

后端 java

OpenMLDB官网升级,神秘贡献者地图带你快速进阶!

第四范式开发者社区

人工智能 机器学习 数据库 开源 特征

TASKCTL分布式任务调度平台-流程控制原理

敏捷调度TASKCTL

程序员 DevOps 分布式 大数据运维 TASKCTL

跟我学Python图像处理丨掌握4种图像平滑算法

华为云开发者联盟

Python OpenCV 图像属性 兴趣ROI区域 图像通道

OpenHarmony布道师招募正式启动,打造个人技术影响力的机会来了!

科技汇

升级HarmonyOS 2最新版本,出门亮健康码快人一步!

科技汇

java培训Redis数据结构面试分享

@零度

redis JAVA开发

CWE 4.7中的新视图:工业控制系统的安全漏洞类别

华为云开发者联盟

安全漏洞 cwe 软件安全 CWE 4.7 工业控制系统

【等保测评】2022年深圳等保测评公司排名看这里!

行云管家

等保 深圳 等保测评 等保2.0

十年磨一剑|沃趣数据库云产品战略首发

沃趣科技

云原生 公有云 私有云 数据库云 沃趣科技

火山引擎入选“2022 中国边缘计算20强”榜单

火山引擎边缘云

边缘计算

数据增强(一):imgaug

AIWeker

人工智能 深度学习 数据增强 5月月更

Chameleon跨端框架源码剖析系列(一):框架概览_移动_阮榕城_InfoQ精选文章